假设有课程表score,表中的记录如下:
现在要找出每个学生超过他所有选修课程平均成绩的课程号:
select Sno, Cno
from score x
where degree >= (select avg(degree) /*某学生所有选课的平均成绩*/
from score y
where x.Sno = y.Sno)
内层查询是求一个学生所有选修课程平均成绩的,至于是哪个学生的平均成绩要看参数x.sno的值,而该值是与父查询相关的,因此这类内层查询条件依赖外层查询称为相关子查询。
上面语句的一种可能的执行过程为:
1、从外层查询中取出score的一个元组x,将元组x的Sno值(101)传送给内层查询
select avg(degree)
from score y
where y.sno = '101';
2、执行内层查询,得到值74.5,用该值替代内层查询,得到外层查询:
select Sno,Cno
from score x
where degree >= 74.5;
3、外查询根据子查询返回的结果或结果集得到满足条件的行:
4、然后外层查询取出下一个元组重复做上述1至3步骤的处理,直到外层SC元组全部处理完毕。结果为: