0Pricing
Coding Interview Prep · Pelajaran

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 Coding 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding 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 order

ON 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.

  • ON menentukan apa yang dianggap sebagai kecocokan (dijalankan selama penggabungan).
  • WHERE menyaring 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   <-- preserved

Kapan 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 filter

Menjelaskannya 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 NULL di 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 Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding 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 Coding 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 Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding 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 Coding Interview Prep ini?

Ya. Setiap pelajaran Coding 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

  1. LEFT JOIN dan Mempertahankan Baris Tanpa Pasangan
  2. Semantik RIGHT dan FULL OUTER JOIN
  3. Menemukan Baris Tanpa Kecocokan (Anti-JOIN)
  4. Jebakan WHERE pada OUTER JOIN
← Kembali ke Coding Interview Prep