1、子查询的分类
-
不相关查询: 子查询能独立执行
-
相关查询: 子查询不能独立运行
相关查询的执行顺序:
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,
若WHERE
子句返回值为真,则取此元组放入结果表,
然后再取外层表的下一个元组,重复这一过程,直至外层表全部查询完为止。
通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联, 因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子査询。 相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
2、子查询返回类型分类
-
标量子查询:返回单个值
-
列子查询:返回一列值
-
行子查询:返回一行值
-
表子查询:返回一个表 等下会有例子对应理解
3、嵌套场景
4、示例
4.1 数据准备
4.2 非相关查询
SELECT
a.id,
name,
b.score
FROM
student a,
(select * from score where score >70)b
WHERE a.id = b.student_id
子查询并不依赖父查询
4.3 select 标值
SELECT
id,
name,
(select score from score b where a.id = b.student_id and b.course_id= 1) as '语文'
FROM
student a
4.4 from 表
SELECT
a.id,
name,
b.score
FROM
student a,
(select * from score where id >1)b
WHERE a.id = b.student_id
注:这里并没有什么逻辑,id>1 随便写的条件
4.5 where
SELECT
*
FROM
student a
WHERE (select avg(score) from score b where a.id = b.student_id GROUP BY b.student_id)>70
这里是返回一个标值
4.6 where exist
SELECT
*
FROM
student a
WHERE EXISTS ( select * from score b where a.id = b.student_id and b.course_id = 5)
5、总结
嵌套查询之前一直分不清执行顺序,没有做过总结
记住两个点: 相关查询还是非相关查询
查询出的内容是什么类型,选择对应的操作符