首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

深度解析 SQL Server 中 NULL 的三值邏輯與特殊行為

     編輯:關於SqlServer

NULL 在 SQL 中無處不在,卻常被誤解。本文系統梳理 NULL 的核心定義、三值邏輯真相表、在不同語境下的特殊判斷規則(WHERE/CHECK/UNIQUE/GROUP BY/ORDER BY/集合運算),助您避開邏輯陷阱,編寫更健壯的 T-SQL。

核心定義

  1. NULL = 缺失的值,非零、非空字串、非預設值。
  2. 三值邏輯 (Three-Valued Logic):TRUE、FALSE、UNKNOWN。傳統程式語言只有真/假,SQL 獨有 UNKNOWN,且 NOT UNKNOWN = UNKNOWN(不同於二值邏輯的 NOT TRUE = FALSE)。

比較運算一律回傳 UNKNOWN

NULL > 32       -- UNKNOWN
NULL = NULL     -- UNKNOWN
X + NULL > Y    -- UNKNOWN
NULL <> NULL    -- UNKNOWN

語境相關的特殊處理規則

1. WHERE / ON / HAVING 過濾條件:UNKNOWN 視為 FALSE

計算結果為 UNKNOWN 的列不會進入下一個結果集。這是最常見的「NULL 不會被 = 或 <> 比對選中」的原因。

2. CHECK 約束:UNKNOWN 視為 TRUE

這是為了允許可選欄位(未定義 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

CHECK 約束允許插入 NULL

3. UNIQUE 約束:NULL 視為相等值

含 UNIQUE 約束的欄位只能插入一個 NULL。第二個 NULL 會違反唯一性。

ALTER TABLE test ADD UNIQUE (Name);
INSERT INTO test VALUES (NULL, 12), (NULL, 13);  -- 錯誤:重複的 NULL

UNIQUE 約束拒絕重複 NULL

4. GROUP BY:所有 NULL 分為同一群組

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

GROUP BY 將 NULL 分為一組

5. ORDER BY:NULL 排序在一起

預設 NULL 排在最前(ASC)或最後(DESC),但所有 NULL 相鄰。

6. 集合運算 (UNION, EXCEPT, INTERSECT):NULL 視為相等

集合比較時,NULL 與 NULL 視為重複值,只會保留一行。

實務建議

  • 使用 IS NULL / IS NOT NULL 而非 = NULL 判斷缺失值。
  • 在 WHERE 條件中,明確處理 NULL:WHERE col = 'value' OR col IS NULL。
  • 設計 CHECK 約束時,若需拒絕 NULL,請額外加上 col IS NOT NULL。
  • 理解 UNIQUE 只允許單一 NULL,若需多個 NULL 改用篩選唯一索引 WHERE col IS NOT NULL。

總結:識別 NULL 在不同情境下被視為 UNKNOWN、TRUE 或 FALSE,是寫出正確 SQL 與資料庫設計的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved