不相关子查询
子查询可独立执行,不依赖于父查询表的查询,称为不相关子查询。
执行过程:
(1)先执行子查询,其结果不会被显示,而是返回给外部查询来作为外部查询的查询条件;
(2)根据子查询的结果,执行外部查询。
举例
查询与’苏乐’在同一个专业学习的学生的信息。
select * from student
where maj=(select maj from student where sname='苏乐');
select * from student
where maj in(select maj from student where sname='苏乐');
运行截图
相关子查询
构造子查询的查询条件时需要用到父查询的某一个属性列,这样的查询称为相关子查询。
相关子查询是无法独立执行的,因为它必然含有对外部查询表中元组分量的引用。
其执行过程为:
(1)按顺序从外部查询中取出一个元组,将元组的相关分量值传递给子查询;
(2)执行子查询,得到结果值;
(3)外部查询根据子查询返回的结果或结果集确定取出的这一行元组是否满足条件;若外层的where子句返回真值,说明符合;否则不符合,舍弃。
(4)重复步骤1-3,直到外部查询表中的所有元组都被处理完毕。
最常见的相关子查询是EXISTS引导的子查询。
EXISTS 引导的子查询不返回数据,而是返回是否存在满足子查询的外层查询元组的判断(真/假),主查询根据该判断来逐条取舍元组。
举例
查询所有选修了“c1”课程的学生姓名。
select sname from student where exists (select * from sc where sno=student.sno and cno='c1');