INSERT INTO t(phone) VALUES (NULL); -- 電話號碼未知
INSERT INTO t(phone) VALUES (''); -- 沒有電話 (明確為空)
語義完全不同,切勿混淆。
SELECT NULL = NULL; -- 0 (FALSE)
SELECT NULL <> NULL; -- 0 (FALSE)
SELECT NULL > 0; -- 0 (FALSE)
SELECT 1 + NULL; -- NULL
SELECT CONCAT('a', NULL); -- NULL
結論:任何與 NULL 的運算結果均為 NULL,除非函數文檔明確說明 (如 IFNULL)。
SELECT * FROM t WHERE phone = NULL; -- 永遠返回空集 (錯誤)
SELECT * FROM t WHERE phone IS NULL; -- 正確
SELECT * FROM t WHERE phone = ''; -- 查空字符串
NOT NULL 的列 不能 插入 NULL。NOT NULL。ORDER BY col ASC:NULL 排在最前;DESC 排在最後。GROUP BY col:所有 NULL 視為同一組。| 函數 | 語法 | 說明 | 示例 |
|---|---|---|---|
IFNULL | IFNULL(expr1, expr2) | expr1 非 NULL 返回 expr1,否則返回 expr2 | IFNULL(col, 0) |
COALESCE | COALESCE(v1, v2, ...) | 返回第一個非 NULL 值 | COALESCE(a,b,c,0) |
NULLIF | NULLIF(expr1, expr2) | 兩值相等返回 NULL,否則返回 expr1 | NULLIF(score, 0) |
ISNULL | ISNULL(expr) | expr 為 NULL 返回 1,否則 0 | ISNULL(col) |
跨數據庫對應:MySQL IFNULL ≈ Oracle NVL ≈ SQL Server ISNULL。
CREATE TABLE t(
col1 VARCHAR(10) NOT NULL,
col2 VARCHAR(10) NULL
);
INSERT INTO t VALUES ('', 'a'); -- OK
INSERT INTO t VALUES (NULL, 'b'); -- ERROR: col1 cannot be NULL
SELECT * FROM t WHERE col1 IS NOT NULL; -- 返回所有行 (空串不為 NULL)
SELECT * FROM t WHERE col1 <> ''; -- 只返回非空串行
SELECT * FROM t WHERE col2 <> ''; -- 同時過濾掉 NULL 和空串
總結:
col <> '' 會同時過濾掉 NULL 和空串。NOT NULL 只禁止 NULL,允許空串。NOT NULL DEFAULT '' 或 DEFAULT 0,減少 NULL 判斷邏輯。