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

深度解析 SQL NULL:三值邏輯、運算黑洞、統計函數行為、排序與約束的特殊規則

     編輯:關於SqlServer

NULL 的本質

NULL ≠ 空字串 ≠ 0。**NULL 代表「未知」或「不存在」**。它是合法的資料值,屬於該欄位定義的定義域 (Domain),只是內容未定義。

核心特性速查

操作結果說明
算術運算 (+ - * /)NULL「運算黑洞」:任何與 NULL 運算皆得 NULL
比較 (=, <>, >, <...)UNKNOWNNULL = NULL 為 UNKNOWN,非 TRUE/FALSE
IS NULL / IS NOT NULLTRUE/FALSE**唯一**正確檢測 NULL 的方式
邏輯運算 (AND/OR/NOT)三值邏輯TRUE/FALSE/UNKNOWN 真值表 (見下)
彙總函數 (SUM, AVG, COUNT(col))忽略 NULLCOUNT(*) 計列數含 NULL,COUNT(col) 不含
ORDER BY實作相依SQL 標準未強制,SQL Server 預設 NULL 排最前
CHECK 約束UNKNOWN 視為通過約束只拒絕 FALSE,NULL 視為滿足
WHERE/HAVING只接受 TRUEUNKNOWN 被過濾掉

三值邏輯真值表


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 等同被過濾。

經典陷阱與對策

1. NOT IN 子查詢含 NULL → 空結果


-- 危險
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);

2. 統計函數 COUNT(*) vs COUNT(col)


-- 表 T: C 欄位值 (1, 2, NULL, NULL)
SELECT COUNT(*) FROM T;   -- 4 (列數)
SELECT COUNT(C) FROM T;   -- 2 (非 NULL 個數)

3. 串連字串時 NULL 導致整體變 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

4. 唯一索引與 NULL

SQL Server 允許唯一索引/約束包含 **單一 NULL** (視為唯一值)。多筆 NULL 會違反唯一性。其他 DBMS (Oracle, PostgreSQL) 允許多 NULL。


NULL 是關係模型的「黑洞」,不可迴避。掌握三值邏輯、統計函數語意、約束與 WHERE 的非對稱處理,並養成 **IS NULL / ISNULL / COALESCE / CONCAT** 防禦性寫法,是寫出健壯 SQL 的關鍵。

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