Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Klausa SQL UNION untuk Pemula

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Microsoft DiskSpd untuk Menguji Subsistem Penyimpanan Anda

  2. Cara Memangkas String di SQL

  3. Kesalahan ORA-65048 saat mengubah kata sandi pengguna di basis data wadah (CDB)

  4. Penyimpanan Kueri:Menampilkan Dampak Indeks pada Sisipan

  5. Dasar-dasar Ekspresi Tabel, Bagian 13 – Fungsi Bernilai Tabel Sebaris, Lanjutan