高級(jí)子查詢

一、嵌套子查詢
  • 在通常的子查詢中,子查詢是以嵌套的方式寫在父查詢的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í)際的意義。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容