oracle數據庫SQL開發之子查詢

一、子查詢

1.-括號內的查詢叫做子查詢,也叫內部查詢,先於主查詢執行。子查詢的結果被主查詢(外部查詢)使用
包括比較運算符。
– 單行運算符:>、=、>=、<、<>、<=
– 多行運算符: in、any、all

2.子查詢可以嵌於以下SQL子句中:
– where子句
– having子句
– from子句

二、單行子查詢

• 子查詢只返回一行一列
• 使用單行運算符 >、=、>=、<、<>、<=。

三、多行子查詢

  1. IN操作符和以前介紹的功能一致,判斷是否與子查詢的任意一個返回值相同。

  2. any:表示和子查詢的任意一行結果進行比較,有一個滿足條件即可
    • < any():表示小於子查詢結果集中的任意一個,即小於最大值就可以。
    • > any():表示大於子查詢結果集中的任意一個,即大於最小值就可以。
    • = any():表示等於子查詢結果中的任意一個,即等於誰都可以,相當於IN.

  3. all:表示和子查詢的所有行結果進行比較,每一行必須都滿足條件。。
    • < all():表示小於子查詢結果集中的所有行,即小於最小值
    • > all():表示大於子查詢結果集中的所有行,即大於最大值
    • = all() :表示等於子查詢結果集中的所有行,即等於所有值,通常無意義

四、多列子查詢

  1. -查詢出和1981年入職的任意一個員工的部門和職位完全相同員工姓名、部門、職位入職日期,不包括1981年入職員工(where子句中 一起括起來用in
SQL> SELECT ename, deptno, job, hiredate
              FROM emp
              WHERE (deptno, job) IN
                           (SELECT deptno,job
                          FROM emp
                         WHERE to_char(hiredate,'YYYY')='1981')
            AND to_char(hiredate,'YYYY')<>'1981';

2.-查詢出和1981年入職的任意一個員工的部門職位相同員工姓名、部門、職位、入職日期,不包括1981年入職員工。(where 子句中 用or

SQL> SELECT ename, deptno, job, hiredate
		FROM emp
 		WHERE (deptno IN (SELECT deptno
 		FROM emp
		 WHERE to_char(hiredate,'YYYY')='1981')
		 OR job IN (SELECT  job
		 FROM emp
 		WHERE to_char(hiredate,'YYYY')='1981'))
		 AND to_char(hiredate,'YYYY')<>'1981');

3.因爲子查詢的結果中有一條空值,這條空值導致主查詢沒有記錄返回。這是因爲所有的條件和空值比較結果都是空值。因此無論什麼時候只要空值有可能成爲子查詢結果集合中的一部分,就不能使用NOT IN 運算符(所以記得去除子查詢結果中的空值select emp.mgr from emp where mgr is not null)。
–• 3.查詢不是經理的員工姓名。

SQL>select emp.ename 不是經理的員工姓名
	from emp
	where emp.empno not in(select emp.mgr from emp where mgr is not null);

4.在 FROM 子句中使用子查詢
• 查詢比自己/本部門平均工資高的員工姓名,工資,部門編號,部門平均工資

SQL> SELECT a.ename, a.sal, a.deptno, b.salavg
         FROM emp a,(SELECT deptno, avg(sal) salavg
                                   FROM emp
                                 GROUP BY deptno) b
          WHERE a.deptno = b.deptno
          AND a.sal > b.salavg;

五、僞列rownum 虛表dual

rownum是一個僞列,僞列是使用上類似於表中的列,而實際並沒有存儲在表中的特殊列;

–rownum的功能是在每次查詢時,返回結果集的行的順序號,這個順序號是在記錄輸出時才一步一步產生的,第一行顯示爲1,第二行爲2,以此類推。

– rownum使用的注意點:

  1. 對於rownum只能執行<、<=運算,不能執行>、>=或一個區間運算Between…And等
  2. rownum和order by 一起使用時,–rownum與order by 一起使用,序號打亂 因爲rownum在記錄輸出時生成,而order by子句在最後執行, 所以當兩者一起使用時, 需要注意rownum實際是已經被排了序的rownum。
  • 查詢入職日期最早的前五名員工
SQL>SELECT rownum,a.*
            FROM
            (     SELECT rownum,ename,hiredate
                  FROM emp
                  ORDER BY hiredate ) a
            WHERE ROWNUM <= 5;

六、top查詢 分頁

Top-N查詢主要是實現表中按照某個列排序,輸出最大或最小的N條記錄功能。

• Top-N分析語法

1.不排序的分頁查詢

select a.*
from
(select rownum rn,ename,hiredate,job
        from emp
        where  rownum <=目標頁數*每頁記錄數) a
where rn>(目標頁數-1*每頁記錄數

2.排序的分頁查詢

select b.*
from
    (select rownum rn, a.*
    from
       ( select ename,empno,sal
        from emp
        order by sal desc) a   --第一步子查詢排序   
    where rownum <= 目標頁數*每頁記錄數 --第二步子查詢選出前幾個,只能用<=號
        ) b
where rn > (目標頁數-1*每頁記錄數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章