首页/数据/SQL 速查/IN 子查询与半连接
本包目录(311 条)

IN 子查询与半连接

IN 子查询表达“存在于另一张表”:只要找到匹配就返回该行,不放大行数;优化器通常把它改写为半连接。

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

示例

示例
SELECT *
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
语义左表行在子查询中存在即保留,每行至多出现一次
优化MySQL 8 半连接/物化;PostgreSQL 哈希半连接
对比JOIN 会输出两表列并按匹配行数放大

易错点

  • 子查询返回多列会直接报错,IN 子查询只允许一列
  • 大子查询与小外层的组合会让优化器选择物化,出现性能问题时对比 EXISTS 与 JOIN 计划

数据来源与参考

  • MySQL 8.0 Reference Manual · Optimizing Subqueries with Semijoin
  • PostgreSQL Documentation · IN
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌