萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL NULL 值完整指南:概念辨析、查詢陷阱、索引限制與聚合行為

核心概念:NULL ≠ 空字串 ≠ 0

INSERT INTO t(phone) VALUES (NULL);    -- 電話未知
INSERT INTO t(phone) VALUES ('');      -- 無電話 (明確空值)
INSERT INTO t(phone) VALUES (0);       -- 數值 0

三者語意截然不同,NULL 代表「未知/不存在」。

NULL 比較鐵律

  • NULL = NULL → NULL (非 TRUE)
  • NULL <> NULL → NULL
  • NULL + 1、CONCAT('a', NULL) → NULL (任何運算遇 NULL 結果為 NULL)

正確判斷:IS NULL、IS NOT NULL、IFNULL()、COALESCE()、NULLIF()。

查詢常見陷阱

錯誤寫法結果正確寫法
WHERE phone = NULL永遠 0 行WHERE phone IS NULL
WHERE phone != 'abc'NULL 行被排除WHERE phone != 'abc' OR phone IS NULL
ORDER BY created_at DESCNULL 排最前 (ASC) 或最後 (DESC)明確指定 ORDER BY created_at IS NULL, created_at DESC

聚合函數對 NULL 的處理

  • COUNT(*):計算行數,**包含 NULL**
  • COUNT(col)、**SUM、AVG、MIN、MAX**:**忽略 NULL**
  • 例:SELECT COUNT(*), COUNT(age) FROM person; → 總行數 vs 有年齡的人數

特殊欄位類型的 NULL 行為

  • TIMESTAMP 插入 NULL → 自動填入 CURRENT_TIMESTAMP
  • AUTO_INCREMENT 整數欄位插入 NULL → 自動填入下一序號

索引與 NULL

  • MyISAM、InnoDB、MEMORY、BDB:**允許** 可為 NULL 的欄位建立索引
  • 其他引擎:索引欄位**必須**定義為 NOT NULL
  • 最佳實務:能 NOT NULL 就 NOT NULL,減少優化器判斷複雜度,節省 1 byte 旗標空間

排序與分組

  • DISTINCT、GROUP BY、ORDER BY 視所有 NULL 為相等值
  • ORDER BY col ASC:NULL 排最前;DESC:NULL 排最後

載入資料 (LOAD DATA INFILE)

  • 空值/缺漏欄位 → 寫入空字串 ''
  • 欲寫入 NULL → 資料檔使用 \N (大寫 N) 或字面 NULL
copyright © 萬盛學電腦網 all rights reserved