执行逻辑
对于外部查询返回的每条数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每条记录传递给子查询,然后子查询按照条件执行并返回它的记录。然后,外部查询根据返回的记录做出决策。
例题精讲
成绩表主要信息如下:
要解决的问题是:查询各科成绩前三名的记录。
使用关联子查询解决,代码如下:
select * from sc t
where (select sum(score>t.score) from sc where c_id=t.c_id)<3
order by c_id,score desc;
第一步:
先执行外层查询
select * from sc t;
查询结果也就是该表的全部记录
第二步:
因为子查询中连接了这个表本身(where c_id=t.c_id),所以将第一条记录转到子查询。子查询是sum(score>t.score)即01课程中score>80的人数,所以先判断score>t.score,满足为1,不满足为0,用sum求和即查询出01课程中score>80的有几个人。
相当于执行了:
select sum(score>80)
from sc
where c_id='01';
查询结果如下:
01课程中score>80的人数为0,即80为第一名。
第三步:
子查询的结果进入外部查询where子句中和3比较,0<3,条件成立,最终输出t表中的第一条记录。
循环执行:t表中第二、三条记录转到子查询,执行判断,输出第二、三条记录。
t表中第四条记录转到子查询,01课程中score>70的人数有3人,3<3条件不成立,所以不输出t表中第四条记录。
继续循环直到t表中最后一条记录,最终输出结果按照课程编号和成绩进行排序。