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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章