1. 程式人生 > >Oracle-28-子查詢之多行子查詢&子查詢之多列子查詢

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的目的:在一些情況下,只需要子查詢返回一個真值或是假值。如果只考慮是否滿足判斷條件,而資料本身並不重要,可以使用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)。