首页/数据/SQL 速查/反连接:找出不存在于另一表的行
本包目录(311 条)

反连接:找出不存在于另一表的行

反连接三种写法:NOT EXISTS、NOT IN、LEFT JOIN IS NULL;语义与 NULL 行为各不相同,优先 NOT EXISTS。

SQL 速查数据更新于 2026-10-12

三种写法

三种写法
-- 1) NOT EXISTS:与 NULL 无关
SELECT * FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blacklist b WHERE b.user_id = u.id);

-- 2) NOT IN:子查询含 NULL 时结果为空
SELECT * FROM users u
WHERE u.id NOT IN (SELECT user_id FROM blacklist);

-- 3) LEFT JOIN IS NULL
SELECT u.* FROM users u
LEFT JOIN blacklist b ON b.user_id = u.id
WHERE b.user_id IS NULL;
NOT EXISTS推荐;子查询列可空也安全
NOT IN子查询结果含 NULL 时整体为空
LEFT JOIN IS NULL判空列必须 NOT NULL(如主键)

易错点

  • NOT IN 子查询列可空时结果可能为空,这是线上常见的反连接错误
  • LEFT JOIN + IS NULL 的判空列要选主键这类 NOT NULL 列,否则匹配但列为空的行会被误判

数据来源与参考

  • MySQL 8.0 Reference Manual · Subqueries · NOT EXISTS
  • PostgreSQL Documentation · Subquery Expressions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌