Oracle-28-子查詢之多行子查詢&子查詢之多列子查詢
一、子查詢的基本型別之多行子查詢
(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操作符來定義子查詢。
比如:
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)。