基本逻辑
对于外部查询返回的每一行数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。
案例说明
成绩表信息
要解决的问题: 查询成绩大于对应科目的平均成绩学生
错误的做法
首先根据科目将其个子科目的平均成绩计算出来,再比较每日个人的分数和对应科目的分数,大于就筛选出来。
select course_no subject , avg(score_prize) avg_prize from score group by course_no ;
select * from score where score_prize > (select avg(score_prize) from score group by course_no) ;
正确的做法
使用关联子查询
SELECT
s.stu_no,s.score_prize
FROM
score s
WHERE
score_prize < (SELECT
AVG(score_prize)
FROM
score
WHERE
course_no = s.course_no);
执行情况说明
外层查询先执行,子查询,子查询course_no = ‘0001’,所以首先筛选出 course_no = '0001’数据,再对它们取平均,这个结果进入外层循环where和这个人的score_prize分数记性比较,相当于执行了
select * from score where score_prize > 平均值 and course_no = '0001' ;
然后进行第一次外层查询第二条数据course_no=‘0002’,依次执行,最后得到最终结果
博文来源