INSERT INTO my_table (phone) VALUES (NULL); -- 電話號碼未知
INSERT INTO my_table (phone) VALUES (''); -- 沒有電話(明確為空)
NULL 代表「值未知/不存在」,是一種狀態而非具體數值。
NULL = NULL → FALSE(未知 = 未知,結果未知)NULL <> NULL → FALSENULL > 5 → FALSE1 + NULL → NULL(任何含 NULL 運算結果為 NULL)CONCAT('a', NULL) → NULL結論:永遠不要用 = NULL 或 <> NULL 判斷,必須用 IS NULL / IS NOT NULL。
-- 錯誤:返回 0 行 SELECT * FROM my_table WHERE phone = NULL; -- 正確:查找 NULL SELECT * FROM my_table WHERE phone IS NULL; -- 正確:查找空字符串 SELECT * FROM my_table WHERE phone = '';
NOT NULL)。| 場景 | NULL 位置 |
|---|---|
| ORDER BY col ASC | 最前面 |
| ORDER BY col DESC | 最後面 |
| GROUP BY col | 所有 NULL 歸為同一組 |
| 函數 | 語法 | 邏輯 | 示例 |
|---|---|---|---|
| IFNULL | IFNULL(expr1, expr2) | expr1 不為 NULL 返回 expr1,否則 expr2 | IFNULL(NULL, 'N/A') → 'N/A' |
| COALESCE | COALESCE(v1, v2, ...) | 返回第一個非 NULL 參數(標準 SQL,推薦) | COALESCE(NULL, NULL, 3) → 3 |
| NULLIF | NULLIF(expr1, expr2) | 兩值相等返回 NULL,否則返回 expr1 | NULLIF(5,5) → NULL |
| ISNULL | ISNULL(expr) | expr 為 NULL 返回 1,否則 0(MySQL 特有) | ISNULL(NULL) → 1 |
Oracle 對應:NVL(expr1, expr2) ≈ IFNULL;NVL2(expr1, expr2, expr3) 更強大。
CREATE TABLE `test` ( `col1` VARCHAR(10) NOT NULL, -- 不允許 NULL `col2` VARCHAR(10) NULL -- 允許 NULL );
| 語句 | 結果 | 說明 |
|---|---|---|
INSERT VALUES (NULL, 1) | 報錯 | col1 禁止 NULL |
INSERT VALUES ('', 1) | 成功 | 空字符串 ≠ NULL |
INSERT VALUES ('', NULL) | 成功 | col2 允許 NULL |
SELECT * WHERE col1 IS NOT NULL | 返回所有行 | 空字符串不為 NULL |
SELECT * WHERE col1 <> '' | 僅返回非空字符串行 | 精確過濾空串 |
SELECT * WHERE col2 <> '' | 同時排除 NULL 和空串 | 隱性行為:<> '' 視 NULL 為「無意義內容」而過濾 |
= NULL。COALESCE(col, 0)、IFNULL(col, '') 參與計算/拼接。<> '' 連帶過濾 NULL:利用此特性簡化「有實際內容」查詢。理解 NULL 的三值邏輯與 MySQL 具體行為,是寫出正確、健壯 SQL 的基石。