NULL 在 SQL 中無處不在,卻常被誤解。本文系統梳理 NULL 的核心定義、三值邏輯真相表、在不同語境下的特殊判斷規則(WHERE/CHECK/UNIQUE/GROUP BY/ORDER BY/集合運算),助您避開邏輯陷阱,編寫更健壯的 T-SQL。
TRUE、FALSE、UNKNOWN。傳統程式語言只有真/假,SQL 獨有 UNKNOWN,且 NOT UNKNOWN = UNKNOWN(不同於二值邏輯的 NOT TRUE = FALSE)。NULL > 32 -- UNKNOWN
NULL = NULL -- UNKNOWN
X + NULL > Y -- UNKNOWN
NULL <> NULL -- UNKNOWN
計算結果為 UNKNOWN 的列不會進入下一個結果集。這是最常見的「NULL 不會被 = 或 <> 比對選中」的原因。
這是為了允許可選欄位(未定義 NOT NULL)插入 NULL 值。例:
CREATE TABLE test (Name VARCHAR(10), age INT);
ALTER TABLE test ADD CONSTRAINT ck_age CHECK (age > 0);
INSERT INTO test VALUES ('bluesky', NULL); -- 成功,因 NULL 在 CHECK 中視為 TRUE

含 UNIQUE 約束的欄位只能插入一個 NULL。第二個 NULL 會違反唯一性。
ALTER TABLE test ADD UNIQUE (Name);
INSERT INTO test VALUES (NULL, 12), (NULL, 13); -- 錯誤:重複的 NULL

INSERT INTO test VALUES (NULL, 12), (NULL, 13);
SELECT Name, SUM(age) AS sumage FROM test GROUP BY Name;
-- 結果:NULL 被聚合為單一群組

預設 NULL 排在最前(ASC)或最後(DESC),但所有 NULL 相鄰。
集合比較時,NULL 與 NULL 視為重複值,只會保留一行。
IS NULL / IS NOT NULL 而非 = NULL 判斷缺失值。WHERE col = 'value' OR col IS NULL。col IS NOT NULL。WHERE col IS NOT NULL。總結:識別 NULL 在不同情境下被視為 UNKNOWN、TRUE 或 FALSE,是寫出正確 SQL 與資料庫設計的關鍵。