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