Subkueri IN, ANY, dan ALL
Subkueri keanggotaan himpunan dan jebakan terkenal NOT IN dengan NULL.
Subkueri IN, ANY, dan ALL 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.
Subkueri Keanggotaan Himpunan
Ketika subkueri mengembalikan daftar nilai, Anda dapat menguji keanggotaannya dengan IN, ANY, atau ALL. Inilah cara SQL menanyakan apakah nilai ini termasuk dalam himpunan tersebut? atau apakah nilainya melampaui setiap elemen / salah satu elemen himpunan tersebut?
IN— cocok dengan nilai apa pun dalam daftar.ANY/SOME— bernilai benar jika perbandingan berlaku untuk setidaknya satu elemen.ALL— bernilai benar hanya jika perbandingan berlaku untuk setiap elemen.
IN dengan Subkueri
Kasus sehari-hari: cari karyawan yang bekerja di departemen mana pun yang berlokasi di 'NYC'. Subkueri mengembalikan himpunan id departemen, dan IN mempertahankan baris yang cocok dengan salah satunya.
Bentuk ini mudah dipahami dan merupakan bentuk pertama yang biasanya diharapkan pewawancara.
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY Sama dengan IN
Kesetaraan menarik yang disukai pewawancara: = ANY (subquery) memiliki arti yang persis sama dengan IN (subquery). Keduanya bernilai benar ketika nilai tersebut sama dengan setidaknya satu elemen dalam himpunan.
Kueri di bawah mengembalikan hasil yang identik dengan kueri sebelumnya. ANY dan sinonimnya, SOME, menggeneralisasikan hal ini ke operator lain seperti > dan <.
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);ANY dengan Operator Perbandingan
ANY menjadi sangat berguna dengan > atau <. salary > ANY (set) bernilai benar jika gaji melampaui setidaknya elemen terkecil — yaitu lebih besar daripada nilai minimum.
Ini menemukan karyawan yang berpenghasilan lebih besar daripada setidaknya satu orang di departemen 5.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);ALL dengan Operator Perbandingan
salary > ALL (set) hanya bernilai benar jika gaji melampaui setiap elemen — yaitu lebih besar daripada nilai maksimum. Ini menemukan karyawan yang berpenghasilan lebih besar daripada semua orang di departemen 5.
Hafalkan cara singkatnya: > ALL = lebih besar daripada MAX, > ANY = lebih besar daripada MIN. Pewawancara sangat sering menguji hal ini.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN: Perangkap NULL yang Terkenal
Inilah kesalahan tersembunyi dalam subkueri yang paling sering ditanyakan saat wawancara. Jika subkueri dalam NOT IN mengembalikan bahkan satu NULL, seluruh NOT IN dapat menghasilkan tanpa baris — bukan data tanpa pasangan yang Anda harapkan.
Mengapa? x NOT IN (1, 2, NULL) diperluas menjadi x <> 1 AND x <> 2 AND x <> NULL. Perbandingan terakhir bernilai UNKNOWN, sehingga AND tidak mungkin bernilai benar.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);Mengapa Kueri Itu Gagal Diam-Diam
Jika orders.customer_id boleh bernilai NULL dan ada baris yang memiliki NULL di sana, kueri sebelumnya mengembalikan nol baris meskipun jelas ada pelanggan tanpa pesanan.
- Kehadiran NULL mengubah logika menjadi
UNKNOWN. - Kueri ini tidak menghasilkan error — kueri hanya mengembalikan hasil yang salah (kosong).
Menyebutkan bahaya ini secara langsung saat wawancara merupakan sinyal yang kuat.
Memperbaiki NOT IN dengan NULL
Tiga perbaikan aman yang diterima pewawancara:
- Keluarkan NULL dari subkueri: tambahkan
WHERE customer_id IS NOT NULL. - Tulis ulang menggunakan
NOT EXISTS, yang menangani NULL dengan benar. - Gunakan
LEFT JOIN ... IS NULLsebagai anti-JOIN.
Versi yang dilindungi di bawah mengembalikan daftar pelanggan yang sebenarnya tidak memiliki pesanan.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN Aman terhadap NULL
Sebagai perbandingan yang melegakan: IN biasa (tidak dinegasikan) tidak rusak karena NULL dalam daftar. x IN (1, 2, NULL) bernilai benar jika x sama dengan 1 atau 2; NULL hanya tidak pernah cocok.
Bahaya NULL hanya berlaku khusus untuk NOT IN. Mengetahui perbedaan antara kedua kasus ini adalah hal yang membedakan jawaban yang meyakinkan dari sekadar tebakan.
IN Multi-Kolom
Beberapa dialek SQL (Postgres, MySQL) mengizinkan IN pada tuple kolom untuk mencocokkan pasangan sekaligus. Ini menemukan baris pesanan yang kombinasi (produk, wilayah)-nya muncul dalam tabel promosi.
SQL Server tidak mendukung IN bernilai baris; Anda perlu menulis ulang dengan EXISTS di sana. Menyebutkan perbedaan portabilitas ini akan mengesankan pewawancara.
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);Cuplikan Jawaban Wawancara
Katakan ini: "IN menguji keanggotaan himpunan dan setara dengan = ANY. Dengan operator perbandingan, > ANY berarti lebih besar daripada nilai minimum dan > ALL berarti lebih besar daripada nilai maksimum. Perangkap besarnya adalah NOT IN terhadap subkueri yang dapat mengembalikan NULL — kueri ini diam-diam mengembalikan tanpa baris, jadi saya melindunginya dengan IS NOT NULL atau beralih ke NOT EXISTS."
Jawaban tersebut mencakup keanggotaan, semantik ANY/ALL, dan perangkap NULL sekaligus.
Pemeriksaan Singkat
Perangkap subkueri favorit pewawancara.
Ringkasan
Subkueri keanggotaan, kini dikuasai:
IN== ANY: cocok dengan elemen apa pun dalam himpunan.> ANYberarti lebih besar daripada nilai minimum;> ALLberarti lebih besar daripada nilai maksimum.NOT INdengan NULL dalam subkueri diam-diam mengembalikan tanpa baris — lindungi denganIS NOT NULLatau gunakanNOT EXISTS.INbiasa dapat menangani NULL;INmulti-kolom berfungsi dalam beberapa dialek.
Berikutnya: EXISTS versus IN dan pertanyaan tentang kinerja yang disukai pewawancara senior.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Subkueri IN, ANY, dan ALL” gratis?
Ya — teks lengkap “Subkueri IN, ANY, dan ALL” 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 “Subkueri IN, ANY, dan ALL”?
Subkueri keanggotaan himpunan dan jebakan terkenal NOT IN dengan NULL. 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 “Subkueri IN, ANY, dan ALL” 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
- Subkueri Skalar dalam SELECT dan WHERE
- Subkueri dalam Klausa FROM (Tabel Turunan)
- Subkueri IN, ANY, dan ALL
- Kinerja EXISTS vs IN