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.