NULL ≠ 空字串 ≠ 0。**NULL 代表「未知」或「不存在」**。它是合法的資料值,屬於該欄位定義的定義域 (Domain),只是內容未定義。
| 操作 | 結果 | 說明 |
|---|---|---|
| 算術運算 (+ - * /) | NULL | 「運算黑洞」:任何與 NULL 運算皆得 NULL |
| 比較 (=, <>, >, <...) | UNKNOWN | NULL = NULL 為 UNKNOWN,非 TRUE/FALSE |
| IS NULL / IS NOT NULL | TRUE/FALSE | **唯一**正確檢測 NULL 的方式 |
| 邏輯運算 (AND/OR/NOT) | 三值邏輯 | TRUE/FALSE/UNKNOWN 真值表 (見下) |
| 彙總函數 (SUM, AVG, COUNT(col)) | 忽略 NULL | COUNT(*) 計列數含 NULL,COUNT(col) 不含 |
| ORDER BY | 實作相依 | SQL 標準未強制,SQL Server 預設 NULL 排最前 |
| CHECK 約束 | UNKNOWN 視為通過 | 約束只拒絕 FALSE,NULL 視為滿足 |
| WHERE/HAVING | 只接受 TRUE | UNKNOWN 被過濾掉 |
AND: T&T=T, T&F=F, T&U=U, F&F=F, F&U=F, U&U=U
OR: T|T=T, T|F=T, T|U=T, F|F=F, F|U=U, U|U=U
NOT: ~T=F, ~F=T, ~U=U
WHERE 條件最終必須評估為 **TRUE** 才保留該列;UNKNOWN 等同被過濾。
-- 危險
WHERE col NOT IN (SELECT nullable_col FROM ...);
-- 安全
WHERE NOT EXISTS (SELECT 1 FROM ... WHERE nullable_col = col);
-- 或
WHERE col NOT IN (SELECT nullable_col FROM ... WHERE nullable_col IS NOT NULL);
-- 表 T: C 欄位值 (1, 2, NULL, NULL)
SELECT COUNT(*) FROM T; -- 4 (列數)
SELECT COUNT(C) FROM T; -- 2 (非 NULL 個數)
SELECT 'Prefix_' + col + '_Suffix' FROM T; -- 若 col 為 NULL,整列結果 NULL
-- 對策
SELECT 'Prefix_' + ISNULL(col,'') + '_Suffix' FROM T;
-- 或 SQL 2012+
SELECT CONCAT('Prefix_', col, '_Suffix') FROM T; -- 自動忽略 NULL
SQL Server 允許唯一索引/約束包含 **單一 NULL** (視為唯一值)。多筆 NULL 會違反唯一性。其他 DBMS (Oracle, PostgreSQL) 允許多 NULL。
NULL 是關係模型的「黑洞」,不可迴避。掌握三值邏輯、統計函數語意、約束與 WHERE 的非對稱處理,並養成 **IS NULL / ISNULL / COALESCE / CONCAT** 防禦性寫法,是寫出健壯 SQL 的關鍵。