在 MySQL 中處理 NULL 值時,常見兩種寫法:ISNULL() 函數與 IS NULL / IS NOT NULL 運算子。它們行為不同,效能表現也各有特點,本文深入解析並釐清常見迷思。
ISNULL() 僅接受單一參數,與 SQL Server 的 ISNULL(expr, replacement)(兩參數、可替換值)完全不同。WHERE 條件,可讀性更佳。-- 找出 name 為 NULL 的列
SELECT * FROM newtable WHERE name IS NULL;
-- 找出 title 不為 NULL 的列
SELECT * FROM tbas_table WHERE title IS NOT NULL;
-- 實務範例:查詢 click、describle 非空資料
SELECT `click`, `title`, `created` FROM dcfsda_table WHERE click IS NOT NULL;
SELECT `id`, `title`, `describle` FROM bnsdh_table WHERE describle IS NOT NULL;
網路上常流傳「IS NULL / IS NOT NULL 無法使用索引」的說法,這是片面的。實際上:
IS NULL 使用索引(特別是唯一索引或主鍵)。IS NOT NULL 是否使用索引,取決於資料分布與優化器成本評估:若非 NULL 值佔大多數(如 100 萬筆中僅 1 筆 NULL),全表掃描可能比索引掃描+回表更快;反之,若 NULL 值佔多數,優化器傾向走索引。-- 原寫法
SELECT click FROM bsga_table WHERE click IS NOT NULL;
-- 嘗試改寫(若 click 為正整數)
SELECT click FROM bsga_table WHERE click > 0 AND click < 100001;
結論:不要盲目改寫。請用 EXPLAIN 觀察實際執行計畫,依據資料特性決定。優化器的目標是「最低成本」,而非死板規則。
-- 錯誤:NULL = NULL 結果為 UNKNOWN(非 TRUE),查不到任何資料
SELECT * FROM tbl WHERE col = NULL;
-- 正確:必須用 IS NULL
SELECT * FROM tbl WHERE col IS NULL;
記住:NULL 代表「未知」,任何與 NULL 的比較運算(=、!=、>、< 等)結果皆為 UNKNOWN,唯有 IS NULL / IS NOT NULL 或 ISNULL()、COALESCE()、IFNULL() 等函數能正確判斷。
IS NULL / IS NOT NULL,跨資料庫可攜性最好。COALESCE(col, 'default') 或 IFNULL(col, 'default')(MySQL 專用)。EXPLAIN 驗證索引使用情況,必要時建立部分索引(MySQL 8.0+ 支援)或調整查詢條件。