oracle數據庫SQL開發之高級子查詢
一、嵌套子查詢
• 在通常的子查詢中,子查詢是以嵌套的方式寫在父查詢的where、having、from子句中,所以被稱爲嵌套子查詢.
• 嵌套子查詢的執行過程:
– 1.子查詢首先執行一次;
– 2.用來自子查詢的值確認或取消父查詢的候選行;
二、相關子查詢(父查詢中的行每被處理一次,子查詢就執行一次)
• 在where子句中使用相關子查詢;
• 在select子句中使用相關子查詢;
• exists和not exists操作符。
1.• 相關子查詢的執行過程:
–(1).取得父查詢的候選行;
– (2).用候選行被子查詢引用列的值執行子查詢;
– (3).用來自子查詢的值確認或取消候選行;
–(4).重複步驟(1)、(2)、(3),直到父查詢中無剩餘的候選行。
下圖中 outer 爲table1的表別名
–查詢比本部門平均薪水高的員工姓名,薪水。
select empno,ename, sal,deptno
from emp outer--(別名)
where sal >
(select avg(sal)
from emp
where deptno =
outer.deptno) ;
–.查詢比所在職位平均工資高的員工姓名,職位
select e.ename,e.job
from emp e
where e.sal > (select avg(emp.sal) from emp where emp.job = e.job);
–.查詢工資爲其部門最低工資的員工編號,姓名,工資。
select e.empno,e.ename,e.sal
from emp e
where e.sal = (select min(emp.sal) from emp where emp.deptno = e.deptno);
2.exists和not exists操作符
– exists判斷是否“存在”,具體操作如下:
• 子查詢中如果有記錄找到,子查詢語句不會繼續執行返回值爲true;
• 子查詢中如果到表的末尾也沒有記錄找到,返回值爲false。
– esists子查詢並沒有確切記錄返回,只判斷是否有記錄存在,而且只要找到相關記錄,子查詢就不需要再執行,然後再進行下面的操作。這樣大大提高了語句的執行效率。
– not exists正好相反,判斷子查詢是否沒有返回值。如果沒
有返回值,表達式爲真,如果找到一條返回值,則爲假。
– 因爲exists子句中,並沒有確切記錄返回,只返回真或假。所以’1’只是佔位用,無實際意義。佔位符運用。
-查詢哪些人是經理?
select ename , job, sal, deptno
from emp e
where exists (select '1'
from emp
where mgr= e.empno);