1. 程式人生 > 其它 >Oracle筆記10——Oracle高階子查詢

Oracle筆記10——Oracle高階子查詢

一、巢狀子查詢相關子查詢

①巢狀子查詢與相關子查詢的特點
巢狀子查詢:可以單獨執行
相關子查詢:不可以單獨執行,依賴於父查詢

②巢狀子查詢與相關子查詢的執行步驟
巢狀子查詢:
1)先執行子查詢
2)再使用步驟1)中的資料,交給父查詢使用,用於確認或取消資料
相關子查詢:
1)先執行父查詢一次
2)將父查詢得到的資料,交給子查詢使用,用於確認或取消父查詢資料
3)重複執行步驟1)、2),直到資料最後一行

--1.查詢比本部門平均薪水高的員工姓名,薪水
--(1)巢狀子查詢
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;--①部門平均薪水
SELECT e.ename, e.sal
  
FROM emp e, (SELECT deptno, AVG(sal) avgsal FROM emp GROUP BY deptno) m WHERE e.deptno = m.deptno AND e.sal > avgsal; --(2)相關子查詢 SELECT e.ename, e.sal FROM emp e WHERE sal > (SELECT AVG(sal) FROM emp m WHERE e.deptno = m.deptno); --2.查詢所有部門名稱和人數 --(1)巢狀子查詢 SELECT deptno, COUNT(1) countone FROM
emp GROUP BY deptno;--①查詢所有部門人數 SELECT d.dname, countone FROM dept d, (SELECT deptno, COUNT(1) countone FROM emp GROUP BY deptno) m WHERE d.deptno = m.deptno; --(2)相關子查詢 SELECT dname, (SELECT COUNT(1) FROM emp WHERE dept.deptno = deptno) FROM dept; --3.查詢哪些員工是經理 --(1)巢狀子查詢 SELECT DISTINCT
mgr FROM emp WHERE mgr IS NOT NULL;--①查詢有哪些經理編號 SELECT * FROM emp WHERE empno IN(SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL); --(2)相關子查詢 SELECT * FROM emp e1 WHERE (SELECT COUNT(1) FROM emp e2 WHERE e2.mgr = e1.empno) > 0; --******4.查詢每個部門工資前兩名高的員工姓名,工資****** ---------------------------1)10部門的員工: 1 CLARK 2450.00 2 KING 5000.00 3 MILLER 1300.00 其中,比1300工資高的有2人,比2450工資高的有1人,比5000工資高的有0人 ------需要獲取的是工資為2450和5000的員工資訊2)20部門的員工: 1 SMITH 800.00 2 JONES 2975.00 3 SCOTT 3000.00 4 ADAMS 1100.00 5 FORD 3000.00 其中,比800工資高的有4人,比1100工資高的有3人,比2975工資高的有2人,比3000工資高的有0人 ------需要獲取的是工資為3000的兩個員工資訊3)30部門的員工: 1 ALLEN 1600.00 2 WARD 1250.00 3 MARTIN 1250.00 4 BLAKE 2850.00 5 TURNER 1500.00 6 JAMES 950.00 其中,比950工資高的有5人,比1250工資高的有3人,比1500工資高的有2人,比1600工資高的有1人,比2850工資高的人有0人 ------需要獲取的是工資為1600和2850的員工資訊 結論:為了獲取每個部門工資排前兩名的員工資訊,只需要判斷該員工的工資大於該部門員工的工資的個數是否小於等於1,即 SELECT ename, sal, deptno FROM emp e1 WHERE (SELECT COUNT(1) FROM emp e2 WHERE e2.deptno = e1.deptno AND e2.sal > e1.sal) <= 1;

二、EXISTS 與 NOTEXISTS

--(1)查詢哪些員工是經理?
SELECT * FROM emp e1 WHERE (SELECT COUNT(1) FROM emp e2 WHERE e2.mgr = e1.empno) > 0; --效率低
SELECT * FROM emp e1  WHERE EXISTS (SELECT * FROM emp e2 WHERE e2.mgr = e1.empno);    --效率高

--(2)查詢哪些員工不是經理?
SELECT * FROM emp e1 WHERE (SELECT COUNT(1) FROM emp e2 WHERE e2.mgr = e1.empno) = 0;--效率低
SELECT * FROM emp e1  WHERE NOT EXISTS (SELECT * FROM emp e2 WHERE e2.mgr = e1.empno);--效率高