在 SQL 中,NULL 代表「未知」或「不存在」,而非空字串或零值。查詢空值必須使用 IS NULL / IS NOT NULL,不可使用 = NULL 或 != NULL。本文詳細說明正確語法與常見誤區。
mysql> UPDATE test SET t_birth = NULL WHERE t_id = 1;
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM test;
+------+--------+----------------------------------+------------+
| t_id | t_name | t_password | t_birth |
+------+--------+----------------------------------+------------+
| 1 | name1 | 12345678901234567890123456789012 | NULL |
| 2 | name2 | 12345678901234567890123456789012 | 2013-01-01 |
+------+--------+----------------------------------+------------+
mysql> SELECT * FROM test WHERE t_birth IS NULL;
+------+--------+----------------------------------+---------+
| t_id | t_name | t_password | t_birth |
+------+--------+----------------------------------+---------+
| 1 | name1 | 12345678901234567890123456789012 | NULL |
+------+--------+----------------------------------+---------+
mysql> SELECT * FROM test WHERE t_birth IS NOT NULL;
+------+--------+----------------------------------+------------+
| t_id | t_name | t_password | t_birth |
+------+--------+----------------------------------+------------+
| 2 | name2 | 12345678901234567890123456789012 | 2013-01-01 |
+------+--------+----------------------------------+------------+
| 查詢目的 | 正確語法 | 錯誤示範 |
|---|---|---|
| 欄位為 NULL | WHERE col IS NULL | WHERE col = NULL ❌ |
| 欄位不為 NULL | WHERE col IS NOT NULL | WHERE col != NULL ❌ |
NULL、null、Null 皆可。'' 是長度為 0 的字串,IS NULL 不會匹配。COUNT(col) 忽略 NULL,COUNT(*) 計算所有列。ORDER BY col ASC 時 NULL 排最前,DESC 排最後。-- 找出未設定生日的用戶
SELECT * FROM users WHERE birthday IS NULL;
-- 統計有效郵箱數量
SELECT COUNT(email) FROM users WHERE email IS NOT NULL;
-- COALESCE 替換 NULL 顯示預設值
SELECT name, COALESCE(phone, '未提供') AS phone FROM users;
正確處理 NULL 是資料查詢準確性的基石。請養成使用 IS NULL / IS NOT NULL 的習慣,並善用 COALESCE、IFNULL 等函數處理顯示邏輯,避免因三值邏輯導致的業務錯誤。