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
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'è matchA 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:
-- 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:
LEFT JOINmelampirkan review masing-masing produk, jika ada;- untuk produk tanpa review, seluruh kolom
radalahNULL; WHERE r.id IS NULLhanya 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:
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
Ada banyak hal dalam produk yang tidak pernah saya terima dari sebuah resensi. Nama Mostra solo la colonna. Ordina per nama.
Tunjukkan petunjuk
Pola anti-gabung: LEFT JOIN review su product_id, poi WHERE r.id IS NULL.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Saya menemukan klien yang tidak memiliki pesanan lebih lanjut. Email paling banyak. Urutan per email.
Tunjukkan petunjuk
Pola yang sama dari layanan sebelumnya, tetapi dari pelanggan dan pesanan.
Solusi tersedia setelah 3 upaya