INSERT INTO t(phone) VALUES (NULL); -- 電話未知
INSERT INTO t(phone) VALUES (''); -- 無電話 (明確空值)
INSERT INTO t(phone) VALUES (0); -- 數值 0
三者語意截然不同,NULL 代表「未知/不存在」。
NULL = NULL → NULL (非 TRUE)NULL <> NULL → NULLNULL + 1、CONCAT('a', NULL) → NULL (任何運算遇 NULL 結果為 NULL)正確判斷:IS NULL、IS NOT NULL、IFNULL()、COALESCE()、NULLIF()。
| 錯誤寫法 | 結果 | 正確寫法 |
|---|---|---|
WHERE phone = NULL | 永遠 0 行 | WHERE phone IS NULL |
WHERE phone != 'abc' | NULL 行被排除 | WHERE phone != 'abc' OR phone IS NULL |
ORDER BY created_at DESC | NULL 排最前 (ASC) 或最後 (DESC) | 明確指定 ORDER BY created_at IS NULL, created_at DESC |
COUNT(*):計算行數,**包含 NULL**COUNT(col)、**SUM、AVG、MIN、MAX**:**忽略 NULL**SELECT COUNT(*), COUNT(age) FROM person; → 總行數 vs 有年齡的人數TIMESTAMP 插入 NULL → 自動填入 CURRENT_TIMESTAMPAUTO_INCREMENT 整數欄位插入 NULL → 自動填入下一序號NOT NULLDISTINCT、GROUP BY、ORDER BY 視所有 NULL 為相等值ORDER BY col ASC:NULL 排最前;DESC:NULL 排最後''\N (大寫 N) 或字面 NULL