首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL NULL 值處理完全指南:比較陷阱、索引限制、排序規則、實用函數

     編輯:MySQL 綜合教學

NULL 的本質:不是值,是「未知」/「不存在」

NULL ≠ 0 ≠ '' (空字符串)。NULL 表示「不知道值是多少」或「這個屬性不存在」。

比較運算符陷阱:所有與 NULL 比較結果均為 NULL (即 FALSE)


SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
-- 結果全為 NULL (在 WHERE 中視為 FALSE)

-- 正確判斷
SELECT 1 IS NULL, 1 IS NOT NULL;
-- 結果: 0 (FALSE), 1 (TRUE)

鐵律:永遠用 IS NULL / IS NOT NULL 判斷 NULL,絕不使用 =、!=、<、>。

NULL 在表達式中的傳播性


SELECT NULL, 1 + NULL, CONCAT('Invisible', NULL);
-- 結果全為 NULL

任何包含 NULL 的算術/字符串/函數運算,結果均為 NULL (除非函數文檔明確說明處理 NULL,如 IFNULL、COALESCE、CONCAT_WS)。

查詢 NULL 值的正確姿勢


-- 錯誤:永遠返回空結果
SELECT * FROM my_table WHERE phone = NULL;

-- 正確
SELECT * FROM my_table WHERE phone IS NULL;      -- 找 NULL
SELECT * FROM my_table WHERE phone = '';         -- 找空字符串
SELECT * FROM my_table WHERE phone IS NULL OR phone = '';  -- 找「無電話」

NULL 的特殊約束與行為

場景行為注意
索引列MyISAM/InnoDB 5.6+ 允許索引 NULL 列,但**主鍵列不能為 NULL**早期版本不允許索引 NULL 列
ORDER BYASC 時 NULL 排最前,DESC 時 NULL 排最後ORDER BY col IS NULL, col 可控制 NULL 位置
GROUP BY所有 NULL 視為同一組COUNT(col) 不統計 NULL,COUNT(*) 統計行數含 NULL
UNIQUE 索引允許**多個 NULL** (視為不同值)SQL Server 僅允許一個 NULL,差異巨大!
首個 TIMESTAMP 列插入 NULL自動賦值為當前時間特殊行為,非標準 NULL 語義
AUTO_INCREMENT 列插入 NULL/0自動生成下一個序列值標準行為

NULL 處理實用函數工具箱

函數語法說明示例結果
IFNULLIFNULL(expr1, expr2)expr1 不為 NULL 返回 expr1,否則返回 expr2IFNULL(NULL, 'N/A') → 'N/A'
COALESCECOALESCE(expr1, expr2, ...)返回第一個非 NULL 參數,**標準 SQL,多參數首選**COALESCE(NULL, NULL, 3, 4) → 3
NULLIFNULLIF(expr1, expr2)expr1 = expr2 返回 NULL,否則返回 expr1NULLIF(5, 5) → NULL
ISNULLISNULL(expr)expr 為 NULL 返回 1,否則 0 (MySQL 專用,等同 expr IS NULL)ISNULL(NULL) → 1
CONCAT_WSCONCAT_WS(sep, str1, str2, ...)跳過 NULL 參數拼接,**拼接字段首選**CONCAT_WS(',', 'a', NULL, 'c') → 'a,c'

最佳實踐建議

  1. 業務語義明確區分:NULL = 未知/不適用,''/0 = 已知為空/零。表設計時明確註釋
  2. 關鍵業務列定義 NOT NULL + DEFAULT:status TINYINT NOT NULL DEFAULT 0,避免 NULL 污染邏輯判斷
  3. WHERE 條件防 NULL 註入:WHERE col = 'value' OR col IS NULL 視業務而定,勿漏判
  4. 聚合函數注意 NULL:SUM(col) 忽略 NULL,全 NULL 返回 NULL (非 0)。用 COALESCE(SUM(col), 0) 兜底
  5. 外鍵關聯列慎用 NULL**:若允許 NULL,外鍵約束不生效 (不檢查 NULL 行),可能導致孤兒數據
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved