我們漸漸的對Oracle的知識,有了進一步的瞭解與掌握,隨著時間的推移,在這節課程中我們來講解SQL子查詢的知識,希望通過授課中的內容對你有所協助!
- 子查詢概念 :當一個查詢的結果是另一個查詢的條件時,稱之為子查詢。
- 使用子查詢注意事項:
- 子查詢可以嵌套多層
- 子查詢需要圓括弧()括起來
- 子查詢文法:
- SELECT select_list
- FROM table
- WHERE expr operator
- (SELECT select_list
- FROM table);
- 子查詢 (內查詢) 在主查詢之前一次執行完成。
- 子查詢的結果被主查詢使用 (外查詢)。
- 舉例:查詢員工的工資大於JONES的員工資訊
- 分析過程如下:
- 首先:查詢JONES的員工工資是多少 :結果2975
- SQL> select sal from emp where ename='JONES';
- 實際上我們要查詢的是:薪資大於2975的員工的資訊寫法如下:
- SQL> select * from emp where sal>2975;
- //綜合以上寫出子查詢的結果如下:
- SQL> select * from emp where sal>(select sal from emp where ename='JONES');
- 注意:
- 子查詢要包含在括弧內。
- 將子查詢放在比較條件的右側。
-
- 根據查詢的結果(內部巢狀查詢的結果)把子查詢的類型分為單行子查詢與多行子查詢,
- 注意:
- 單行操作符對應單行子查詢,多行操作符對應多行子查詢。
- 單行操作符
- >、>=、 <、 <= 、<>、=
- 舉例:
- //查詢編號7876相同職位的員工資訊 並且薪資大於編號為7521的薪資的員工資訊
- SQL> select * from emp where job=( select job from emp where empno=7876) and sal>( select sal from emp where empno=7521);
- //子查詢含有組函數
- SQL> select * from emp where sal>(select avg(nvl(sal,0)) from emp);
- //子查詢含有having子句 查詢部門的最小工資大於20號部門最小工資的部門號及最小工資數
- SQL> select deptno,min(sal) from emp group by deptno having min(sal)>( select min(sal) from emp where deptno=20);
-
- 備忘:子查詢可以返回空行 沒要查詢到結果是可以的。
-
- 多行子查詢
- 返回多行。
- 使用多行比較操作符。
- 操作符如:
- 操作符 描述
- In 等於列表中的任何一個
- Any 子查詢返回的任意一個值比較 相同還有some
- All 和子查詢返回的所有值比較
- Exists
-
- //查詢薪水小於工作崗位CLERK的任何一個薪資的員工資訊 並且不包含工作崗位為CLERK的員工資訊
- SQL> select * from emp where sal < any (select sal from emp where job='CLERK') and job<>'CLERK';
- //all與所有值比較 >all 代表的是大於查詢結果的最大值
- SQL> select * from emp where sal > all (select sal from emp where job='CLERK') and job<>'CLERK';
- //查詢崗位與部門編號為10相同的員工資訊 不包含自己。
- SQL> select * from emp where job in(select job from emp where deptno=10) and deptno<>10;
-
- 只做思考?
-
- SQL> select * from emp where exists(select * from dept);
-
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ----- ---------- --------- ----- ----------- --------- --------- ------
- 7369 SMITH CLERK 7902 1980-12-17 800.00 20
- 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
- 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
- …..
-
- SQL> select * from emp where exists(select * from dept where deptno=80);
-
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ----- ---------- --------- ----- ----------- --------- --------- ------
-
-
- 以上內容著作權歸redarmy_chen所有,如需轉載請附帶出處,如有疑問請發送郵件至redarmy_chen@qq.com