IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL
Uji NULL dengan benar dan pelajari operator yang aman terhadap NULL di setiap dialek.
IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 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.
Menguji NULL dengan Cara yang Benar
Pelajaran sebelumnya membuktikan bahwa Anda tidak dapat menggunakan = untuk menemukan NULL. Jadi, bagaimana cara mengujinya? Gunakan predikat khusus IS NULL dan IS NOT NULL.
Inilah satu-satunya cara yang benar dan portabel untuk memeriksa nilai yang hilang, dan pewawancara akan selalu menolak col = NULL setiap kali melihatnya.
Pelajaran ini membahas IS NULL, IS NOT NULL, keluarga IS DISTINCT FROM, serta operator kesetaraan yang aman terhadap NULL dan khusus untuk dialek tertentu. Mengetahui perbedaan antarbasis data merupakan sinyal kuat keahlian tingkat lanjut.
IS NULL dan IS NOT NULL
IS NULL menghasilkan TRUE ketika nilainya NULL dan FALSE untuk kondisi lainnya. Yang terpenting, operator ini tidak pernah menghasilkan UNKNOWN, sehingga aman digunakan langsung dalam WHERE.
IS NOT NULL merupakan kebalikannya: TRUE untuk nilai apa pun yang benar-benar ada, dan FALSE untuk NULL.
Predikat ini adalah alat utama untuk menangani NULL. Keduanya merupakan bagian dari SQL standar dan berperilaku sama di MySQL, Postgres, SQL Server, Oracle, dan SQLite.
-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;
-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;Mengapa kolom = NULL Selalu Salah
Ini adalah jebakan wawancara yang pasti muncul: seorang kandidat menulis WHERE bonus = NULL dengan harapan dapat menemukan bonus yang hilang. Kueri tersebut mengembalikan nol baris.
Ingat logika tiga nilai: bonus = NULL bernilai UNKNOWN untuk setiap baris, termasuk baris yang nilainya NULL, karena tidak ada sesuatu yang sama dengan hal yang tidak diketahui. WHERE hanya mempertahankan TRUE, sehingga tidak ada yang cocok.
Beberapa basis data dalam mode nonstandar akan diam-diam mengubah = NULL menjadi IS NULL, tetapi Anda tidak boleh mengandalkan perilaku tersebut. Selalu tulis IS NULL secara eksplisit.
-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;
-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;Menghitung NULL dan Nilai yang Bukan NULL
Tugas umum seorang analis adalah mengaudit kualitas data: seberapa lengkap sebuah kolom? Gabungkan IS NULL dengan COUNT untuk melaporkan nilai yang hilang.
Perhatikan perbedaannya: COUNT(*) menghitung setiap baris, sedangkan COUNT(bonus) hanya menghitung bonus yang bukan NULL. Selisih antara keduanya sama dengan jumlah NULL, sebuah fakta yang akan dibahas kembali dalam pelajaran tentang agregasi.
SELECT
COUNT(*) AS total_rows,
COUNT(bonus) AS with_bonus,
COUNT(*) - COUNT(bonus) AS missing_bonus,
SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;Masalah yang Diselesaikan oleh Kesetaraan Aman terhadap NULL
Misalkan Anda ingin mencocokkan dua kolom dan menganggap 'keduanya NULL' sebagai kecocokan. a = b biasa gagal: ketika keduanya NULL, hasilnya UNKNOWN, sehingga pasangan tersebut dikecualikan meskipun secara intuitif keduanya 'sama'.
Hal ini muncul saat membandingkan baris lama dengan baris baru untuk mendeteksi perubahan, atau saat menggabungkan berdasarkan kolom opsional. Anda memerlukan perbandingan yang membuat NULL sama dengan NULL menghasilkan TRUE dan NULL dibandingkan dengan nilai menghasilkan FALSE. Itulah yang disediakan oleh kesetaraan aman terhadap NULL.
-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
-- NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note; -- misses rows where both notes are NULLPerbandingan Aman terhadap NULL Berstandar ANSI
Perbandingan aman terhadap NULL yang ditetapkan oleh standar ANSI adalah IS DISTINCT FROM dan kebalikannya, IS NOT DISTINCT FROM. Keduanya didukung di Postgres, SQL Server (2022+), dan sistem lainnya.
a IS NOT DISTINCT FROM bberarti 'sama, dengan NULL = NULL dianggap sama'.a IS DISTINCT FROM bberarti 'berbeda, dengan NULL diperlakukan sebagai nilai biasa'.
Operator ini selalu menghasilkan TRUE atau FALSE, tidak pernah UNKNOWN, sehingga aman digunakan di mana pun predikat diperlukan.
-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;
-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;Operator <=> Milik MySQL
MySQL menyediakan operator kesetaraan aman terhadap NULL yang ringkas, ditulis sebagai <=> (disebut operator pesawat ruang angkasa).
a <=> b menghasilkan 1 (TRUE) ketika kedua sisi sama atau keduanya NULL, dan 0 (FALSE) untuk kondisi lainnya. Operator ini merupakan padanan MySQL untuk IS NOT DISTINCT FROM.
Jika pewawancara meminta pencocokan aman terhadap NULL khusus di MySQL, inilah jawaban yang lazim.
-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null, -- 1
(NULL <=> 5) AS null_vs_val, -- 0
(5 <=> 5) AS val_eq; -- 1
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;Lembar Contekan Lintas Dialek
Pewawancara menghargai kandidat yang memahami batas portabilitas. Berikut adalah peta kesetaraan yang aman terhadap NULL:
- ANSI / Postgres / SQL Server 2022+:
IS NOT DISTINCT FROM - MySQL / MariaDB:
<=> - SQLite:
ISdanIS NOTberfungsi sebagai kesetaraan yang aman terhadap NULL - Oracle: tidak memiliki operator bawaan; emulasikan dengan
DECODE(a, b, 1, 0) = 1atau trik COALESCE
Jika Anda tidak yakin dengan mesin basis data yang digunakan, gunakan bentuk manual portabel yang ditunjukkan berikutnya sebagai pilihan cadangan.
-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b; -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b; -- complementPencocokan Manual NULL yang Portabel
Jika tidak tersedia operator bawaan, Anda dapat membangun kesetaraan yang aman terhadap NULL dari komponen-komponen dasar. Pola portabel ini menggabungkan kesetaraan biasa dengan klausa eksplisit untuk kondisi ketika keduanya NULL.
Bacalah sebagai berikut: "keduanya sama, ATAU keduanya tidak memiliki nilai." Cara ini berfungsi pada semua basis data, sehingga menjadi jawaban yang sangat baik ketika pewawancara tidak menentukan dialek.
SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
OR (o.note IS NULL AND n.note IS NULL);
-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')Contoh Lebih Mendalam: Kunci JOIN yang Aman terhadap NULL
Jebakan yang realistis: melakukan JOIN menggunakan kunci yang dapat bernilai NULL. Jika region dapat bernilai NULL di kedua sisi, equi-JOIN biasa diam-diam menghilangkan pasangan tersebut karena NULL = NULL bernilai UNKNOWN.
Jika aturan bisnisnya adalah "baris tanpa wilayah tetap harus cocok dengan baris tanpa wilayah lainnya", Anda harus membuat kondisi JOIN aman terhadap NULL. Nyatakan asumsi tersebut dengan jelas dalam wawancara, lalu pilih operator yang sesuai dengan mesin basis data.
-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
ON a.region IS NOT DISTINCT FROM b.region;
-- MySQL equivalent: ON a.region <=> b.regionPoin Pembahasan Wawancara
Untuk menangani pertanyaan apa pun tentang pengujian NULL dengan rapi:
- Selalu gunakan
IS NULL/IS NOT NULL; jangan pernah gunakan= NULL. - Predikat ini hanya menghasilkan TRUE atau FALSE, sehingga aman digunakan dalam WHERE.
- Untuk pencocokan "NULL sama dengan NULL", gunakan IS NOT DISTINCT FROM (ANSI) atau <=> (MySQL).
- Tentukan dialek yang Anda tuju; tawarkan klausa OR portabel sebagai pilihan cadangan ketika tidak yakin.
Menyebutkan operator standar dan operator vendor menunjukkan keluasan pengetahuan yang diperhatikan oleh pewawancara penyaring.
Pemeriksaan Singkat
Pilih perbandingan yang aman terhadap NULL.
Ringkasan
Sekarang Anda dapat menguji NULL dengan benar:
IS NULL/IS NOT NULLadalah satu-satunya pengujian NULL yang benar dan portabel; keduanya tidak pernah menghasilkan UNKNOWN.col = NULLselalu menghasilkan nol baris; ini adalah jebakan wawancara klasik.- Kesetaraan yang aman terhadap NULL menganggap dua NULL sama: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
- Jika tidak ada operator yang tersedia, gunakan
(a = b) OR (a IS NULL AND b IS NULL).
Berikutnya: mengganti NULL dengan nilai bawaan menggunakan COALESCE, NULLIF, dan fungsi vendor seperti ISNULL.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL” gratis?
Ya — teks lengkap “IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL” 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 “IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL”?
Uji NULL dengan benar dan pelajari operator yang aman terhadap NULL di setiap dialek. 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 2 dari 4.
Berapa lama pelajaran “IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL” 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
- Logika Tiga Nilai dan UNKNOWN
- IS NULL, IS NOT NULL, dan Kesetaraan yang Aman terhadap NULL
- COALESCE, NULLIF, dan ISNULL
- NULL dalam Agregat, JOIN, dan DISTINCT