相关子查询 和 不相关子查询
1. 什么叫不相关子查询?
子查询的查询条件不依赖于父查询,称不相关子查询。
例:查询与”刘晨“在一个系学习的同学。
select sno,sname,sdept
from student
where sdept IN(
select sdept
from student
where sname='刘晨');
2. 什么叫相关子查询?
子查询的查询条件依赖于父查询,称为 相关子查询。
例:找出每个学生超过他自己选修课程平均成绩的课程号。
select sno,cno
from sc x
where grade >=(select avg(grade)
from sc y
where y.sno=x.sno);
x
是表sc
的别名, 又称为 元组变量, 可以用来表示sc的一个元组。
内层查询的结果是一个学生所有选修课程平均成绩的,至于是哪个学生的平均成绩就由参数x.sno
的值决定,而该值是与父查询i相关的,因此称这类查询为相关子查询。
相关子查询的过程:
首先,从父查询中取出sc表的一个元组x,将元组x的sno值传递给子查询。
然后,执行子查询,得到某个值,用这个值代替 子查询的结果 ,父查询由 嵌套查询 变为 只有一层外层查询的简单的查询。
最后,执行这个简单的查询,即得结果。
3. 相关 vs 不相关
相关子查询 的查询过程 就像 C 语言的 双重For循环一样,先执行一次外层循环,然后执行内层循环完毕后,继续执行外层循环的下一个值。
不相关子查询 就是先一次性把 内层查询 执行,再 执行外层 查询。