NULL 代表「未知」或「不存在」,不等於空字串 ''、不等於 0、不等於 FALSE。誤解 NULL 語義是 SQL 新手最常見 Bug 來源。本文系統整理 MySQL 中 NULL 的比較規則、索引限制、聚合行為、特殊處理場景。
INSERT INTO contacts (phone) VALUES (NULL); -- 電話號碼未知
INSERT INTO contacts (phone) VALUES (''); -- 確定沒有電話
NULL = NULL → NULL (非 TRUE)NULL <> NULL → NULLNULL > 5 → NULL1 + NULL → NULLCONCAT('str', NULL) → NULL正確查詢 NULL:
WHERE phone IS NULL -- 找 NULL WHERE phone IS NOT NULL -- 找非 NULL WHERE phone = '' -- 找空字串 (非 NULL)
錯誤寫法:WHERE phone = NULL (永遠回傳 0 行)。
| 函數/運算子 | 行為 | 範例 |
|---|---|---|
IS NULL | 檢查是否為 NULL | WHERE col IS NULL |
IS NOT NULL | 檢查非 NULL | WHERE col IS NOT NULL |
IFNULL(expr1, expr2) | expr1 非 NULL 回傳 expr1,否則 expr2 | IFNULL(phone, 'N/A') |
COALESCE(v1, v2, ...) | 回傳第一個非 NULL 參數 (標準 SQL) | COALESCE(mobile, office, 'N/A') |
NULLIF(expr1, expr2) | 兩值相等回傳 NULL,否則回傳 expr1 | NULLIF(score, 0) |
<=> (NULL-safe equal) | NULL = NULL 回傳 1,其餘同 = | WHERE col <=> NULL |
NOT NULL 才能建索引。NOT NULL DEFAULT '' 或 DEFAULT 0,簡化查詢邏輯並縮小索引體積。''。\N (反斜線 + 大寫 N)。NULL。ORDER BY col ASC:NULL 排最前;DESC 時 NULL 排最後。GROUP BY、DISTINCT:所有 NULL 視為同一群組/值。SELECT COUNT(*), COUNT(age), SUM(age), AVG(age), MIN(age), MAX(age) FROM person;
COUNT(*):統計**行數**,包含 NULL 行。COUNT(col)、SUM、AVG、MIN、MAX:忽略 NULL 值。| 欄位類型 | 插入 NULL 行為 |
|---|---|
TIMESTAMP | 自動填入當前日期時間 (等同 CURRENT_TIMESTAMP) |
AUTO_INCREMENT 整數 | 自動填入下一個序列號 |
= NULL,一律 IS NULL / IS NOT NULL / <=>。IFNULL/COALESCE 統一處理前端顯示預設值。LOAD DATA 使用 \N 表示 NULL。COUNT(*) (總筆數) 與 COUNT(col) (非空筆數)。