Lompati ke konten utama
Modul 5 · Pelajaran 3 dari 419/57 dalam kursus~10 min
Pelajaran modul (3/4)

OUTER JOIN: menemukan "celah"

Di Modul 3 Anda melihat LEFT JOIN: pertahankan semua baris di sebelah kiri, bahkan baris tersebut tanpa kecocokan di sebelah kanan (yang menjadi NULL). Dalam bab ini kita perluas toolkit dengan RIGHT JOIN dan FULL OUTER JOIN, dan kita belajar cara menggunakannya untuk menemukan "lubang" dalam data: baris dalam satu tabel itu tidak memiliki tandingan di sisi lain.

Tiga jenis OUTER JOIN

SQL
A LEFT  JOIN B  ON …  -- tutte le righe di A, con o senza match in B
A RIGHT JOIN B  ON …  -- tutte le righe di B, con o senza match in A
A FULL  JOIN B  ON …  -- tutte le righe di A *e* di B; NULL dove non c'è match

A RIGHT JOIN B selalu dapat ditulis ulang menjadi B LEFT JOIN A dengan yang sama ON: ini masalah keterbacaan. Banyak gaya (termasuk kursus ini) lebih memilih untuk selalu menggunakan LEFT JOIN untuk konsistensi.

Pola "anti-gabung": menemukan yang hilang

Penggunaan LEFT JOIN yang paling umum bukanlah "memperkaya dengan data di kanan", tetapi temukan baris di sebelah kiri yang TIDAK cocok dengan baris tersebut benar. Ini disebut anti-gabung:

SQL
-- Prodotti senza nessuna recensione:
SELECT p.id, p.name
FROM   products p
LEFT JOIN reviews r ON r.product_id = p.id
WHERE  r.id IS NULL
ORDER BY p.id;

Logika pola:

  1. LEFT JOIN melampirkan review masing-masing produk, jika ada;
  2. untuk produk tanpa review, seluruh kolom r adalah NULL;
  3. WHERE r.id IS NULL hanya menyimpan produk tersebut.

Pemeriksaan kunci: id IS NULL pada kolom NOT NULL di tabel sebelah kanan berarti "tidak ada kecocokan". Anda sering memfilter pada PK sebelah kanan tabel justru karena alasan ini.

GABUNG LUAR LENGKAP

FULL OUTER JOIN menjaga kedua sisi tanpa kecocokan. Jarang digunakan, biasanya untuk pemeriksaan integritas data:

SQL
SELECT c.id AS customer_id, o.id AS order_id
FROM   customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id
WHERE  c.id IS NULL OR o.id IS NULL;

Baris dengan c.id IS NULL akan menjadi pesanan yatim piatu (customer_id yang tidak ada di customers). Mereka yang memiliki o.id IS NULL adalah pelanggan tanpa perintah. Pada kumpulan data kami, kunci asing menjamin tidak ada anak yatim pesanan ada; hanya pelanggan tanpa pesanan yang tersisa.

Cobalah sendiri

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

Ada banyak hal dalam produk yang tidak pernah saya terima dari sebuah resensi. Nama Mostra solo la colonna. Ordina per nama.

Memuat editor…
Tunjukkan petunjuk

Pola anti-gabung: LEFT JOIN review su product_id, poi WHERE r.id IS NULL.

Solusi tersedia setelah 3 upaya

Tinjau latihan

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

Saya menemukan klien yang tidak memiliki pesanan lebih lanjut. Email paling banyak. Urutan per email.

Memuat editor…
Tunjukkan petunjuk

Pola yang sama dari layanan sebelumnya, tetapi dari pelanggan dan pesanan.

Solusi tersedia setelah 3 upaya