當查詢中的限制條件須要另外一個查詢提供時,咱們能夠把兩個查詢語句嵌套起來,提供條件的查詢語句做爲子查詢。
子查詢,也叫內部查詢,先於主查詢執行,子查詢的結果被用於主查詢。
子查詢分爲單行子查詢、多行子查詢和多列子查詢,單行子查詢做爲判斷條件時用單行運算符,多行子查詢和多列子查詢做爲判斷條件時用多行運算符。
單行運算符:>、=、>=、<、<>、<=
多行運算符:in、all、anyide
Where子句:做爲非分組函數篩選判斷的條件
From子句:將子查詢的查詢結果做爲一張表來使用
Having子句:做爲分組函數篩選判斷的條件函數
子查詢須要用括號括起來
當子查詢放在from子句中時,是將查詢到的結果做爲一張表來使用,需給別名
單行子查詢用單行運算符,多行子查詢用多行運算符
子查詢放在運算符右邊code
單行子查詢返回一行一列,使用單行運算符進行鏈接blog
--顯示和僱員7369從事相同工做而且工資大於僱員7876的僱員的姓名和工做。 select ename,job from emp where job = (select job from emp where empno =7369) and sal > (select sal from emp where empno = 7876); --查詢工資最低的員工姓名,崗位及工資(子查詢中使用了分組函數) select ename,job,sal from emp where sal = (select min(sal) from emp) --查詢部門最低工資比20部門最低工資高的部門編號及最低工資(子查詢嵌套在having子句) select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno = 20 );
多行子查詢返回一行或多行記錄,使用多行運算符進行鏈接it
--查詢是經理的員工姓名、工資 select ename,sal from emp where empno in (select mgr from emp)
表示和子查詢的任意一行結果進行比較,有一個知足條件便可。class
any:大於子查詢結果的任意一個,即大於最小值便可。
<any:小於子查詢結果的任意一個,即小於最大值便可。
=any:等於子查詢結果的任意一個,即等一任意一個便可,至關於in。
select
--查詢部門編號不爲10,且工資比10部門任意一名員工工資高的員工編號,姓名,職位,工資。 select empno,ename,job,sal from emp where deptno <> 10 and sal > any(select sal from emp where deptno = 10);
表示和子查詢的全部行結果進行比較,每一行必須都知足條件。im
<all:表示小於子查詢結果集中的全部行,即小於最小值 >all:表示大於子查詢結果集中的全部行,即大於最大值。 = all :表示等於子查詢結果集中的全部行,即等於全部值。
--查詢部門編號不爲10,且工資比10部門全部員工工資低的員工編號,姓名,職位,工資。 select empno,ename,job,sal from emp where deptno <> 10 and sal > all(select sal from emp where deptno = 10);