“相关嵌套查询”(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 是外层查询的列✅ 这就是相关嵌套查询
相关子查询不是一次性算完,而是:
⚠️ 性能通常比 JOIN 差
| 对比点 | 不相关子查询 | 相关子查询 |
|---|---|---|
| 是否依赖外层 | 否 | 是 |
| 执行次数 | 一次 | 多次 |
| 性能 | 较好 | 较差 |
| 典型用途 | 全局条件 | 行间比较 |
SELECT *
FROM student s
WHERE EXISTS (
SELECT 1
FROM award a
WHERE a.stu_id = s.id
);
相关嵌套查询 = 子查询“盯着”外层每一行,边走边算
如果你愿意,我也可以用图示、执行计划,或改成 JOIN 写法帮你进一步理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。