Lompati ke konten utama
Modul 5 · Pelajaran 4 dari 420/57 dalam kursus~12 min
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.

SQL
-- 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:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

Aturan:

  • kedua SELECT harus memiliki jumlah kolom yang sama, dengan kompatibel jenis;
  • UNION (tanpa ALL) menghapus duplikat — secara efektif melakukan DISTINCT pada hasil akhir;
  • UNION ALL juga menyimpan duplikat, dan jauh lebih cepat karena menghindari pengurutan/hash untuk deduplikasi.
SQL
-- 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").

SQL
-- 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

Latihan#sql.m5.l4.e1
Upaya: 0Memuat…

Temukan semua email klien yang telah menerima pesanan OPPURE recensito qualcosa (tidak ada duplikat). Satu titik dua: email. Urutan per email.

Memuat editor…
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

Latihan#sql.m5.l4.e2
Upaya: 0Memuat…

Temukan email klien yang pesanannya bukan yang terbaru. AS KECUALI. Satu titik dua: email. Urutan per email.

Memuat editor…
Tunjukkan petunjuk

EXCEPT hanya menyimpan baris dari SELECT kiri yang tidak ada di baris kanan.

Solusi tersedia setelah 3 upaya