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

Oracle NULL 值完整指南:特性、比較陷阱、NVL 處理、索引限制與實戰查詢案例

     編輯:Oracle 資料庫基礎

NULL 定義與約束

  • 含義:未知、不存在、無值。長度為 0。
  • 允許任意類型列為 NULL,除非:
    1. 主鍵列(PRIMARY KEY)
    2. 定義了 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 條

最佳實踐

  1. 業務語義明確的「必填」列務必加 NOT NULL。
  2. 查詢條件涉及可空列時,始終考慮 IS NULL 或 NVL 覆蓋。
  3. 統計計數用 COUNT(NVL(col,0)) 或 COUNT(*)(不忽略全 NULL 行)。
  4. 索引設計避開高比例 NULL 列,或使用位圖索引/函數索引 NVL(col,'NULL')。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved