Menemukan Baris Tanpa Kecocokan (Anti-JOIN)
Pola LEFT JOIN / IS NULL untuk menemukan data yatim atau data yang hilang.
Menemukan Baris Tanpa Kecocokan (Anti-JOIN) adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 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.
Pertanyaan tentang Penggabungan Anti
Salah satu pertanyaan paling sering diajukan tentang penggabungan luar: "Temukan pelanggan yang belum pernah membuat pesanan." Atau: "Daftar produk yang tidak pernah terjual," atau "pesanan tanpa pelanggan yang cocok."
Semua ini memiliki bentuk yang sama: baris dalam satu tabel yang tidak memiliki kecocokan di tabel lain. Pola yang jelas adalah penggabungan anti, yang dibangun dari LEFT JOIN ditambah filter IS NULL.
Gagasan Inti
Mulai dengan LEFT JOIN: penggabungan ini mempertahankan setiap baris kiri, dan baris kiri yang tidak cocok mendapatkan NULL pada kolom tabel kanan.
Jadi, baris yang tidak cocok tepatnya adalah baris yang kolom tabel kanannya bernilai NULL. Saring berdasarkan kondisi itu, lalu Anda mengisolasi baris tanpa kecocokan. Itulah keseluruhan triknya.
Membangun Polanya
Berikut pola penggabungan anti baku untuk menemukan pelanggan tanpa pesanan. Bacalah dalam dua langkah: LEFT JOIN mempertahankan semua pelanggan, kemudian WHERE o.customer_id IS NULL hanya mempertahankan baris yang tidak cocok.
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
WHERE o.customer_id IS NULL;
-- only customers with zero ordersMengapa Ini Berhasil, Langkah demi Langkah
Lacak prosesnya dengan data kita, di mana Carol tidak memiliki pesanan:
- LEFT JOIN menghasilkan Alice (2x), Bob (1x), dan Carol dengan kolom kanan NULL.
WHERE o.customer_id IS NULLmembuang Alice dan Bob (kolom kanan mereka memiliki nilai nyata).- Hanya baris Carol, yaitu baris yang dibentuk dengan NULL, yang tetap ada.
Filter dijalankan setelah penggabungan, sehingga filter melihat NULL tersebut dan memilih tepat baris-baris tanpa pasangan.
Memilih Kolom yang Tepat untuk Diuji
Uji kolom tabel kanan yang tidak mungkin secara sah bernilai NULL dalam kecocokan nyata, idealnya kunci penggabungan atau kunci utama.
Jika Anda menguji kolom kanan yang dapat bernilai NULL seperti o.shipped_at, Anda juga akan menangkap pesanan yang ada tetapi belum dikirim, sehingga jawabannya salah. Menguji o.customer_id (kunci penggabungan) atau o.id (kunci utamanya) menjamin bahwa NULL berarti "tidak ada baris yang cocok."
-- SAFE: join key / primary key
WHERE o.id IS NULL
-- RISKY: a nullable data column
WHERE o.shipped_at IS NULL -- catches unshipped too!Penggabungan Anti vs NOT IN
Pewawancara membandingkan penggabungan anti dengan NOT IN. Keduanya tampak setara, tetapi berbeda dalam menangani NULL.
Jika subkueri mengembalikan NULL apa pun, NOT IN tidak mengembalikan baris sama sekali, sebuah kesalahan diam-diam yang terkenal. Penggabungan anti LEFT JOIN / IS NULL kebal terhadap masalah ini.
-- DANGEROUS if any customer_id is NULL
SELECT id, name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- SAFE anti-join, same intent
SELECT c.id, c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Penggabungan Anti vs NOT EXISTS
Padanan lainnya adalah NOT EXISTS dengan subkueri berkorelasi. Ini juga menangani NULL dengan benar dan sering kali sama cepatnya.
Ketiganya (LEFT JOIN/IS NULL, NOT EXISTS, NOT IN) dapat menyatakan penggabungan anti, tetapi dalam wawancara pilih LEFT JOIN/IS NULL atau NOT EXISTS karena aman terhadap NULL. Menyebutkan jebakan NOT IN akan memberi Anda nilai tambah.
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Kesalahan Umum
Kesalahan yang sering terjadi adalah meletakkan kondisi tanpa kecocokan dalam klausa ON, bukan WHERE.
Menulis ... ON o.customer_id = c.id AND o.id IS NULL tidak menyaring hasil; penulisan itu hanya mengubah apa yang dianggap sebagai kecocokan, dan setiap pelanggan tetap dipertahankan oleh LEFT JOIN. Pengujian IS NULL harus berada di WHERE, diterapkan setelah penggabungan. Kami membahas jebakan ini sepenuhnya pada pelajaran berikutnya.
Menemukan Baris Anak Tanpa Induk
Pola ini juga berlaku sebaliknya. Untuk menemukan pesanan yang merujuk ke pelanggan yang tidak ada (baris tanpa induk, pemeriksaan integritas data), pertahankan orders dan uji sisi pelanggan untuk NULL.
SELECT o.id AS order_id, o.customer_id
FROM orders o
LEFT JOIN customers c
ON c.id = o.customer_id
WHERE c.id IS NULL;
-- orders pointing to a non-existent customerMenghitung Baris Tanpa Pasangan
Sering kali yang diminta hanyalah hitungan: "Berapa banyak pelanggan yang tidak pernah memesan?" Bungkus penggabungan anti ini, atau hitung secara langsung.
Karena penggabungan anti sudah mengembalikan satu baris untuk setiap baris tanpa pasangan, COUNT(*) biasa sudah benar di sini; tepatnya ada satu baris untuk setiap pelanggan yang tidak cocok.
SELECT COUNT(*) AS never_ordered
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Templat yang Dapat Digunakan Kembali
Hafalkan kerangka tiga baris ini; kerangka ini menyelesaikan banyak sekali pertanyaan wawancara:
FROM keep_table kLEFT JOIN other o ON o.fk = k.idWHERE o.id IS NULL
Tukar tabel dan kuncinya untuk menemukan produk yang belum terjual, tiket yang belum ditetapkan, pengguna yang belum pernah masuk, atau apa pun yang dideskripsikan sebagai "X tanpa Y yang cocok."
Pemeriksaan Singkat
Anda memerlukan produk yang tidak pernah muncul di item_pesanan.
Rangkuman
Penggabungan anti menemukan baris tanpa kecocokan: LEFT JOIN lalu WHERE right_key IS NULL.
- Uji kunci penggabungan atau kunci utama, jangan pernah kolom data yang dapat bernilai NULL.
- Pengujian
IS NULLberada diWHERE, bukanON. - Setara dengan
NOT EXISTS; pilih ini daripadaNOT IN, yang bermasalah saat ada NULL. - Balik urutan tabel untuk menemukan baris anak tanpa induk.
Satu templat, banyak pertanyaan: "X tanpa Y yang cocok."
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menemukan Baris Tanpa Kecocokan (Anti-JOIN)” gratis?
Ya — teks lengkap “Menemukan Baris Tanpa Kecocokan (Anti-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 “Menemukan Baris Tanpa Kecocokan (Anti-JOIN)”?
Pola LEFT JOIN / IS NULL untuk menemukan data yatim atau data yang hilang. 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 3 dari 4.
Berapa lama pelajaran “Menemukan Baris Tanpa Kecocokan (Anti-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
- LEFT JOIN dan Mempertahankan Baris Tanpa Pasangan
- Semantik RIGHT dan FULL OUTER JOIN
- Menemukan Baris Tanpa Kecocokan (Anti-JOIN)
- Jebakan WHERE pada OUTER JOIN