子查詢(xún)就是嵌套查詢(xún),即SELECT語(yǔ)句中包含SELECT語(yǔ)句,如果一條語(yǔ)句中存在兩個(gè),或兩個(gè)以上SELECT,那么就是子查詢(xún)語(yǔ)句了。
子查詢(xún)出現(xiàn)的位置:
- Where子句中,作為條件存在;
- from后,作為表存在(多行多列)。
下面我們通過(guò)幾個(gè)練習(xí)題來(lái)了解子查詢(xún),如下所示:
(1)查詢(xún)emp表中,工資最高的員工的詳細(xì)信息,如圖1-1所示:
圖1-1 查詢(xún)員工信息
圖1-1中,查詢(xún)語(yǔ)句是:select * from emp where sal=MAX(sal),看上去這條sql語(yǔ)句沒(méi)有什么問(wèn)題,但是執(zhí)行的時(shí)候卻報(bào)錯(cuò)了。原因是where子句后面不能使用聚合函數(shù),為了解決這個(gè)問(wèn)題,我們可以使用子查詢(xún)。
(2)首先查詢(xún)出emp表中的最大工資,然后再查詢(xún)工資等于最大工資的員工信息,如圖1-2所示:
圖1-2 子查詢(xún)
圖1-2中,查詢(xún)語(yǔ)句是:select * from emp where sal=(select MAX(sal) from emp ),在where子句中嵌套了一個(gè)子查詢(xún)語(yǔ)句。該子查詢(xún)語(yǔ)句查詢(xún)的是最大工資數(shù)。
以上子查詢(xún)的位置是在where子句中,下面我們來(lái)了解子查詢(xún)的位置出現(xiàn)在from關(guān)鍵字后面的情況,如下所示:
(3)查詢(xún)30號(hào)部門(mén)的員工信息,如圖1-3所示:
圖1-3 子查詢(xún)
在from后面使用子查詢(xún)時(shí),一定要為子查詢(xún)指定別名,圖1-3中,查詢(xún)語(yǔ)句是:select * from (select * from emp where deptno=30) e,子查詢(xún)的別名為e,可以理解為查詢(xún)的結(jié)果就是一張表,然后再?gòu)倪@張表中查詢(xún)信息。
圖1-2中,子查詢(xún)語(yǔ)句的查詢(xún)結(jié)果是單行單列,圖1-3中的子查詢(xún)語(yǔ)句的查詢(xún)結(jié)果是多行多列。根據(jù)子查詢(xún)的查詢(xún)結(jié)果有以下分類(lèi):
- 單行單列:這樣的子查詢(xún)通常用來(lái)做條件,如:select * from 表1 別名1 where 列1[=,>,<,>=,<=,!=] (select 列 from 表2 別名2 where 條件);
- 多行單列:這樣的子查詢(xún)通常也用來(lái)做條件,如:select * from 表1 別名1 where 列1[in,all,any] (select 列 from 表2 別名2 where 條件);
- 單行多列:這樣的子查詢(xún)通常也用來(lái)做條件,如:select * from 表1 別名1 where [列1,列2,…列n] in (select 列1,列2,…列n from 表2 別名2 where 條件);
- 多行多列:這樣的子查詢(xún)通常作為要查詢(xún)的表,即放在from關(guān)鍵詞后面,如:select * from 表1 別名1,(select…) 別名2 where 條件。
單行單列的子查詢(xún)我們就不在演示,下面我們了解子查詢(xún)的結(jié)果是多行單列的練習(xí)題,如下所示:
(4)查詢(xún)大于30部門(mén)所有員工工資的員工信息,包含30部門(mén)員工,如圖1-4所示:
圖1-4 多行單列子查詢(xún)
圖1-4的查詢(xún)語(yǔ)句是:select * from emp where sal>all(select sal from emp where deptno=30),其中子查詢(xún)語(yǔ)句:select * from emp where deptno =30的結(jié)果是30部門(mén)所有員工的工資,是一個(gè)多行單列的結(jié)果集,查詢(xún)語(yǔ)句的含義是大于子查詢(xún)結(jié)果集中的所有的工資值,all關(guān)鍵字就是所有的意思,那么只要員工的工資大于30部門(mén)員工的最大工資就符合查詢(xún)條件。
(5)查詢(xún)大于30部門(mén)任意一個(gè)員工工資的員工信息,包含30部門(mén)員工,如圖1-5所示:
圖1-5 多行單列子查詢(xún)
圖1-5中查詢(xún)語(yǔ)句是:select * from emp where sal>any(select sal from emp where deptno=30),子查詢(xún)還是查詢(xún)30部門(mén)的所有員工工資,where條件子句代表查詢(xún)員工工資大于30部門(mén)員工的最小工資的員工信息,any表示任意一個(gè)。
以上是多行單列的子查詢(xún),下面我們來(lái)了解單行多列的子查詢(xún),如下所示:
(6)查詢(xún)與名稱(chēng)為殷天正的員工的工作,部門(mén)以及工資相同的員工信息,如圖1-6所示:
圖1-6 單行多列子查詢(xún)
圖1-1中,查詢(xún)語(yǔ)句是:select * from emp where (job,deptno,sal) in (select job,deptno,sal from emp where ename=’殷天正’),子查詢(xún)是查詢(xún)殷天正的工作,部門(mén)以及工資。where條件字句表示查詢(xún)job,deptno以及sal同時(shí)與殷天正的工作,部門(mén),工資相同的員工。
當(dāng)子查詢(xún)的查詢(xún)結(jié)果是多行多列時(shí),我們就可以把它當(dāng)成是一個(gè)表,將它放在from關(guān)鍵詞后面,這里我們就不在進(jìn)行演示。
本文版權(quán)歸傳智播客人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客人工智能+Python學(xué)院