Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Klausa UNION MySQL

Di MySQL, UNION klausa menggabungkan hasil dari beberapa kueri menjadi satu kumpulan hasil.

Contoh

Misalkan kita memiliki tabel berikut:

SELECT * FROM Teachers;
SELECT * FROM Students;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
+-----------+-------------+

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
|         6 | Bill        |
+-----------+-------------+

Kita dapat memasukkan UNION klausa antara dua SELECT pernyataan untuk mengembalikan semua guru dan siswa:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;

Hasil:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Nama kolom diambil dari SELECT pertama pernyataan.

Secara default, UNION klausa secara implisit menerapkan DISTINCT operasi. Dengan kata lain, ini hanya mengembalikan nilai yang berbeda secara default. Jadi hasil di atas hanya berisi satu masing-masing Warren, Cathy dan Bill. Ini terlepas dari fakta bahwa tabel gabungan sebenarnya berisi dua Warrens, dua Cathys, dan tiga Bills (ada dua guru bernama Cathy, seorang guru dan pelanggan bernama Warren, dan dua bernama Bill, serta satu siswa bernama Bill).

Berikut adalah contoh yang secara eksplisit menggunakan DISTINCT klausa:

SELECT TeacherName FROM Teachers
UNION DISTINCT
SELECT StudentName FROM Students;

Hasil:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Jadi kami mendapatkan hasil yang sama dengan yang kami dapatkan tanpa DISTINCT klausa.

Sertakan Duplikat

Kita dapat menggunakan ALL kata kunci untuk memasukkan nilai duplikat dalam hasil:

SELECT TeacherName FROM Teachers
UNION ALL
SELECT StudentName FROM Students;

Hasil:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Cathy       |
| Bill        |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
| Warren      |
| Bill        |
+-------------+

Kali ini kami mendapat dua belas baris, bukan delapan yang kami dapatkan dalam contoh pertama kami.

Kita dapat melihat bahwa kedua Cathys dikembalikan dan ketiga Bills dikembalikan.

TABLE Pernyataan

Dari MySQL 8.0.19 kita dapat menggunakan UNION klausa dengan TABLE penyataan.

Ini contohnya:

TABLE Teachers
UNION
TABLE Students;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
+-----------+-------------+

Itu setara dengan kueri berikut:

SELECT * FROM Teachers
UNION
SELECT * FROM Students;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
+-----------+-------------+

Anda akan melihat bahwa pernyataan ini mengembalikan lebih banyak baris daripada di contoh pertama kami sebelumnya. Itu karena kami memilih semua kolom dalam tabel, yang menghasilkan non-duplikat di mana sebelumnya ada duplikat. Misalnya, dua guru yang disebut Bill dikembalikan ke sini sedangkan hanya satu yang dikembalikan pada contoh sebelumnya. Itu karena TeacherId kolom berisi nilai yang berbeda, sehingga baris tidak duplikat.

Menggunakan ORDER BY Klausa dalam Union Query

Kita dapat menggunakan ORDER BY klausa di setiap SELECT pernyataan dan/atau pada gabungan UNION pertanyaan.

Di Setiap SELECT Pernyataan

Saat kami menggunakan ORDER BY klausa dalam individu SELECT pernyataan dalam UNION kueri, kita perlu menyertakan setiap SELECT pernyataan di dalam kurung:

(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2);

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         4 | Ein         |
+-----------+-------------+

Perhatikan bahwa ketika kita melakukan ini, itu tidak benar-benar memesan hasil untuk output. Itu hanya memesan hasil untuk tujuan menentukan subset dari baris yang dipilih untuk diambil ketika menerapkan LIMIT ayat.

Oleh karena itu, gunakan ORDER BY tanpa LIMIT klausa tidak berpengaruh pada output.

Di Seluruh UNION Kueri

Kami juga dapat menggunakan ORDER BY klausa pada seluruh kueri, sehingga seluruh keluaran diurutkan bersama.

Dalam contoh ini, kami mengambil contoh sebelumnya dan mengurutkan hasil gabungan:

(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2)
ORDER BY TeacherName DESC;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         4 | Ein         |
|         5 | Bill        |
|         6 | Bill        |
|         2 | Ben         |
+-----------+-------------+

Bahkan saat tidak menggunakan ORDER BY klausa dalam setiap SELECT pernyataan, setiap SELECT pernyataan harus tetap dalam tanda kurung, dan ORDER BY klausa (atau LIMIT klausa) harus setelah yang terakhir.

(SELECT * FROM Teachers)
UNION
(SELECT * FROM Students)
ORDER BY TeacherName ASC;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         3 | Cathy       |
|         4 | Cathy       |
|         4 | Ein         |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         1 | Warren      |
|         5 | Warren      |
+-----------+-------------+

Ingat, menghilangkan tanda kurung menghasilkan hasil yang sama dengan yang ada tanda kurung:

SELECT * FROM Teachers
UNION
SELECT * FROM Students
ORDER BY TeacherName ASC;

Hasil:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         3 | Cathy       |
|         4 | Cathy       |
|         4 | Ein         |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         1 | Warren      |
|         5 | Warren      |
+-----------+-------------+

Perhatikan bahwa jika kolom yang akan diurutkan menggunakan alias, maka kolom tersebut harus direferensikan dengan aliasnya (bukan nama kolom).

Contoh:

(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY t ASC;

Hasil:

+--------+
| t      |
+--------+
| Ben    |
| Bill   |
| Cathy  |
| Ein    |
| Faye   |
| Jet    |
| Spike  |
| Warren |
+--------+

Inilah yang terjadi jika kita tidak menggunakan alias:

(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY TeacherName ASC;

Hasil:

ERROR 1054 (42S22): Unknown column 'TeacherName' in 'order clause'

Jumlah Kolom

Jumlah kolom yang dikembalikan oleh setiap SELECT pernyataan harus sama. Oleh karena itu, kami tidak dapat melakukan hal berikut:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;

Hasil:

ERROR 1222 (21000): The used SELECT statements have a different number of columns

Tipe Data

Kolom yang dipilih terdaftar di posisi yang sesuai dari setiap SELECT pernyataan harus memiliki tipe data yang sama. Namun, jika tidak, jenis dan panjang kolom di UNION hasil memperhitungkan nilai yang diambil oleh semua SELECT pernyataan.

Inilah yang terjadi jika kita mencoba menggabungkan TeacherName kolom dengan StudentId kolom:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;

Hasil:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| 1           |
| 2           |
| 3           |
| 4           |
| 5           |
| 6           |
+-------------+

Beberapa RDBMS lain akan menghasilkan kesalahan dalam hal ini, tetapi MySQL berhasil menghasilkan keluaran tanpa kesalahan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tingkatkan MySQL ke MariaDB 10 (Bagian 1 – Instal MariaDB 5.5)

  2. Menggunakan tampilan MySQL

  3. MySQL - UPDATE query berdasarkan SELECT Query

  4. Solusi DBaaS Terbaik untuk MySQL

  5. MySQL SELECT LIKE atau REGEXP untuk mencocokkan beberapa kata dalam satu catatan