Dalam SQL, UNION
klausa menggabungkan hasil dua kueri menjadi satu set hasil.
Anda dapat menggunakan UNION
klausa dengan atau tanpa ALL
argumen:
UNION ALL
– Termasuk duplikat.UNION
– Tidak termasuk duplikat.
Berikut adalah beberapa contoh dasar untuk mendemonstrasikan cara kerjanya.
Tabel Contoh
Misalkan kita memiliki dua tabel:Cats
dan Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Kita dapat menggunakan SELECT
pernyataan dengan UNION
klausa untuk menggabungkan hasil dari kedua tabel menjadi satu kumpulan hasil.
Contoh menggunakan UNION ALL
Pertama, mari kita gunakan UNION ALL
sehingga termasuk duplikat.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Hasil:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
Dalam hal ini, tujuh baris dikembalikan. Kita dapat melihat bahwa "Ambil" dikembalikan dua kali. Ini karena ada dua anjing bernama Fetch.
Ada juga kucing dan anjing dengan nama yang sama:Fluffy.
Perhatikan bahwa saya menggunakan alias kolom untuk memberi nama bidang yang dikembalikan oleh operasi. Jika saya tidak melakukannya, hasilnya akan menggunakan nama kolom dari kueri pertama. Dalam hal ini, tajuk kolom akan disebut DogName
bukannya PetName
.
SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Hasil:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
Ini mungkin atau mungkin tidak dapat diterima, tergantung pada data yang Anda kembalikan dalam kueri Anda. Dalam kasus kami, itu tidak tepat, karena tidak semua hasil adalah anjing.
Contoh menggunakan UNION
Mari kita lihat apa yang terjadi ketika kita menghapus ALL
argumen.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Hasil:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Kali ini hanya lima baris yang dikembalikan. Kedua duplikat dihapus.
UNION
vs DISTINCT
Perhatikan bahwa ini berbeda dengan menerapkan DISTINCT
untuk setiap individu SELECT
penyataan. Jika kita melakukannya, Fluffy akan dikembalikan dua kali, karena ALL
hanya akan berlaku untuk SELECT
pernyataan bahwa itu diterapkan (bukan pada hasil gabungan).
Berikut ini contoh untuk menggambarkan apa yang saya maksud.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Hasil:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
Semua Kueri harus Mengembalikan Jumlah Kolom yang Sama
Saat Anda menggunakan UNION
klausa, setiap kueri harus memiliki jumlah kolom yang sama, dan urutannya harus sama.
Jika tidak, Anda akan mendapatkan kesalahan.
SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;
Hasil:
Msg 205, Level 16, State 1, Line 1 All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
Itulah kesalahan yang dikembalikan SQL Server saat menggunakan jumlah kolom yang tidak sama. Kesalahan khusus ini menunjukkan bahwa pembatasan yang sama juga berlaku untuk INTERSECT
dan EXCEPT
operator. Pesan kesalahan yang Anda terima mungkin berbeda, tergantung pada DBMS Anda.
Tipe Data harus Kompatibel
Selain membutuhkan jumlah kolom yang sama, kolom tersebut harus memiliki tipe data yang kompatibel.
Mereka tidak harus memiliki tipe data yang sama, tetapi mereka harus kompatibel. Artinya, mereka harus kompatibel melalui konversi implisit. Jika tipe data tidak cocok, DBMS harus dapat melakukan konversi implisit agar cocok.
Jika tidak, Anda akan mendapatkan kesalahan.
SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;
Hasil:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Meow' to data type int.
Mengurutkan Hasil
Jika Anda ingin mengurutkan hasil dengan ORDER BY
klausa, Anda harus meletakkannya di kueri terakhir. Anda tidak dapat menempatkan ORDER BY
secara terpisah klausa pada setiap kueri, atau dalam hal ini, kueri apa pun yang bukan yang terakhir.
Inilah kesalahan yang saya dapatkan ketika mencoba melakukannya di SQL Server:
SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;
Hasil:
Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'UNION'.
Oleh karena itu, jika kita ingin mengurutkan hasilnya, kita perlu melakukan sesuatu seperti ini:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;
Menerapkan UNION
ke Lebih dari dua Pertanyaan
Contoh sebelumnya menggabungkan hasil dari dua kueri yang berbeda, tetapi tidak ada yang menghentikan Anda untuk menambahkan lebih banyak. Anda dapat menggunakannya untuk menggabungkan hasil dari banyak kueri jika diperlukan.
Misalnya, jika kita juga memiliki Birds
tabel, kita bisa melakukan ini:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;
Normalisasi
Contoh di halaman ini menempatkan kucing dan anjing ke dalam dua tabel terpisah. Alasan saya melakukan ini adalah karena ini adalah cara yang jelas dan ringkas untuk menggambarkan bagaimana UNION
bekerja.
Dalam praktiknya, Anda mungkin memiliki ini di tabel yang sama yang disebut, katakanlah Pets
, lalu buat PetTypes
separate yang terpisah tabel (atau serupa). Ini dikenal sebagai normalisasi, dan merupakan cara database relasional biasanya dirancang.
Anda kemudian dapat menjalankan gabungan pada tabel ini untuk mengembalikan data sesuai kebutuhan.