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

資料庫 NULL 值深度解析:比較邏輯、NOT IN 陷阱、排序行為與實戰技巧

     編輯:MySQL 綜合教學

資料庫 NULL 值深度解析:比較邏輯、NOT IN 陷阱、排序行為與實戰技巧

NULL 代表「未知」,非 0、非空字串。任何與 NULL 的標準比較(=, <>, >, <)結果皆為 UNKNOWN,導致 WHERE 條件過濾掉該行。本文系統梳理 NULL 核心行為與避坑指南。

1. NULL 比較鐵律

SELECT NULL = NULL;    -- NULL (非 true)
SELECT NULL <> NULL;   -- NULL
SELECT NULL > 0;       -- NULL
SELECT NULL IS NULL;   -- TRUE
SELECT NULL IS NOT NULL; -- FALSE

正確判斷:IS NULL / IS NOT NULL。判斷兩欄位是否不同:IS DISTINCT FROM(標準 SQL,MySQL 8.0+ 支援)。

2. NOT IN + NULL 致命陷阱

-- 假設 packages 表有 user_id = NULL 的行
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM packages);
-- 等價於
SELECT * FROM users WHERE id != 1 AND id != 2 AND id != NULL;
-- 因 id != NULL 為 UNKNOWN,整個 AND 鏈結果為 UNKNOWN,返回空集!

解決方案:

  • 改用 NOT EXISTS:WHERE NOT EXISTS (SELECT 1 FROM packages WHERE user_id = users.id)(不受 NULL 影響)。
  • 子查詢過濾 NULL:WHERE id NOT IN (SELECT user_id FROM packages WHERE user_id IS NOT NULL)。

IN / EXISTS 不受此影響,因 OR 鏈中 UNKNOWN 被忽略。

3. NULL 排序行為

  • ORDER BY col ASC:NULL 排在最前(視為最小)。
  • ORDER BY col DESC:NULL 排在最後(視為最大)。
  • 若需控制:ORDER BY col ASC NULLS LAST(PostgreSQL/Oracle),MySQL 用 ORDER BY IS NULL, col 或 COALESCE(col, '默認值')。

4. 實戰技巧:COALESCE / NULLIF 防除零錯誤

-- 除數為 0 時返回 NULL 而非報錯
SELECT total_sales / NULLIF(num_users, 0) AS avg_sales;

-- 再將 NULL 轉為 0
SELECT COALESCE(total_sales / NULLIF(num_users, 0), 0) AS avg_sales;

NULLIF(x, y):x=y 返回 NULL,否則返回 x。
COALESCE(v1, v2, ...):返回第一個非 NULL 值。

5. 聚合函數與 NULL

  • COUNT(*):計算行數,包含 NULL。
  • COUNT(col) / SUM(col) / AVG(col):忽略 NULL行。
  • GROUP BY col:NULL 視為一個分組值。

總結

NULL 是三值邏輯的核心。牢記:比較用 IS NULL、NOT IN 禁用含 NULL 子查詢、排序用 COALESCE 控制、除法用 NULLIF 防錯。代碼審查時重點檢查這些模式。

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