Oracle-28-子查询之多行子查询&子查询之多列子查询

一、子查询的基本类型之多行子查询

(1)使用IN操作符进行多行子查询。(总结:IN操作符后可用多行子查询)

比如:查询各个职位中工资最高的员工信息。


SQL>select ename, job, sal from emp where salin (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 wheredeptno = ‘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无意义,一般不写。

 

解释:子查询(selectavg(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表数据:


Oracle-28-子查询之多行子查询&子查询之多列子查询_第1张图片


现在将同一门课程分为一组,计算均分,即按照cno值相同分组求平均:


Oracle-28-子查询之多行子查询&子查询之多列子查询_第2张图片


用all操作符后接多行子查询,查看小于所有均分中最小值(79.25)的学生信息:


Oracle-28-子查询之多行子查询&子查询之多列子查询_第3张图片


用all操作符后接多行子查询,查看大于所有均分中最大值(80.32)的学生信息:


Oracle-28-子查询之多行子查询&子查询之多列子查询_第4张图片

 

2:练习any操作符后接多行子查询。

解:当前sc表数据:




现在将同一门课程分为一组,计算均分,即按照cno值相同分组求平均:


Oracle-28-子查询之多行子查询&子查询之多列子查询_第5张图片


用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个列名,如(selectavg(sal)from emp group by job);多列子查询就是子查询中不止1个列名,如(selectmax(sal), jobfrom emp group by job)。

你可能感兴趣的:(Oracle-28-子查询之多行子查询&子查询之多列子查询)