NULL 定義與約束
- 含義:未知、不存在、無值。長度為 0。
- 允許任意類型列為 NULL,除非:
- 主鍵列(
PRIMARY KEY)
- 定義了
NOT NULL 約束的列
核心特性
| 特性 | 說明 |
| 非值 | ≠ 0、≠ 空字符串 ''、≠ 空格 |
| 運算傳遞性 | 任何算術運算(+ - * /)涉及 NULL,結果均為 NULL |
| 比較語法 | 必須用 IS NULL / IS NOT NULL;= NULL 永遠不匹配 |
| 處理函數 | NVL(expr1, expr2):expr1 為 NULL 時返回 expr2 |
| 索引限制 | 全 NULL 的鍵值不進入 B-Tree 索引,COUNT(*) 需配合 NVL(col,0) |
| 排序規則 | 默認升序時 NULL 排在最後(視為最大值) |
經典陷阱演示
SELECT 1 FROM dual WHERE NULL = NULL; -- 無記錄
SELECT 1 FROM dual WHERE NULL = ''; -- 無記錄
SELECT 1 FROM dual WHERE '' = ''; -- 無記錄
SELECT 1 FROM dual WHERE NULL IS NULL; -- 返回 1
SELECT 1 FROM dual WHERE NVL(NULL,0)=NVL(NULL,0); -- 返回 1
SELECT 1+NULL FROM dual; -- 返回 NULL(一條記錄,值為 NULL)
實戰案例:銷售表查詢遺漏空值
CREATE TABLE sale (month CHAR(6), sell NUMBER);
-- 插入 11 條有值記錄,1 條 sell 為 NULL(200009 月)
SELECT * FROM sale WHERE sell LIKE '%'; -- 僅返回 11 條,遺漏 NULL 行
-- 正確寫法:
SELECT * FROM sale WHERE sell LIKE '%' OR sell IS NULL;
-- 或
SELECT * FROM sale WHERE NVL(sell,0) LIKE '%'; -- 返回全 12 條
最佳實踐
- 業務語義明確的「必填」列務必加
NOT NULL。
- 查詢條件涉及可空列時,始終考慮
IS NULL 或 NVL 覆蓋。
- 統計計數用
COUNT(NVL(col,0)) 或 COUNT(*)(不忽略全 NULL 行)。
- 索引設計避開高比例 NULL 列,或使用位圖索引/函數索引
NVL(col,'NULL')。