在執行數據操做時,若是某個操做須要依賴於另一個 select語句的查詢結果,那麼就能夠把 select 語句遷入到該操做語句中,這樣就造成了一個子查詢。實際應用中,表與表之間相互關聯,相互依存,這樣就能夠根據數據之間的關係使用相應的子查詢,從而實現複雜的查詢。sql
子查詢是在 SQL 語句內的另一條 select 語句,也被稱爲內查詢或是 內select語句。在select、insert、update 或delete 命令中容許是一個表達式的地方均可以包含子查詢,子查詢也能夠包含在另一個子查詢裏面中。spa
EG:blog
SQL > select empno,ename,job from emp
where deptno = (select deptno from dept where dname="research");
表示在emp表中查詢部門名稱爲(dname)爲「research」 的員工信息。排序
分析:原來在 emp 表中不存在 dname 字段,但 emp 表中存在 depno字段(部門代碼);dname 字段本來存在 dept 表中,而且 deptno 字段也存在 dept表中,全部 deptno 爲兩個表之間的關聯字段,這樣就能夠經過多表關聯查詢來實現。等同於下面的多表查詢:class
SQL > select empno,ename,job from emp join dept on emp.deptno = dept.deptno
where dept.dname = 'research';
從上能夠看出,相比於多表關聯查詢,子查詢更加靈活、功能更強大,並且更容易理解。可是多表關聯查詢的效率要高於子查詢。效率
在執行子查詢操做的語句中,子查詢也稱爲內查詢,包含子查詢的查詢語句也被稱爲外查詢或主查詢。date
在執行查詢時,外查詢語句檢索一行,子查詢語句須要檢索一遍數據,而後判斷外查詢語句的條件是否知足。若是知足,則外查詢語句將檢索到數據行添加到結果集中,若是條件不知足,則外查詢語句繼續檢索下一行數據,全部子查詢相對多表關聯查詢要慢。select
注意:遍歷
單行子查詢是指返回一行數據的子查詢語句。當在 where 子句中引用單行子查詢時,可使用當行比較運算符(=、>、<、>=、<=和<>)。引用
EG:
SQL > select empno,ename,sal from emp
where sal > (select min(sal) from emp) and sal < (select max(sal) from emp);
注意:
多行子查詢是指返回多行數據的子查詢語句。當在 where 子句中使用多行子查詢時,必須使用多行運算符(in、any、all)。
當在多行子查詢中使用 in 運算符時,外查詢會嘗試與子查詢結果中的任何一個結果進行匹配,只要有一個匹配成功,則外查詢返回當前檢索的記錄。
EG:
SQL > select empno,ename,job
from emp where deptno in
(select deptno from dept where dname<>'sales');
any 運算符必須與單行比較運算符結合使用,而且返回行只要匹配子查詢的任何一個結果便可。
EG:
SQL > select deptno,ename,sal from emp where sal > any
(select sal from emp where deptno = 10) and deptno <> 10;
表示從emp表中,查詢工資大於部門編號爲10的任意一個員工工資便可的其餘部門的員工信息。
all 運算符必須與單行運算符結合使用,而且返回行必須匹配全部子查詢結果。
EG:
SQL > select deptno,ename,sal from emp where sal > all
(select sal from emp where deptno = 30);
表示從emp表中,查詢工資大於部門編號爲 30 的全部員工工資的員工信息。
在單行子查詢和多行子查詢中,內查詢和外查詢是分開執行的,也就是說內查詢的執行與外查詢的執行時沒有關係的,外查詢僅僅是使用內查詢的最終結果。在一些特殊需求的子查詢中,內查詢的執行須要藉助於外查詢,而外查詢的執行又離不開內查詢的執行,這時,內查詢和外查詢是相互關聯的,這種子查詢就被稱爲關聯子查詢。
EG:
SQL > select empno,ename,sal from emp f
where sal > (select avg(sal) from emp where job = f.job)
order by job;
表示在emp表中,使用「關聯子查詢」檢索工資大於同職位的平均工資的員工信息。
注意: