一、子查询的基本类型之多行子查询
(1)使用IN操作符进行多行子查询。(总结:IN操作符后可用多行子查询)
比如:查询各个职位中工资最高的员工信息。
SQL>select ename, job, sal from emp where sal in (select max(sal) from emp group by job);——单列子查询
或
SQL>select ename, job, sal from emp where (sal,job) in (select max(sal), job from emp group by job);——多列子查询
(2)使用exists操作符进行多行子查询。(总结:exists操作符后可用多行子查询)
引入exists的目的:在一些情况下,只需要子查询返回一个真值或是假值。如果只考虑是否满足判断条件,而数据本身并不重要,可以使用exists操作符来定义子查询。
比如:
SQL>select empno, ename, sal from emp where exists (select * from dept where deptno =‘40’)
【注意】以上SQL语句如果子查询(select * from dept where deptno = ‘40’)有结果,那么exists前面的语句会执行,如果exists后面的没结果,那么其前面的不会执行。
(3)使用ALL操作符进行多行子查询。(总结:all操作符后可用多行子查询)
比如:
SQL>select empno, ename, sal, job from emp where sal < all (select avg(sal) from emp group by job);
【注意】all操作符比较子查询返回列表中的每一个值。
<all为小于最小的
>all为大于最大的
=all无意义,一般不写。
解释:子查询(select avg(sal) from emp group by job)是计算每个职位的平均工资,那么不同职位的平均工资不同,有高有低,所以<all是小于最小的,即小于最低平均工资。同理>all是大于最大的, 即大于最高平均工资。
(4)使用ANY操作符进行多行子查询。(总结:any操作符后可用多行子查询)
比如:
SQL>select empno, ename, sal, job from emp where sal > any (select avg(sal) from group by jon)
【注意】any操作符后接多行子查询返回列表中的每一个值。
<any为小于最大的
>any为大于最小的。
例1:练习all操作符后接多行子查询。
解:当前sc表数据:
现在将同一门课程分为一组,计算均分,即按照cno值相同分组求平均:
用all操作符后接多行子查询,查看小于所有均分中最小值(79.25)的学生信息:
用all操作符后接多行子查询,查看大于所有均分中最大值(80.32)的学生信息:
例2:练习any操作符后接多行子查询。
解:当前sc表数据:
现在将同一门课程分为一组,计算均分,即按照cno值相同分组求平均:
用any操作符后接多行子查询,查看小于所有均分中最大值(80.32)的学生信息:
用any操作符后接多行子查询,查看大于所有均分中最小值(79.25)的学生信息:
二、子查询的基本类型之多列子查询
多列子查询要返回多列。
比如:查询哪些员工的工资为所任职位中最高的。
SQL>selecte mpno, ename, sal, job from emp where (sal, job) in (select max(sal), job from emp group by job);
【总结】
单列子查询就是子查询中只有1个列名,如(select avg(sal) from emp group by job);多列子查询就是子查询中不止1个列名,如(select max(sal), job from emp group by job)。