NULL 是 SQL 新手最易混淆的概念。許多人誤以為 NULL 等同空字串 '',實則大相逕庭。本文系統整理 NULL 的行為特徵、正確操作方式與常見陷阱。
NULL vs 空字串:語意差異
INSERT INTO my_table (phone) VALUES (NULL); -- 電話號碼「未知」
INSERT INTO my_table (phone) VALUES (''); -- 「沒有電話」,確定為空
前者代表資料缺失,後者代表明確的空值。
正確的 NULL 判斷方式
| 操作目的 | 正確語法 | 錯誤語法 |
| 尋找 NULL 值 | WHERE phone IS NULL | WHERE phone = NULL(永遠不會匹配) |
| 尋找非 NULL 值 | WHERE phone IS NOT NULL | WHERE phone != NULL |
| 尋找空字串 | WHERE phone = '' | — |
NULL 的運算特性
- 任何與 NULL 運算(含比較)結果皆為 NULL
SELECT NULL, 1+NULL, CONCAT('Invisible', NULL) → 全部回傳 NULL
- 例外:
IFNULL()、COALESCE() 可處理 NULL
索引與 NULL
- MyISAM、InnoDB、BDB、MEMORY 引擎允許 NULL 欄位建立索引
- 其他引擎需宣告
NOT NULL 才能建索引
資料匯入與 NULL
LOAD DATA INFILE:空值或缺失欄位預設寫入 ''
- 需寫入 NULL 時,資料檔使用
\N 或字面值 NULL
排序與分組行為
DISTINCT、GROUP BY、ORDER BY 視所有 NULL 為相等
ORDER BY ASC:NULL 排最前;DESC:NULL 排最後
聚合函數處理
COUNT()、MIN()、SUM() 忽略 NULL 值
COUNT(*) 計算列數(含 NULL),COUNT(col) 計算非 NULL 個數
- 範例:
SELECT COUNT(*), COUNT(age) FROM person
特殊欄位類型的 NULL 行為
TIMESTAMP 欄位插入 NULL → 自動填入目前日期時間
AUTO_INCREMENT 整數欄位插入 NULL → 填入下一個序號
掌握 NULL 語意與操作規則,能避免查詢邏輯錯誤,確保資料完整性與業務正確性。
- 上一篇文章: ASP.NET + C# 實作資料庫 CRUD 完整範例:GridView 資料綁定與分頁
- 下一篇文章: MySQL 5.1 儲存程序、函數與複寫完整解析
Copyright ©
程式碼之家 All Rights Reserved