核心觀念
NULL 代表「未知」或「無值」,不等於 0、空字串 '' 或 'NULL' 字串。
- 任何與
NULL 的比較 (=, !=, <, >) 結果皆為 NULL (即 false)。
- 只能用
IS NULL / IS NOT NULL 或 <=> (安全等於) 判斷。
基本語法與範例
-- 正確
WHERE col IS NULL;
WHERE col IS NOT NULL;
WHERE col <=> NULL; -- 安全等於,NULL <=> NULL 為 true
-- 錯誤
WHERE col = NULL; -- 永遠不會匹配
WHERE col != NULL; -- 永遠不會匹配
實戰演示
CREATE TABLE topic (
topicid SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
category VARCHAR(20) NOT NULL
) ENGINE=InnoDB;
INSERT INTO topic (name, category) VALUES
('java', 'rock'), ('css', 'opera'), ('c', 'dance');
-- 查詢 category 為 NULL (此處無資料)
SELECT * FROM topic WHERE category IS NULL; -- Empty set
-- 查詢 category 不為 NULL
SELECT * FROM topic WHERE category IS NOT NULL; -- 返回所有 3 筆
NULL 在 GROUP BY / ORDER BY 中的行為
- GROUP BY:所有
NULL 視為同一群組。
- ORDER BY ASC:
NULL 排在最前。
- ORDER BY DESC:
NULL 排在最後。
常見誤區與避坑
- NOT NULL 欄位插入 0/空字串:允許,因為 0 和
'' 是實際值,非 NULL。
- COUNT(col) vs COUNT(*):
COUNT(col) 忽略 NULL,COUNT(*) 計算所有行。
- NOT IN 子查詢含 NULL:若子查詢結果含 NULL,外層
NOT IN 永無結果。改用 NOT EXISTS 或 LEFT JOIN ... IS NULL。
- 唯一索引與 NULL:MySQL 允許多筆 NULL 共存於唯一索引欄位 (視為不同值)。
最佳實踐
- 業務上「無值」語義明確欄位,預設
NULL 而非空字串/0。
- 應用層統一處理 NULL 顯示邏輯,避免前端出現
null 字串。
- 關鍵欄位加
NOT NULL 約束,配合 DEFAULT 值減少判斷分支。