MySQL 空值(NULL)处理深度指南

MySQL 空值(NULL)处理深度指南

⚠️ NULL 处理的八大关键注意事项

1. NULL 的本质特性

SELECT NULL = NULL;   -- NULL (不是true!)
SELECT NULL IS NULL;  -- 1 (true)
SELECT 1 + NULL;      -- NULL

核心认知

  • NULL 表示未知不存在的值
  • 任何与 NULL 的运算结果都是 NULL
  • NULL 不等于空字符串 ''0

2. 比较运算符陷阱

-- 错误方式(返回空结果集)
SELECT * FROM employees WHERE bonus = NULL;

-- 正确方式
SELECT * FROM employees WHERE bonus IS NULL;
SELECT * FROM employees WHERE bonus IS NOT NULL;

3. 聚合函数中的 NULL 忽略

CREATE TABLE sales (amount INT);
INSERT INTO sales VALUES (100), (NULL), (200);

SELECT 
  SUM(amount)   -- 300 (忽略NULL)
  AVG(amount)   -- 150 (300/2)
  COUNT(amount) -- 2 (非NULL行数)
FROM sales;

4. 空值在索引中的处理

-- 普通索引不包含NULL值
ALTER TABLE products ADD INDEX idx_price (price);

-- 查询NULL值无法使用索引
SELECT * FROM products WHERE price IS NULL; -- 全表扫描

-- 解决方案:函数索引(MySQL 8.0+)
ALTER TABLE products 
  ADD INDEX idx_price_null (