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

MySQL NULL 值處理完全指南:IS NULL、<=>、索引影響與應用層避坑

     編輯:MySQL 資料庫相關知識

NULL 代表「值未知」,非空字串、非零、非假。任何與 NULL 的比較(=、!=、<、>)結果皆為 NULL(視為假),這是 SQL 三值邏輯的核心。本文系統整理 NULL 判斷運算子、索引存儲特性、聚合函數行為、應用層處理模式與避坑清單。

一、NULL 判斷運算子

運算子語法結果(當 col 為 NULL)說明
IS NULLcol IS NULLTRUE標準檢查
IS NOT NULLcol IS NOT NULLFALSE標準檢查
<=>col <=> valNULL <=> NULL 為 TRUE空值安全相等,等同 (col = val) OR (col IS NULL AND val IS NULL)
COALESCECOALESCE(col, 'default')'default'回傳第一個非 NULL 參數
IFNULLIFNULL(col, 'default')'default'MySQL 專用,兩參數
NULLIFNULLIF(col, val)若 col=val 則 NULL 否則 col反向操作

二、常見錯誤與正確寫法

-- ❌ 錯誤:任何與 NULL 比較皆為 NULL(假)
SELECT * FROM t WHERE col = NULL;
SELECT * FROM t WHERE col != NULL;
SELECT * FROM t WHERE col = '';  -- 空字串 ≠ NULL

-- ✅ 正確
SELECT * FROM t WHERE col IS NULL;
SELECT * FROM t WHERE col IS NOT NULL;
SELECT * FROM t WHERE col <=> NULL;  -- 等同 IS NULL

-- ✅ 空值安全相等(參數可能為 NULL)
SELECT * FROM t WHERE col <=> ?;  -- 預處理參數安全

三、NULL 在索引中的特性

  • InnoDB 二級索引:預設存儲 NULL 值(可被索引查找),WHERE col IS NULL 可走索引。
  • 主鍵/唯一索引:不允許 NULL(主鍵),唯一索引允許多個 NULL(因 NULL ≠ NULL)。
  • 複合索引:若前導欄位為 NULL,後續欄位仍可被索引(不像某些資料庫要求前導非 NULL)。
  • 統計資訊: ANALYZE TABLE 計算 Cardinality 時會統計 NULL 比例,影響執行計劃選擇。

四、聚合函數與 NULL

函數NULL 處理範例結果
COUNT(*)計算行數,包含 NULL10 行 → 10
COUNT(col)計算非 NULL 個數3 NULL, 7 非 NULL → 7
SUM/AVG忽略 NULLSUM(1,2,NULL)=3, AVG=1.5
MAX/MIN忽略 NULL,全 NULL 回傳 NULLMAX(1,NULL)=1
GROUP_CONCAT忽略 NULL'a,b' (跳過 NULL)

五、應用層處理模式

PHP (PDO)

$stmt = $pdo->prepare('SELECT * FROM users WHERE status <=> ?');
$stmt->execute([$status]);  // $status 可能為 null
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Java (MyBatis)

Python (SQLAlchemy)

from sqlalchemy import or_
# 參數可能為 None
q = session.query(User).filter(or_(User.status == status, User.status.is_(None)))

六、避坑清單

  1. NOT IN 子查詢含 NULL 會回傳空集: WHERE id NOT IN (SELECT cid FROM t WHERE cid IS NULL) → 永無結果。改用 NOT EXISTS 或 LEFT JOIN ... WHERE t.cid IS NULL。
  2. ORDER BY 預設 NULL 排最後(ASC)或最前(DESC):需明確 ORDER BY col IS NULL, col ASC 控制位置。
  3. UNIQUE 索引允許多 NULL:業務主鍵勿用可 NULL 欄位,或加 WHERE col IS NOT NULL 部分索引(8.0+ 支援)。
  4. 外鍵欄位允許 NULL 表示無關聯:需確保應用層邏輯一致。
  5. JSON 欄位的 NULL vs 缺失鍵: JSON_EXTRACT(doc, '$.a') 回傳 NULL 可能是鍵不存在或值為 null,用 JSON_CONTAINS_PATH 區分。

理解 NULL 的三值邏輯,並在查詢、索引、應用層統一處理規範,能消除一大類難以復現的資料不一致 Bug。

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