首頁(yè)技術(shù)文章正文

JAVA培訓(xùn)之連接查詢之子查詢

更新時(shí)間:2017-04-13 來(lái)源:傳智播客Java培訓(xùn) 瀏覽量:


子查詢就是嵌套查詢,即SELECT語(yǔ)句中包含SELECT語(yǔ)句,如果一條語(yǔ)句中存在兩個(gè),或兩個(gè)以上SELECT,那么就是子查詢語(yǔ)句了。
子查詢出現(xiàn)的位置:
  • Where子句中,作為條件存在;
  • from后,作為表存在(多行多列)。
下面我們通過(guò)幾個(gè)練習(xí)題來(lái)了解子查詢,如下所示:
(1)查詢emp表中,工資最高的員工的詳細(xì)信息,如圖1-1所示:
1553760483836_1.png圖1-1 查詢員工信息
圖1-1中,查詢語(yǔ)句是:select * from emp where sal=MAX(sal),看上去這條sql語(yǔ)句沒(méi)有什么問(wèn)題,但是執(zhí)行的時(shí)候卻報(bào)錯(cuò)了。原因是where子句后面不能使用聚合函數(shù),為了解決這個(gè)問(wèn)題,我們可以使用子查詢。
(2)首先查詢出emp表中的最大工資,然后再查詢工資等于最大工資的員工信息,如圖1-2所示:
1553760489069_2.png圖1-2 子查詢
圖1-2中,查詢語(yǔ)句是:select * from emp where sal=(select MAX(sal) from emp ),在where子句中嵌套了一個(gè)子查詢語(yǔ)句。該子查詢語(yǔ)句查詢的是最大工資數(shù)。
以上子查詢的位置是在where子句中,下面我們來(lái)了解子查詢的位置出現(xiàn)在from關(guān)鍵字后面的情況,如下所示:
(3)查詢30號(hào)部門(mén)的員工信息,如圖1-3所示:
1553760495385_3.png圖1-3 子查詢
在from后面使用子查詢時(shí),一定要為子查詢指定別名,圖1-3中,查詢語(yǔ)句是:select * from (select * from emp where deptno=30) e,子查詢的別名為e,可以理解為查詢的結(jié)果就是一張表,然后再?gòu)倪@張表中查詢信息。
圖1-2中,子查詢語(yǔ)句的查詢結(jié)果是單行單列,圖1-3中的子查詢語(yǔ)句的查詢結(jié)果是多行多列。根據(jù)子查詢的查詢結(jié)果有以下分類:
  • 單行單列:這樣的子查詢通常用來(lái)做條件,如:select * from 表1 別名1 where 列1[=,>,<,>=,<=,!=] (select 列 from 表2 別名2 where 條件);
  • 多行單列:這樣的子查詢通常也用來(lái)做條件,如:select * from 表1 別名1 where 列1[in,all,any] (select 列 from 表2 別名2 where 條件);
  • 單行多列:這樣的子查詢通常也用來(lái)做條件,如: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部門(mén)所有員工工資的員工信息,包含30部門(mén)員工,如圖1-4所示:
1553760502287_4.png圖1-4 多行單列子查詢
圖1-4的查詢語(yǔ)句是:select * from emp where sal>all(select sal from emp where deptno=30),其中子查詢語(yǔ)句:select * from emp where deptno =30的結(jié)果是30部門(mén)所有員工的工資,是一個(gè)多行單列的結(jié)果集,查詢語(yǔ)句的含義是大于子查詢結(jié)果集中的所有的工資值,all關(guān)鍵字就是所有的意思,那么只要員工的工資大于30部門(mén)員工的最大工資就符合查詢條件。
(5)查詢大于30部門(mén)任意一個(gè)員工工資的員工信息,包含30部門(mén)員工,如圖1-5所示:
1553760520302_5.png圖1-5 多行單列子查詢
圖1-5中查詢語(yǔ)句是:select * from emp where sal>any(select sal from emp where deptno=30),子查詢還是查詢30部門(mén)的所有員工工資,where條件子句代表查詢員工工資大于30部門(mén)員工的最小工資的員工信息,any表示任意一個(gè)。
以上是多行單列的子查詢,下面我們來(lái)了解單行多列的子查詢,如下所示:
(6)查詢與名稱為殷天正的員工的工作,部門(mén)以及工資相同的員工信息,如圖1-6所示:
1553760526304_6.png圖1-6 單行多列子查詢
圖1-1中,查詢語(yǔ)句是:select * from emp where (job,deptno,sal) in (select job,deptno,sal from emp where ename=’殷天正’),子查詢是查詢殷天正的工作,部門(mén)以及工資。where條件字句表示查詢job,deptno以及sal同時(shí)與殷天正的工作,部門(mén),工資相同的員工。
   當(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://409rqu1.cn/news/javaEE.html
分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!