Pelajaran modul (4/4)
UNION, INTERSECT, KECUALI (dan CROSS JOIN)
Sejauh ini Anda telah menggabungkan data secara horizontal: JOIN melampirkan kolom
dari baris terkait. SQL juga menawarkan keluarga operator lain yang
menggabungkan data secara vertikal, memperlakukan hasil dua SELECT sebagai
set: UNION, INTERSECT, EXCEPT. Kami juga mengunjungi kembali CROSS JOIN, the
produk kartesius.
CROSS JOIN: setiap baris dengan setiap baris
CROSS JOIN tidak memiliki ON: ia menghasilkan setiap kemungkinan kombinasi dari
baris antara dua tabel (perkalian kartesius). Jika A memiliki n baris dan B
memiliki m baris, hasilnya n × m.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 pelanggan × 16 produk = 192 baris. Ini jarang digunakan pada data nyata (itu mahal!), tetapi berguna untuk:
- menghasilkan kombinasi "semua melawan semua" (misalnya matriks kompatibilitas);
- memasangkan tabel dengan tabel kecil konstanta/parameter.
UNION dan UNION SEMUA
UNION menambahkan hasil dua SELECT dengan nomor dan
jenis kolom:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Aturan:
- kedua
SELECTharus memiliki jumlah kolom yang sama, dengan kompatibel jenis; UNION(tanpaALL) menghapus duplikat — secara efektif melakukanDISTINCTpada hasil akhir;UNION ALLjuga menyimpan duplikat, dan jauh lebih cepat karena menghindari pengurutan/hash untuk deduplikasi.
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM customers c JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.email
FROM customers c JOIN reviews r ON r.customer_id = c.id;BERSINTANG dan KECUALI
INTERSECT mempertahankan hanya baris yang ada di kedua hasil; EXCEPT
menyimpan baris pertama yang tidak ada di baris kedua (set
"perbedaan").
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;
-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT dan EXCEPT juga menghapus duplikat secara default; itu
Varian INTERSECT ALL / EXCEPT ALL tidak.
Cobalah sendiri
Temukan semua email klien yang telah menerima pesanan OPPURE recensito qualcosa (tidak ada duplikat). Satu titik dua: email. Urutan per email.
Tunjukkan petunjuk
UNION antara dua SELECT yang mengembalikan kolom email yang sama. ORDER BY berada di bagian akhir, pada hasil akhir.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Temukan email klien yang pesanannya bukan yang terbaru. AS KECUALI. Satu titik dua: email. Urutan per email.
Tunjukkan petunjuk
EXCEPT hanya menyimpan baris dari SELECT kiri yang tidak ada di baris kanan.
Solusi tersedia setelah 3 upaya