首页/数据/SQL 速查/相关子查询

相关子查询

子查询引用外层查询的列,逻辑上逐行求值;配合内表索引可高效,否则每行一次扫描。

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

示例

示例
SELECT u.id, u.name,
       (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_cnt
FROM users u
WHERE u.status = 1;
形式子查询引用外层列(这里 u.id)
性能内表连接键上有索引是前提
改写可转 LEFT JOIN + GROUP BY 或窗口函数

易错点

  • 先缩小外层结果再执行相关子查询,否则代价随外层行数线性增长
  • 把相关子查询改成 JOIN 聚合后注意口径:无匹配用户是否要保留(LEFT JOIN)

数据来源与参考

  • MySQL 8.0 Reference Manual · Correlated Subqueries
  • PostgreSQL Documentation · Scalar Subqueries
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌