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