Jebakan WHERE pada OUTER JOIN
Mengapa memfilter kolom hasil OUTER JOIN di WHERE secara diam-diam mengubahnya menjadi INNER JOIN.
Jebakan WHERE pada OUTER JOIN adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Jebakan yang Menangkap Semua Orang
Ini adalah bug penggabungan luar paling umum yang sengaja ditanam pewawancara: "Tampilkan setiap pelanggan dan pesanan mereka dari 2024, termasuk pelanggan tanpa pesanan pada 2024."
Kandidat menulis LEFT JOIN, lalu menambahkan filter tanggal di WHERE, dan pelanggan tanpa pesanan 2024 menghilang secara diam-diam. LEFT JOIN secara diam-diam berubah menjadi INNER JOIN. Memahami alasannya merupakan tanda kemampuan tingkat senior.
Kueri yang Salah
Berikut kesalahannya. Ini tampak masuk akal: pertahankan semua pelanggan, gabungkan pesanan mereka, lalu saring ke tahun 2024.
Namun pelanggan tanpa pesanan, atau tanpa pesanan pada 2024, menghilang dari hasil. Persyaratan untuk menyertakan mereka dilanggar.
-- BUG: drops customers with no 2024 order
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';Mengapa Ini Gagal
Ingat urutan operasi: JOIN dijalankan terlebih dahulu, menghasilkan baris yang setiap kolom pesanannya berisi NULL untuk pelanggan tanpa kecocokan. Kemudian WHERE dijalankan.
Untuk pelanggan tanpa kecocokan, o.order_date bernilai NULL, sehingga o.order_date >= '2024-01-01' menghasilkan UNKNOWN, bukan true. WHERE hanya mempertahankan baris yang bernilai true, sehingga baris NULL disaring—tepat baris yang berusaha dipertahankan oleh LEFT JOIN.
NULL Menggagalkan Filter
Setiap perbandingan dengan NULL menghasilkan UNKNOWN: NULL >= '2024-01-01' adalah UNKNOWN, NULL = 5 adalah UNKNOWN, bahkan NULL <> 5 juga UNKNOWN.
Karena WHERE hanya meneruskan baris yang bernilai TRUE, setiap baris tanpa kecocokan yang dipertahankan akan dibuang. Seluruh tujuan penggabungan luar dibatalkan oleh satu predikat WHERE pada kolom tabel kanan.
Perbaikan: Letakkan Filter di ON
Pindahkan filter ke klausa ON. Di sana filter menjadi bagian dari kondisi kecocokan, diterapkan sebelum baris dipertahankan, sehingga pelanggan tanpa kecocokan tetap ada dengan NULL.
-- CORRECT: filter lives in ON
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
AND o.order_date >= '2024-01-01';
-- customers with no 2024 order: kept, NULL orderON vs WHERE dalam Satu Kalimat
Berikut aturan yang dapat Anda ucapkan dalam wawancara:
Untuk tabel yang dipertahankan (luar), kondisi pada tabel lain harus berada di ON; kondisi pada tabel yang dipertahankan itu sendiri harus berada di WHERE.
ONmenentukan apa yang dianggap sebagai kecocokan (dijalankan selama penggabungan).WHEREmenyaring baris akhir (dijalankan setelahnya dan menghapus baris NULL).
Hasil Berdampingan
Data sama, dua penempatan, jawaban berbeda. Misalkan Carol tidak memiliki pesanan pada 2024.
- Filter di WHERE: Carol menghilang. Secara efektif, ini menjadi penggabungan dalam.
- Filter di ON: Carol muncul sekali dengan kolom pesanan NULL; persyaratan terpenuhi.
Perbedaan keluaran itulah inti jebakan ini.
-- ON version output
-- Alice | 50 | 2024-03-01
-- Bob | 20 | 2024-05-02
-- Carol | NULL | NULL <-- preservedKapan WHERE Sebenarnya Benar
Tidak setiap penggunaan WHERE pada penggabungan luar merupakan kesalahan. Menyaring tabel yang dipertahankan tidak masalah—penyaringan itu tidak melibatkan NULL dari penggabungan.
Penggabungan anti dari pelajaran sebelumnya juga dengan sengaja menggunakan WHERE o.id IS NULL untuk memanfaatkan perilaku ini. Keterampilannya adalah mengetahui kasus yang sedang Anda hadapi.
-- Fine: filtering the preserved (left) table
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'US';Heuristik Deteksi
Saat meninjau penggabungan luar, periksa klausa WHERE untuk mencari predikat pada tabel yang tidak dipertahankan (selain pengujian penggabungan anti IS NULL).
Jika Anda melihat o.someColumn = ... atau pengujian rentang/kesetaraan pada sisi luar di WHERE, curigai jebakan ini. Tanyakan: "Apakah ini mengubah LEFT JOIN saya menjadi INNER JOIN?" Biasanya iya.
Beberapa Kondisi
Anda dapat menggabungkan kedua penempatan. Kondisi kecocokan pada tabel kanan berada di ON; filter pascapenggabungan yang benar-benar diterapkan pada tabel kiri berada di WHERE. Keduanya dapat digunakan bersama dengan rapi.
SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
AND o.amount > 100 -- match condition
WHERE c.signup_year = 2023; -- preserved-table filterMenjelaskannya Secara Lisan
Dalam wawancara, jelaskan mekanismenya, bukan hanya perbaikannya:
"Penggabungan dijalankan terlebih dahulu dan mengisi kolom kanan yang tidak cocok dengan NULL. Predikat WHERE pada kolom tersebut menghasilkan UNKNOWN untuk baris NULL, dan WHERE membuang baris yang tidak bernilai true, sehingga penggabungan luar berubah menjadi penggabungan dalam. Menempatkan predikat di ON menjadikannya kondisi kecocokan dan mempertahankan baris yang tidak cocok." Penjelasan itu selalu berhasil.
Pemeriksaan Singkat
Anda harus mencantumkan semua pelanggan dan hanya pesanan mereka pada 2024, sambil tetap menyertakan pelanggan yang tidak memiliki pesanan.
Rangkuman
Memfilter kolom tabel yang tidak dipertahankan dalam WHERE secara diam-diam mengubah penggabungan luar menjadi INNER JOIN, karena NULL dari baris yang tidak cocok gagal memenuhi predikat (UNKNOWN), dan WHERE membuangnya.
- Kondisi kecocokan pada tabel luar berada di
ON. - Filter pada tabel yang dipertahankan berada di
WHERE. IS NULLdi WHERE adalah penggabungan anti yang disengaja, bukan jebakan.- Jelaskan urutan operasi untuk membuktikan bahwa Anda memahaminya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Jebakan WHERE pada OUTER JOIN” gratis?
Ya — teks lengkap “Jebakan WHERE pada OUTER JOIN” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Jebakan WHERE pada OUTER JOIN”?
Mengapa memfilter kolom hasil OUTER JOIN di WHERE secara diam-diam mengubahnya menjadi INNER JOIN. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Jebakan WHERE pada OUTER JOIN” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- LEFT JOIN dan Mempertahankan Baris Tanpa Pasangan
- Semantik RIGHT dan FULL OUTER JOIN
- Menemukan Baris Tanpa Kecocokan (Anti-JOIN)
- Jebakan WHERE pada OUTER JOIN