EXISTS dan NOT EXISTS Berkorelasi
Alternatif anti-JOIN yang andal dan menangani NULL dengan benar.
EXISTS dan NOT EXISTS Berkorelasi 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.
EXISTS Menguji Keberadaan
EXISTS menerima sebuah subkueri dan menghasilkan TRUE segera setelah subkueri tersebut menghasilkan setidaknya satu baris; jika tidak, hasilnya FALSE. EXISTS tidak pernah mengembalikan baris itu sendiri.
Dengan subkueri berkorelasi di dalamnya, EXISTS menjadi pemeriksaan keberadaan untuk setiap baris luar: "apakah ada baris yang cocok untuk baris luar ini?"
Karena berhenti setelah menemukan kecocokan pertama, EXISTS tidak mempermasalahkan jumlah baris yang cocok. Detail semantik ini merupakan poin wawancara yang sering ditanyakan.
EXISTS Berkorelasi Dasar
Temukan pelanggan yang telah membuat setidaknya satu pesanan. Kueri dalam berkorelasi melalui o.customer_id = c.customer_id.
Untuk setiap pelanggan, EXISTS menanyakan: apakah ada pesanan untuk pelanggan ini? Jika ya, pertahankan pelanggan tersebut.
SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);Mengapa SELECT 1 di Dalam EXISTS
Anda akan melihat SELECT 1, SELECT *, atau SELECT NULL di dalam EXISTS. Ketiganya setara.
EXISTS hanya memeriksa apakah ada baris yang dikembalikan, bukan isinya, sehingga kolom yang dipilih tidak relevan. Pengoptimal mengabaikannya.
SELECT 1 merupakan konvensi umum yang menunjukkan maksud: "Saya hanya peduli pada keberadaan." Pilih salah satunya dan gunakan secara konsisten; jangan sampai pewawancara mengira daftar kolom penting di sini.
NOT EXISTS Menemukan yang Tidak Ada
NOT EXISTS membalikkan pemeriksaan: pertahankan baris luar hanya jika subkueri berkorelasi tidak mengembalikan satu pun baris.
Inilah anti-penggabungan yang umum: pelanggan tanpa pesanan, produk yang tidak pernah terjual, dan siswa tanpa pengumpulan tugas.
SELECT c.customer_id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);Jebakan NULL pada NOT IN
Inilah poin penting dalam wawancara. NOT IN terhadap subkueri yang dapat berisi NULL berperilaku berbahaya: jika daftar tersebut bahkan mengandung satu NULL, NOT IN sama sekali tidak mengembalikan baris.
Hal itu terjadi karena perbandingan dengan NULL menghasilkan UNKNOWN, sedangkan NOT IN mengharuskan setiap perbandingan bernilai FALSE. Satu UNKNOWN merusak seluruh kondisi.
NOT EXISTS tidak mengalami masalah ini; ia hanya memeriksa keberadaan baris dan menangani NULL dengan aman.
-- Risky: returns nothing if any o.customer_id is NULL
SELECT c.customer_id FROM customers c
WHERE c.customer_id NOT IN (SELECT o.customer_id FROM orders o);
-- Safe: NULLs do not break it
SELECT c.customer_id FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id
);Mengapa NOT EXISTS Aman terhadap NULL
Alasannya terdapat dalam logika pencocokan. NOT EXISTS memeriksa apakah ada baris dalam yang memenuhi o.customer_id = c.customer_id.
Baris dengan o.customer_id bernilai NULL tidak pernah memenuhi kesetaraan tersebut (NULL = apa pun menghasilkan UNKNOWN, bukan TRUE), sehingga baris itu tidak dihitung sebagai kecocokan. Pemeriksaan keberadaan tetap benar.
Dengan NOT IN, NULL yang sama menjadi bagian dari perbandingan daftar yang hasil UNKNOWN-nya menghapus seluruh keluaran. Inilah alasan pewawancara tingkat senior lebih memilih NOT EXISTS.
EXISTS dengan Kondisi Tambahan
Subkueri berkorelasi dapat memuat lebih banyak predikat. Temukan pelanggan yang melakukan setidaknya satu pesanan senilai lebih dari 1000.
Kondisi tambahan berada di dalam subkueri EXISTS dan cakupannya ditentukan per pelanggan.
SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 1000
);Performa: Perilaku Berhenti Lebih Awal
EXISTS dapat berhenti memindai relasi dalam segera setelah satu baris yang cocok ditemukan. EXISTS tidak membuat atau menghitung seluruh kumpulan hasil.
Hal ini biasanya membuat EXISTS efisien, terutama ketika kolom berkorelasi memiliki indeks, karena setiap pemeriksaan per baris dapat menemukan kecocokan dengan cepat lalu berhenti.
Bandingkan dengan COUNT(*) > 0 berkorelasi, yang memaksa penghitungan setiap kecocokan. Pilih EXISTS jika Anda hanya memerlukan jawaban ya/tidak.
EXISTS vs COUNT untuk Keberadaan
Kandidat terkadang menulis penghitungan berkorelasi untuk menguji keberadaan. Cara ini berhasil, tetapi membuang-buang usaha.
Versi COUNT menghitung setiap pesanan yang cocok, sedangkan EXISTS berhenti setelah kecocokan pertama. Untuk pengujian keberadaan murni, EXISTS menyampaikan maksud dengan jelas dan memungkinkan pengoptimal berhenti lebih awal.
-- Works but counts everything
SELECT c.customer_id FROM customers c
WHERE (SELECT COUNT(*) FROM orders o
WHERE o.customer_id = c.customer_id) > 0;
-- Better: stops at first match
SELECT c.customer_id FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id);Contoh Lengkap: Produk yang Belum Pernah Dipesan
Pertanyaan wawancara klasik tentang pencarian tanpa pasangan: buat daftar produk yang belum pernah dipesan. NOT EXISTS terbaca hampir seperti persyaratan dalam bahasa Inggris.
Untuk setiap produk, periksa apakah ada baris pesanan yang merujuknya; pertahankan hanya produk yang tidak memiliki baris tersebut.
SELECT p.product_id, p.name
FROM products p
WHERE NOT EXISTS (
SELECT 1
FROM order_items oi
WHERE oi.product_id = p.product_id
);EXISTS dalam NOT EXISTS untuk Kueri Gaya Pembagian
Menempatkan EXISTS di dalam NOT EXISTS menyatakan pembagian relasional: "temukan baris yang cocok dengan ALL anggota suatu himpunan." Pertanyaan klasiknya adalah "pelanggan yang memesan setiap produk dalam suatu kategori."
Logikanya: pertahankan pelanggan jika tidak ada produk yang belum dipesannya. Negasi ganda ini merupakan ciri khas kueri pembagian, dan pewawancara menggunakannya untuk menguji pemahaman mendalam tentang EXISTS.
SELECT c.customer_id
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM products p
WHERE p.category = 'Coffee'
AND NOT EXISTS (
SELECT 1 FROM order_items oi
JOIN orders o ON o.order_id = oi.order_id
WHERE oi.product_id = p.product_id
AND o.customer_id = c.customer_id
)
);Pemeriksaan Singkat
Pilih cara paling aman untuk menemukan pelanggan yang tidak memiliki pesanan.
Ringkasan: EXISTS dan NOT EXISTS Berkorelasi
Hal-hal penting:
EXISTSadalah pengujian keberadaan per baris yang berhenti setelah kecocokan pertama; pilihan kolom di dalamnya tidak berpengaruh (gunakanSELECT 1).NOT EXISTSadalah pencarian tanpa pasangan yang aman terhadap NULL untuk menemukan baris yang tidak memiliki kecocokan.NOT INdengan NULL dalam daftar menghasilkan tidak ada baris; pilihNOT EXISTS.- Untuk keberadaan, EXISTS lebih baik daripada
COUNT(*) > 0berkorelasi karena berhenti lebih awal.
Sebutkan jebakan NULL pada NOT IN tanpa diminta; hal itu merupakan tanda yang andal dari kematangan pemahaman SQL.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “EXISTS dan NOT EXISTS Berkorelasi” gratis?
Ya — teks lengkap “EXISTS dan NOT EXISTS Berkorelasi” 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 “EXISTS dan NOT EXISTS Berkorelasi”?
Alternatif anti-JOIN yang andal dan menangani NULL dengan benar. 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 “EXISTS dan NOT EXISTS Berkorelasi” 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
- Anatomi Subkueri Berkorelasi
- Agregat Per Grup Tanpa GROUP BY
- EXISTS dan NOT EXISTS Berkorelasi
- Menulis Ulang Subkueri Berkorelasi sebagai JOIN