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

Oracle NULL值深度解析:特性、陷阱與最佳實踐

     編輯:Oracle 資料庫基礎

徹底搞懂Oracle中的NULL:不只是「空值」

NULL在Oracle中代表「未知」而非「空」,其特殊行為常導致查詢結果偏差。本文通過實測案例,系統梳理NULL的七大核心特性、運算規則、索引限制與正確處理模式。

核心特性速查表

特性說明
本質未知值,長度為0,非0、非空字串、非空格
約束限制主鍵欄位、NOT NULL欄位不可為NULL
運算結果任何算術運算(+ - * /)遇NULL結果皆為NULL
比較邏輯僅能用IS NULL/IS NOT NULL;=NULL、<>NULL永不為真
轉換函數推薦NVL(col, default)或COALESCE
索引行為B-tree索引不存儲全NULL鍵值,導致WHERE col IS NULL無法走索引
排序順序預設升序(ASC)時NULL排最後;降序(DESC)排最前

實測驗證:經典誤區現場

-- 錯誤示範:全回傳0行
SELECT 1 FROM dual WHERE NULL = NULL;
SELECT 1 FROM dual WHERE NULL = '';
SELECT 1 FROM dual WHERE '' = '';

-- 正確寫法:回傳1行
SELECT 1 FROM dual WHERE NULL IS NULL;
SELECT 1 FROM dual WHERE NVL(NULL,0) = NVL(NULL,0);

算術運算實測

SELECT 1+NULL, 1-NULL, 1*NULL, 1/NULL FROM dual;  -- 全部回傳NULL

實戰案例:銷售表含NULL月份的統計陷阱

CREATE TABLE sale (month CHAR(6), sell NUMBER);
INSERT INTO sale VALUES ('200009', NULL);  -- 9月無銷售資料
COMMIT;

錯誤查詢:SELECT * FROM sale WHERE sell LIKE '%'; → 漏掉NULL行(僅11筆)。
正確寫法:

-- 寫法1:顯式OR條件
SELECT * FROM sale WHERE sell LIKE '%' OR sell IS NULL;

-- 寫法2:NVL轉換(推薦,可走索引)
SELECT * FROM sale WHERE NVL(sell,0) LIKE '%';

結果:完整回傳12筆資料。

最佳實踐建議

  1. 業務語義上「不適用」優於「未知」時,建議定義DEFAULT 0或DEFAULT 'N/A'並加NOT NULL約束。
  2. 統計聚合時:COUNT(*)含NULL行,COUNT(col)忽略NULL;需用COUNT(NVL(col,0))。
  3. 外鍵關聯表若允許NULL,務必用LEFT JOIN並處理NULL顯示邏輯。
  4. 分區表/索引組織表中,NULL值分區策略需顯式規劃。

理解NULL的三值邏輯(TRUE/FALSE/UNKNOWN)與存儲機制,是編寫正確、高效SQL的基石。

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