一、嵌套子查詢
- 在通常的子查詢中,子查詢是以嵌套的方式寫在父查詢的WHERE、HAVING、FROM子句中,所以被稱為嵌套子查詢。
- 嵌套子查詢的執(zhí)行過程
- 子查詢首先執(zhí)行一次
- 用來自子查詢的值確認(rèn)或取消父查詢的候選行
- 嵌套子查詢的寫法
- 例如:
SELECT empno, ename, sal FROM emp e,(SELECT deptno,avg(sal) avgsal FROM emp GROUP BY deptno) d WHERE e.deptno =d.deptno AND e.sal >d.avgsal;
二、相關(guān)子查詢
- 相關(guān)子查詢是當(dāng)子查詢中引用了父查詢表中的一個(gè)列時(shí),Oracle服務(wù)器會(huì)執(zhí)行相關(guān)子查詢。
- 相關(guān)子查詢的執(zhí)行過程
1.取得父查詢的候選行
2.用候選行被子查詢引用列的值執(zhí)行子查詢
3.用來自查詢的值確認(rèn)或取消候選行
4.重復(fù)1、2、3,直到父查詢中無剩余的候選行
- 相關(guān)子查詢的寫法
-例如:
SELECT empno,ename,sal,deptno FROM emp outer WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = outer.deptno) ;
三、EXISTS和NOT EXISTS操作符
- 相關(guān)子查詢還可以使用EXISTS和NOT EXISTS操作符來進(jìn)行操作。
- EXISTS 判斷是否“存在”,具體操作如下:
- 子查詢中如果有記錄找到,子查詢語句不會(huì)繼續(xù)執(zhí)行,返回值為TRUE
- 子查詢中如果得到表的結(jié)尾都沒有記錄找到,返回值為FALSE
- EXISTS子查詢并沒有確切的記錄返回,只是判斷是否有記錄存在,而且只要是找到相關(guān)記錄,子查詢就不需要繼續(xù)執(zhí)行,然后再進(jìn)行下面的操作。這樣大大提高了語句的執(zhí)行效率。
- NOT EXSITS正好相反,判斷子查詢是否沒有返回值。如果沒有返回值,認(rèn)為表達(dá)式為真,如果找到一條返回值,則為假。
- 例如:查詢哪些人不是經(jīng)理
SELECT ename,job,sal,deptno FROM emp e WHERE NOT EXISTS (SELECT '1' FROM emp WHERE mgr= e.empno); //注意:因?yàn)镹OT EXSITS子句中,沒有明確的返回值, //只返回真和假,所以不會(huì)返回空值, //即不用考慮子查詢中去掉空值的問題。這是它與NOT IN的區(qū)別。
- 查詢哪些人是經(jīng)理
SELECT ename,job,sal,deptno FROM emp e WHERE EXISTS (SELECT '1' FROM emp WHERE mgr= e.empno); //注意:因?yàn)镋XISTS子句中,沒有明確的返回值,只返回真或假, //所以‘1’就是個(gè)占位符,沒有實(shí)際的意義。