温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么理解相关嵌套查询

发布时间:2026-10-13 08:15:09 来源:亿速云 阅读:103 作者:小樊 栏目:数据库

“相关嵌套查询”(Correlated Subquery)是数据库 SQL 查询里一个很重要、也常让人困惑的概念。我分层次给你讲清楚。


一、先理解“嵌套查询”

嵌套查询就是一个查询里面套着另一个查询,例如:

SELECT *
FROM student
WHERE score > (
    SELECT AVG(score)
    FROM student
);

这里的子查询:

SELECT AVG(score) FROM student
  • 只执行一次
  • 不依赖外层查询

这叫不相关子查询(非相关子查询)


二、什么是“相关嵌套查询”

相关嵌套查询:子查询依赖外层查询的值,外层每取一行,子查询都要重新执行一次。

关键特征

  • 子查询中引用了外层表的列
  • 执行顺序不是“先子后外”,而是“外→子→外”

三、一个典型例子

需求:

查找出每个班级中分数高于本班平均分的学生

SELECT s1.name, s1.class, s1.score
FROM student s1
WHERE s1.score > (
    SELECT AVG(s2.score)
    FROM student s2
    WHERE s2.class = s1.class
);

重点在这里:

WHERE s2.class = s1.class
  • s1.class 是外层查询的列
  • 子查询依赖外层的值
  • 对 s1 的每一行,都要重新算一次“该班平均分”

✅ 这就是相关嵌套查询


四、执行过程(理解核心)

相关子查询不是一次性算完,而是:

  1. 外层取一行(如 class = 1)
  2. 执行子查询(算 class=1 的平均分)
  3. 判断条件
  4. 外层取下一行
  5. 再执行子查询
  6. 重复……

⚠️ 性能通常比 JOIN 差


五、相关子查询 vs 不相关子查询

对比点 不相关子查询 相关子查询
是否依赖外层 否 是
执行次数 一次 多次
性能 较好 较差
典型用途 全局条件 行间比较

六、常见使用场景

  • 每行与“自己所在组”比较
  • 存在性判断(EXISTS)
  • 排名、最大值、最新记录

EXISTS 例子:

SELECT *
FROM student s
WHERE EXISTS (
    SELECT 1
    FROM award a
    WHERE a.stu_id = s.id
);

七、一句话总结

相关嵌套查询 = 子查询“盯着”外层每一行,边走边算

如果你愿意,我也可以用图示、执行计划,或改成 JOIN 写法帮你进一步理解。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手