oracle數據庫SQL開發之子查詢
一、子查詢
1.-括號內的查詢叫做子查詢,也叫內部查詢,先於主查詢執行。子查詢的結果被主查詢(外部查詢)使用
包括比較運算符。
– 單行運算符:>、=、>=、<、<>、<=
– 多行運算符: in、any、all
2.子查詢可以嵌於以下SQL子句中:
– where子句
– having子句
– from子句
二、單行子查詢
• 子查詢只返回一行一列
• 使用單行運算符 >、=、>=、<、<>、<=。
三、多行子查詢
-
IN操作符和以前介紹的功能一致,判斷是否與子查詢的任意一個返回值相同。
-
any:表示和子查詢的任意一行結果進行比較,有一個滿足條件即可。
• < any():表示小於子查詢結果集中的任意一個,即小於最大值就可以。
• > any():表示大於子查詢結果集中的任意一個,即大於最小值就可以。
• = any():表示等於子查詢結果中的任意一個,即等於誰都可以,相當於IN. -
all:表示和子查詢的所有行結果進行比較,每一行必須都滿足條件。。
• < all():表示小於子查詢結果集中的所有行,即小於最小值。
• > all():表示大於子查詢結果集中的所有行,即大於最大值。
• = all() :表示等於子查詢結果集中的所有行,即等於所有值,通常無意義。
四、多列子查詢
- -查詢出和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使用的注意點:
- 對於rownum只能執行<、<=運算,不能執行>、>=或一個區間運算Between…And等
- 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)*每頁記錄數