首页/数据/数据库速查/子查询(标量 / IN / EXISTS 变体)
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

子查询(标量 / IN / EXISTS 变体)

子查询可出现在 SELECT 列表、WHERE、FROM;相关子查询与外层行数挂钩,能用 JOIN 改写时通常更快。

数据库速查数据更新于 2026-10-12
用途嵌套查询
类型标量子查询 / IN / ANY / ALL / EXISTS
改写JOIN / 派生表

标量与非相关子查询

标量与非相关子查询
SELECT id, amount, (SELECT AVG(amount) FROM orders) AS avg_all FROM orders;
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE city='Hangzhou');

相关子查询与 EXISTS

相关子查询与 EXISTS
SELECT u.id FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id=u.id AND o.amount>1000);
MySQL 8 对 IN 子查询有半连接优化;但大结果集仍建议用 JOIN 或 EXISTS 做等价改写并对比执行计划。

易错点

  • 相关子查询每行执行一次,外层行数大时会非常慢
  • 标量子查询返回多行会报错 Subquery returns more than 1 row

数据来源与参考

  • MySQL 8.0 Reference Manual: Subqueries

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌