直接回答:因为 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 例外)。