日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Oracle 数据库的子查询(关联子查询)

發(fā)布時(shí)間:2023/12/3 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 数据库的子查询(关联子查询) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、子查詢結(jié)果返回一個(gè)值(單列單行)
  • 二、子查詢結(jié)果返回多行(單列多行)
  • 三、子查詢結(jié)果返回多列多行
  • 四、關(guān)聯(lián)子查詢
    • (一)子查詢執(zhí)行順序
    • (二)exists 關(guān)鍵字
  • 五、子查詢總結(jié)
  • 六、關(guān)聯(lián)子查詢示例

一、子查詢結(jié)果返回一個(gè)值(單列單行)

選擇比較運(yùn)算符:> < >= <= = <>

select ename from emp_xxx where salary > ( select salary from emp_xxx where ename = '張無(wú)忌' ) ;

二、子查詢結(jié)果返回多行(單列多行)

選擇比較運(yùn)算符:>ALL >ANY <ALL <ANY in

select ename from emp_xxx where salary > ALL( select salary from emp_xxx where ename = '張無(wú)忌' ) ; select ename from emp_xxx where salary > ANY( select salary from emp_xxx where ename = '張無(wú)忌' ) ; select ename,salary,job from emp_xxx where deptno in(select deptno from emp_xxx where ename = '劉蒼松') and ename <> '劉蒼松' ;

三、子查詢結(jié)果返回多列多行

查詢每個(gè)部門(mén)薪水最高的員工:

select ename, salary, job, deptno from emp_xxx where (deptno, salary) in ( select deptno, max(salary) from emp_xxx where deptno is not null group by deptno ) ;

注意:
子查詢的條件是單列還是多列沒(méi)關(guān)系 , 關(guān)鍵是要分清返回的是單行還是多行。

  • 如果是單行 , 用單行比較運(yùn)算符 ,=,>,< 這些
  • 如果是多行 , 用 in, >all, >any, <all, <any 這些

四、關(guān)聯(lián)子查詢

子查詢不再是獨(dú)立的 Sql 語(yǔ)句 , 需要依賴主查詢傳來(lái)的參數(shù) , 這種方式叫關(guān)聯(lián)子查詢。

子查詢又稱內(nèi)部查詢,而包含子查詢的語(yǔ)句稱之外部查詢(又稱主查詢)。

查詢員工表中薪水比所在部門(mén)平均薪水小的員工:

select ename, salary, deptno from emp_xxx a where salary < ( select avg(nvl(salary,0)) from emp_xxx where deptno = a.deptno ) ; -- 子查詢不再是獨(dú)立的 Sql 語(yǔ)句 , 需要依賴主查詢傳來(lái)的參數(shù) a.deptno

查詢員工表中薪水比所在部門(mén)平均薪水大的員工:

select ename,salary,deptno, (select avg(ifnull(salary,0)) from emp_htlwk where deptno = e.deptno) avgsal from emp_htlwk e where salary > (select avg(ifnull(salary,0)) from emp_htlwk where deptno =e.deptno);

上述例子中,一個(gè)子查詢嵌到主查詢的 select 子句,一個(gè)子查詢嵌到 where 子句中。

(一)子查詢執(zhí)行順序

  • 非關(guān)聯(lián)子查詢是獨(dú)立于外部查詢的子查詢,子查詢總共執(zhí)行一次,執(zhí)行完畢后將值傳遞給外部查詢。所以非關(guān)聯(lián)子查詢,先執(zhí)行子查詢,再執(zhí)行主查詢

  • 關(guān)聯(lián)子查詢的執(zhí)行依賴于外部查詢的數(shù)據(jù),外部查詢執(zhí)行一行,子查詢就執(zhí)行一次。所以關(guān)聯(lián)子查詢,先執(zhí)行主查詢,再執(zhí)行子查詢

(二)exists 關(guān)鍵字

哪些人是其他人的經(jīng)理(即查詢有下屬的員工):

select ename from emp_xxx a where exists (select 1 from emp_xxx where mgr = a.empno) ;
  • exists 關(guān)鍵字判斷子查詢有沒(méi)有數(shù)據(jù)返回,有則為 ture,沒(méi)有則為 false,exists 不關(guān)心子查詢的結(jié)果,所以子查詢中 select 后面寫(xiě)什么都可以,本例中我們寫(xiě)常量“1”

  • sql 執(zhí)行順序從主查詢開(kāi)始 , 把主查詢中的 empno 數(shù)據(jù)傳入子查詢 , 作為條件中的參數(shù)

哪些人不是別人的經(jīng)理:

select ename from emp_xxx a where not exists (select 1 from emp_xxx where mgr = a.empno) ;

哪些部門(mén)沒(méi)有員工:

select deptno, dname from dept_xxx d where not exists (select 1 from emp_xxx where deptno = d.deptno) ;

五、子查詢總結(jié)

  • 非關(guān)聯(lián)子查詢,先執(zhí)行子查詢,再執(zhí)行主查詢,子查詢只執(zhí)行一次,子查詢的結(jié)果作為參數(shù)傳給主查詢使用;
  • 關(guān)聯(lián)子查詢,先執(zhí)行主查詢,再執(zhí)行子查詢,主查詢執(zhí)行一次后,子查詢跟著執(zhí)行一次,主查詢執(zhí)行多少次,那么子查詢也會(huì)執(zhí)行多少次,主查詢的結(jié)果作為參數(shù)傳給子查詢使用;
  • 子查詢只能是 select 查詢語(yǔ)句,不可以是 update、insert 等 DML 語(yǔ)句。
  • 六、關(guān)聯(lián)子查詢示例

    1.查詢每個(gè)科目成績(jī)最高的學(xué)生信息:

    SELECT t.stuid, t.stuname, t.score, t.classid FROM stugrade t WHERE t.score = (SELECT max(tmp.score) FROM stugrade tmp WHERE tmp.classid = t.classid)

    2.篩選出每個(gè)部門(mén)工資排名前二的員工信息,并且按部門(mén)升序,按部門(mén)分組,部門(mén)內(nèi)的員工按工資降序:

    select deptid,salary from employee a where 2 > (select count(1)from employee bwhere a.salary < b.salary and a.deptid = b.deptid) order by a.deptid,a.salary desc;

    總結(jié)

    以上是生活随笔為你收集整理的Oracle 数据库的子查询(关联子查询)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。