直接回答:因为 SQL 用三值逻辑(TRUE/FALSE/UNKNOWN),NULL 表示"未知",任何值与 NULL 做 =、<> 比较结果都是 UNKNOWN,而 WHERE 只保留 TRUE 的行,所以 = null 永远查不到。正确写法是 IS NULL / IS NOT NULL。
展开解析:三值逻辑的连锁坑:
- NOT IN 子查询含 NULL 时整个条件恒为 UNKNOWN,结果为空集。
- COUNT(col) 跳过 NULL,COUNT(*) 不跳;SUM/AVG 同样忽略 NULL。
- 多数库的唯一索引允许多个 NULL(MySQL、PostgreSQL 均如此)。
-- 错误
SELECT * FROM users WHERE deleted_at = null;
-- 正确
SELECT * FROM users WHERE deleted_at IS NULL;
追问方向:三值逻辑对 NOT IN 的影响、NULL 与索引(B+ 树通常含 NULL 项,Oracle 例外)。