基础-子查询
1.前言
子查询分为嵌套子查询和相关子查询两类
嵌套子查询:子查询总共执行一次,执行完毕将值返回主查询
相关子查询:主查询执行一行,子查询执行一次,如此往复至主查询执行完毕
2.嵌套子查询
2.1.标量子查询
SELECT * FROM student WHERE score=(SELECT MAX(score) FROM student); SELECT * FROM student WHERE score>(SELECT AVG(score) FROM student);
2.2.列子查询
# SOME等价于ANY,IN等价于=ANY或=SOME,NOT IN等价于<>ALL SELECT * FROM student WHERE score>=ALL (SELECT score FROM student); SELECT * FROM student WHERE score>=ANY (SELECT AVG(score) FROM student GROUP BY class); SELECT * FROM student WHERE score IN (SELECT score FROM student WHERE date='2024-06-01'); # 等价于 SELECT * FROM student WHERE score=ANY (SELECT score FROM student WHERE date='2024-06-01'); SELECT * FROM student WHERE score NOT IN (SELECT score FROM student WHERE date='2024-06-01'); # 等价于 SELECT * FROM student WHERE score<>ALL (SELECT score FROM student WHERE date='2024-06-01');
2.3.行子查询
SELECT * FROM student1 WHERE (name,score)=(SELECT name,score FROM student2 WHERE name='Bob');
2.4.表子查询
SELECT * FROM student WHERE (class,score) IN (SELECT class,MAX(score) FROM student GROUP BY class);
3.相关子查询
SELECT * FROM student AS S1 WHERE score=(SELECT MAX(score) FROM student WHERE class=S1.class);
4.EXISTS
# EXISTS常用于相关子查询 # 查找在student1中但不在student2的学生信息 SELECT * FROM student1 AS S1 WHERE NOT EXISTS (SELECT * FROM student2 WHERE name=S1.name); # 如果不存在id为5的记录则插入 INSERT INTO student(id,name,date,score) VALUES(5,'Alice','2023-01-02',89) WHERE NOT EXISTS (SELECT * FROM student WHERE id=5);
5.派生表
# 派生表必须指定别名 SELECT AVG(max_score) FROM (SELECT class,MAX(score) AS max_score FROM student GROUP BY class) AS T; # 大多数时候派生表都可用CTE表达式实现
6.相关拓展
最新版MySQL的派生表同样支持相关子查询,详情见官方文档
部分操作可能不被支持,例如同时使用IN/SOME/ANY和LIMIT
子查询按位置划分可以是SELECT,WHERE,HAVING,FROM等
多数时候采用子查询的实现方式是多样的,并且可以与联接互相转换
7.相关题目
EXISTS的使用:SQL251 使用含有关键字exists查找未分配具体部门的员工的所有信息。
EXISTS的使用:SQL229 批量插入数据,不使用replace操作
涉及联接:SQL206 获取每个部门中当前员工薪水最高的相关信息
更多知识见专栏
#SQL菜鸟#MySQL的使用 文章被收录于专栏
阅读顺序为:入门->基础(务必阅读,尤其是SELECT语句的执行顺序)->进阶->应用(综合使用)。 这是一部较为系统的大纲式SQL查询教程,学习过程中应同步参考官方文档或其他相关资料,交叉阅读方能更好掌握知识,学会后基本可以完成站内90%以上的相关试题。 DDL及DML的其他内容后续更新。 如有帮助请您点赞收藏订阅,如有疑惑或指正请评论。 共同学习共同进步!