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

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

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


子查詢就是嵌套查詢,即SELECT語句中包含SELECT語句,如果一條語句中存在兩個,或兩個以上SELECT,那么就是子查詢語句了。
子查詢出現(xiàn)的位置:
  • Where子句中,作為條件存在;
  • from后,作為表存在(多行多列)。
下面我們通過幾個練習(xí)題來了解子查詢,如下所示:
(1)查詢emp表中,工資最高的員工的詳細(xì)信息,如圖1-1所示:
1553760483836_1.png圖1-1 查詢員工信息
圖1-1中,查詢語句是:select * from emp where sal=MAX(sal),看上去這條sql語句沒有什么問題,但是執(zhí)行的時候卻報錯了。原因是where子句后面不能使用聚合函數(shù),為了解決這個問題,我們可以使用子查詢。
(2)首先查詢出emp表中的最大工資,然后再查詢工資等于最大工資的員工信息,如圖1-2所示:
1553760489069_2.png圖1-2 子查詢
圖1-2中,查詢語句是:select * from emp where sal=(select MAX(sal) from emp ),在where子句中嵌套了一個子查詢語句。該子查詢語句查詢的是最大工資數(shù)。
以上子查詢的位置是在where子句中,下面我們來了解子查詢的位置出現(xiàn)在from關(guān)鍵字后面的情況,如下所示:
(3)查詢30號部門的員工信息,如圖1-3所示:
1553760495385_3.png圖1-3 子查詢
在from后面使用子查詢時,一定要為子查詢指定別名,圖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所示:
1553760502287_4.png圖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部門所有員工的工資,是一個多行單列的結(jié)果集,查詢語句的含義是大于子查詢結(jié)果集中的所有的工資值,all關(guān)鍵字就是所有的意思,那么只要員工的工資大于30部門員工的最大工資就符合查詢條件。
(5)查詢大于30部門任意一個員工工資的員工信息,包含30部門員工,如圖1-5所示:
1553760520302_5.png圖1-5 多行單列子查詢
圖1-5中查詢語句是:select * from emp where sal>any(select sal from emp where deptno=30),子查詢還是查詢30部門的所有員工工資,where條件子句代表查詢員工工資大于30部門員工的最小工資的員工信息,any表示任意一個。
以上是多行單列的子查詢,下面我們來了解單行多列的子查詢,如下所示:
(6)查詢與名稱為殷天正的員工的工作,部門以及工資相同的員工信息,如圖1-6所示:
1553760526304_6.png圖1-6 單行多列子查詢
圖1-1中,查詢語句是:select * from emp where (job,deptno,sal) in (select job,deptno,sal from emp where ename=’殷天正’),子查詢是查詢殷天正的工作,部門以及工資。where條件字句表示查詢job,deptno以及sal同時與殷天正的工作,部門,工資相同的員工。
   當(dāng)子查詢的查詢結(jié)果是多行多列時,我們就可以把它當(dāng)成是一個表,將它放在from關(guān)鍵詞后面,這里我們就不在進(jìn)行演示。

本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓(xùn)學(xué)院
首發(fā):http://m.ko1818.cn/news/javaEE.html
分享到:
在線咨詢 我要報名
和我們在線交談!