首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

深度解析 SQL 中的 NULL 值:陷阱、排序與實用技巧

     編輯:MySQL 資料庫相關知識

Tony Hoare 的「十億美元錯誤」在 SQL 中的體現

`NULL` 表示「缺失/未知」,導致三值邏輯 (TRUE/FALSE/UNKNOWN),是 SQL 最常見的 Bug 來源。

核心陷阱

情境錯誤寫法正確寫法
判斷是否為 NULL`col = NULL` / `col != NULL``col IS NULL` / `col IS NOT NULL`
比較兩欄位是否不同`col1 != col2` (含 NULL 失效)`col1 IS DISTINCT FROM col2` (標準 SQL)
`NOT IN` 子查詢含 NULL`WHERE id NOT IN (SELECT ...)` 子查詢有 NULL → 結果為空改用 `NOT EXISTS` 或 `LEFT JOIN ... IS NULL`
排序 `DESC` 時 NULL 排首位`ORDER BY score DESC``ORDER BY COALESCE(score,0) DESC` 或 `ORDER BY score DESC NULLS LAST` (PG/Oracle)

實用函數

  • `COALESCE(a,b,c...)`:返回第一個非 NULL 參數。`COALESCE(col, 0)` 替換 NULL 為 0。
  • `NULLIF(a, b)`:`a = b` 時返回 NULL,否則返回 `a`。避免除零錯誤:`total / NULLIF(cnt, 0)` → 結果為 NULL 而非報錯。
  • `IFNULL(a,b)` / `ISNULL(a)`:MySQL 專用簡寫。

除零防護範例

-- 醜陋的 CASE 寫法
SELECT CASE WHEN num_users=0 THEN 0 ELSE total_sales/num_users END;

-- 優雅的 NULLIF + COALESCE
SELECT COALESCE(total_sales / NULLIF(num_users, 0), 0);

最佳實踐清單

  1. 欄位定義預設 `NOT NULL`,必要時才允許 `NULL`。
  2. 永不使用 `= NULL` / `!= NULL`,一律 `IS NULL` / `IS NOT NULL`。
  3. 子查詢去重/反匹配優先用 `EXISTS`/`NOT EXISTS`,避開 `IN`/`NOT IN` NULL 陷阱。
  4. 排序明確指定 NULL 位置或用 `COALESCE` 預處理。
  5. 數學運算除數用 `NULLIF` 防零。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved