NULL 代表「未知」,非 0、非空字串。任何與 NULL 的標準比較(=, <>, >, <)結果皆為 UNKNOWN,導致 WHERE 條件過濾掉該行。本文系統梳理 NULL 核心行為與避坑指南。
SELECT NULL = NULL; -- NULL (非 true) SELECT NULL <> NULL; -- NULL SELECT NULL > 0; -- NULL SELECT NULL IS NULL; -- TRUE SELECT NULL IS NOT NULL; -- FALSE
正確判斷:IS NULL / IS NOT NULL。判斷兩欄位是否不同:IS DISTINCT FROM(標準 SQL,MySQL 8.0+ 支援)。
-- 假設 packages 表有 user_id = NULL 的行 SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM packages); -- 等價於 SELECT * FROM users WHERE id != 1 AND id != 2 AND id != NULL; -- 因 id != NULL 為 UNKNOWN,整個 AND 鏈結果為 UNKNOWN,返回空集!
解決方案:
NOT EXISTS:WHERE NOT EXISTS (SELECT 1 FROM packages WHERE user_id = users.id)(不受 NULL 影響)。WHERE id NOT IN (SELECT user_id FROM packages WHERE user_id IS NOT NULL)。IN / EXISTS 不受此影響,因 OR 鏈中 UNKNOWN 被忽略。
ORDER BY col ASC:NULL 排在最前(視為最小)。ORDER BY col DESC:NULL 排在最後(視為最大)。ORDER BY col ASC NULLS LAST(PostgreSQL/Oracle),MySQL 用 ORDER BY IS NULL, col 或 COALESCE(col, '默認值')。-- 除數為 0 時返回 NULL 而非報錯 SELECT total_sales / NULLIF(num_users, 0) AS avg_sales; -- 再將 NULL 轉為 0 SELECT COALESCE(total_sales / NULLIF(num_users, 0), 0) AS avg_sales;
NULLIF(x, y):x=y 返回 NULL,否則返回 x。COALESCE(v1, v2, ...):返回第一個非 NULL 值。
COUNT(*):計算行數,包含 NULL。COUNT(col) / SUM(col) / AVG(col):忽略 NULL行。GROUP BY col:NULL 視為一個分組值。NULL 是三值邏輯的核心。牢記:比較用 IS NULL、NOT IN 禁用含 NULL 子查詢、排序用 COALESCE 控制、除法用 NULLIF 防錯。代碼審查時重點檢查這些模式。