Oracle 子查詢(複雜select語句)

  在執行數據操做時,若是某個操做須要依賴於另一個 select語句的查詢結果,那麼就能夠把 select 語句遷入到該操做語句中,這樣就造成了一個子查詢。實際應用中,表與表之間相互關聯,相互依存,這樣就能夠根據數據之間的關係使用相應的子查詢,從而實現複雜的查詢。sql

1、子查詢

  子查詢是在 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

  注意:遍歷

  •   子查詢語句必須用括號 "()" 括起來。
  •        子查詢中不能包括 order by  子句。
  •        子查詢運行嵌套多層,但不能超過255層。

2、單行子查詢

  單行子查詢是指返回一行數據的子查詢語句。當在 where 子句中引用單行子查詢時,可使用當行比較運算符(=、>、<、>=、<=和<>)。引用

  EG:

SQL >  select empno,ename,sal from emp 
       where sal > (select min(sal) from emp) and sal < (select max(sal) from emp);

  注意:

  •   內層子查詢的執行結果若是爲空值,那麼外層的 where 子句就始終不會知足條件,這樣的查詢結果就必然爲空值
  •        執行單行子查詢時,要注意子查詢的返回結果必須是一行數據,不然 Oracle 系統會提示沒法執行。
  •        子查詢中不能包含 order by 子句,若是非要進行排序的話,那麼只能在外查詢語句中使用 order by 子句。

3、多行子查詢

  多行子查詢是指返回多行數據的子查詢語句。當在 where 子句中使用多行子查詢時,必須使用多行運算符(in、any、all)。

  一、使用 in 運算符

  當在多行子查詢中使用 in 運算符時,外查詢會嘗試與子查詢結果中的任何一個結果進行匹配,只要有一個匹配成功,則外查詢返回當前檢索的記錄。

   EG:

SQL > select empno,ename,job
      from emp where deptno in
     (select deptno from dept where dname<>'sales');

  二、使用 any 運算符

  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 運算符

  all 運算符必須與單行運算符結合使用,而且返回行必須匹配全部子查詢結果。

  EG:

SQL > select deptno,ename,sal from emp where sal > all
      (select sal from emp where deptno = 30);

     表示從emp表中,查詢工資大於部門編號爲 30 的全部員工工資的員工信息。

4、關聯子查詢

  在單行子查詢和多行子查詢中,內查詢和外查詢是分開執行的,也就是說內查詢的執行與外查詢的執行時沒有關係的,外查詢僅僅是使用內查詢的最終結果。在一些特殊需求的子查詢中,內查詢的執行須要藉助於外查詢,而外查詢的執行又離不開內查詢的執行,這時,內查詢和外查詢是相互關聯的,這種子查詢就被稱爲關聯子查詢。

  EG:

SQL > select empno,ename,sal from emp f
      where sal > (select avg(sal) from emp where job = f.job)
      order by job;

  表示在emp表中,使用「關聯子查詢」檢索工資大於同職位的平均工資的員工信息。

  注意

  •   在執行關聯子查詢的過程當中,必須遍歷數據表中的每條記錄,所以若是被遍歷的數據表中有大量的數據記錄,則關聯子查詢的執行速度會比較慢。
  •        關聯字查詢不單單能夠做爲 select 語句的子查詢,也能夠做爲 insert 、 update或 delete 語句的關聯子查詢。
相關文章
相關標籤/搜索