Persediaan Temu Duga SQL · Pelajaran

IS NULL, IS NOT NULL dan Kesamaan Selamat NULL

Uji NULL dengan betul serta gunakan operator yang selamat untuk NULL mengikut dialek

Pelajaran 2 daripada 413 langkah

IS NULL, IS NOT NULL dan Kesamaan Selamat NULL ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Menguji NULL dengan Cara yang Betul

Pelajaran sebelumnya membuktikan bahawa anda tidak boleh menggunakan = untuk mencari NULL. Jadi, bagaimanakah anda mengujinya? Dengan predikat khusus IS NULL dan IS NOT NULL.

Inilah satu-satunya cara yang betul dan serasi merentas pangkalan data untuk menyemak nilai yang hilang, dan penemu duga akan menolak col = NULL setiap kali mereka melihatnya.

Pelajaran ini merangkumi IS NULL, IS NOT NULL, keluarga IS DISTINCT FROM dan operator kesamaan yang selamat terhadap NULL khusus untuk dialek tertentu. Mengetahui perbezaan antara pangkalan data ialah tanda penguasaan lanjutan.

IS NULL dan IS NOT NULL

IS NULL memulangkan TRUE apabila nilainya ialah NULL dan FALSE selainnya. Yang penting, ia tidak pernah memulangkan UNKNOWN, jadi ia selamat digunakan terus dalam WHERE.

IS NOT NULL ialah pelengkap tepatnya: TRUE untuk sebarang nilai sebenar dan FALSE untuk NULL.

Predikat ini ialah alat utama untuk mengendalikan NULL. Predikat ini merupakan sebahagian daripada SQL standard dan berkelakuan sama dalam 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 col = NULL Sentiasa Salah

Ini ialah perangkap temu duga yang hampir pasti muncul: calon menulis WHERE bonus = NULL dengan harapan dapat mencari bonus yang tiada. Kueri tersebut memulangkan sifar baris.

Ingat logik tiga nilai: bonus = NULL bernilai UNKNOWN bagi setiap baris, termasuk baris yang NULL, kerana tiada apa-apa yang sama dengan sesuatu yang tidak diketahui. WHERE hanya mengekalkan TRUE, jadi tiada apa-apa yang sepadan.

Sesetengah pangkalan data dalam mod bukan piawai akan menulis semula = NULL kepada IS NULL tanpa memberitahu anda, tetapi anda tidak boleh bergantung padanya. Sentiasa tulis IS NULL secara jelas.

-- 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;

Mengira NULL dan Nilai Bukan-NULL

Tugas biasa penganalisis ialah mengaudit kualiti data: sejauh manakah lengkapnya sesuatu lajur? Gabungkan IS NULL dengan COUNT untuk melaporkan nilai yang hilang.

Perhatikan perbezaannya: COUNT(*) mengira setiap baris, manakala COUNT(bonus) hanya mengira bonus yang bukan NULL. Perbezaan antara kedua-duanya sama dengan kiraan NULL, iaitu fakta yang akan kita temui semula dalam pelajaran tentang agregat.

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 Kesamaan Selamat-NULL

Katakan anda mahu memadankan dua lajur dan menganggap 'kedua-duanya NULL' sebagai padanan. a = b biasa gagal: apabila kedua-duanya NULL, hasilnya UNKNOWN, jadi pasangan itu dikecualikan walaupun secara intuitif kedua-duanya 'sama'.

Situasi ini berlaku apabila anda membandingkan baris lama dengan baris baharu untuk mengesan perubahan, atau apabila mencantumkan jadual berdasarkan lajur pilihan. Anda memerlukan perbandingan yang menetapkan NULL bersamaan NULL ialah TRUE dan NULL berbanding nilai ialah FALSE. Itulah yang disediakan oleh kesamaan selamat-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 NULL

IS DISTINCT FROM (Piawaian SQL)

Perbandingan selamat-NULL mengikut piawaian ANSI ialah IS DISTINCT FROM dan songsangannya, IS NOT DISTINCT FROM. Perbandingan ini disokong dalam Postgres, SQL Server (2022+) dan sistem lain.

  • a IS NOT DISTINCT FROM b bermaksud 'sama, dengan NULL = NULL dikira sebagai sama'.
  • a IS DISTINCT FROM b bermaksud 'berbeza, dengan NULL dianggap sebagai nilai biasa'.

Perbandingan ini sentiasa memulangkan TRUE atau FALSE, tidak pernah UNKNOWN, jadi ia selamat digunakan di mana-mana 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 <=> MySQL

MySQL menyediakan operator kesamaan selamat-NULL yang ringkas, ditulis sebagai <=> (operator kapal angkasa).

a <=> b memulangkan 1 (TRUE) apabila kedua-dua sisi sama atau kedua-duanya NULL, dan 0 (FALSE) selainnya. Operator ini ialah padanan MySQL bagi IS NOT DISTINCT FROM.

Jika penemu duga meminta padanan selamat-NULL khusus dalam MySQL, inilah jawapan yang lazim digunakan.

-- 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;

Panduan Ringkas Rentas Dialek

Penemu duga menghargai calon yang mengetahui batas kebolehportan. Berikut ialah peta kesamaan yang selamat untuk NULL:

  • ANSI / Postgres / SQL Server 2022+: IS NOT DISTINCT FROM
  • MySQL / MariaDB: <=>
  • SQLite: IS dan IS NOT berfungsi sebagai kesamaan selamat untuk NULL
  • Oracle: tiada pengendali natif; tiru tingkah laku tersebut dengan DECODE(a, b, 1, 0) = 1 atau helah COALESCE

Apabila tidak pasti tentang enjin yang digunakan, gunakan bentuk manual mudah alih yang ditunjukkan seterusnya sebagai sandaran.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

Padanan Manual NULL yang Mudah Alih

Apabila tiada pengendali natif tersedia, Anda boleh membina kesamaan yang selamat untuk NULL daripada unsur asas. Corak mudah alih ini menggabungkan kesamaan biasa dengan klausa jelas apabila kedua-duanya NULL.

Tafsirkan seperti ini: 'kedua-duanya sama, OR kedua-duanya tiada nilai.' Corak ini berfungsi pada setiap pangkalan data, menjadikannya jawapan yang sangat baik apabila penemu duga tidak menetapkan dialek tertentu.

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 Selamat untuk NULL

Perangkap praktikal yang biasa berlaku ialah membuat cantuman menggunakan kunci yang boleh NULL. Jika region boleh menjadi NULL pada kedua-dua belah, cantuman kesamaan biasa akan menggugurkan pasangan tersebut secara senyap kerana NULL = NULL ialah UNKNOWN.

Jika peraturan perniagaan menyatakan bahawa 'baris tanpa wilayah masih perlu sepadan dengan baris lain yang juga tiada wilayah', Anda mesti menjadikan syarat cantuman itu selamat untuk NULL. Nyatakan andaian tersebut dengan jelas semasa temu duga, kemudian pilih pengendali yang sepadan dengan enjin berkenaan.

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

Perkara untuk Ditekankan dalam Temu Duga

Untuk menjawab sebarang soalan pengujian NULL dengan kemas:

  • Sentiasa gunakan IS NULL / IS NOT NULL; jangan sekali-kali gunakan = NULL.
  • Predikat ini hanya mengembalikan TRUE atau FALSE, jadi selamat digunakan dalam WHERE.
  • Untuk padanan 'NULL sama dengan NULL', gunakan IS NOT DISTINCT FROM (ANSI) atau <=> (MySQL).
  • Nyatakan dialek sasaran Anda; tawarkan klausa OR mudah alih sebagai sandaran apabila tidak pasti.

Menyebut kedua-dua pengendali piawaian dan pengeluar menunjukkan keluasan pengetahuan yang diperhatikan oleh penilai saringan.

Semakan Pantas

Pilih perbandingan yang betul dan selamat untuk NULL.

Imbas Kembali

Anda kini boleh menguji NULL dengan betul:

  • IS NULL / IS NOT NULL ialah satu-satunya ujian NULL yang betul dan mudah alih; ujian ini tidak pernah mengembalikan UNKNOWN.
  • col = NULL sentiasa menghasilkan sifar baris; ini ialah perangkap temu duga yang klasik.
  • Kesamaan selamat untuk NULL menganggap dua NULL sebagai sama: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
  • Apabila tiada pengendali tersedia, gunakan (a = b) OR (a IS NULL AND b IS NULL).

Seterusnya: menggantikan nilai lalai untuk NULL dengan COALESCE, NULLIF dan fungsi khusus pengeluar seperti ISNULL.

Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “IS NULL, IS NOT NULL dan Kesamaan Selamat NULL” percuma?

Ya — teks penuh “IS NULL, IS NOT NULL dan Kesamaan Selamat NULL” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “IS NULL, IS NOT NULL dan Kesamaan Selamat NULL”?

Uji NULL dengan betul serta gunakan operator yang selamat untuk NULL mengikut dialek Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “IS NULL, IS NOT NULL dan Kesamaan Selamat NULL” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Logik Tiga Nilai dan UNKNOWN
  2. IS NULL, IS NOT NULL dan Kesamaan Selamat NULL
  3. COALESCE, NULLIF dan ISNULL
  4. NULL dalam Agregat, Cantuman dan DISTINCT
← Kembali ke Persediaan Temu Duga SQL