1. 程式人生 > >Oracle之子查詢(巢狀查詢select巢狀)

Oracle之子查詢(巢狀查詢select巢狀)

一、單值子查詢(> >=  = < <= <> 子查詢的結果為1個數據)

    --查詢最高工資的員工資訊 
    --1.查詢出最高工資 --5000
    select max(sal) from emp;
    --2. 工資等於最高工資
    select * from emp where sal = (select max(sal) from emp);
    --查詢出比僱員7654的工資高,同時和7788從事相同工作的員工資訊
    --1.僱員7654的工資 1250
    select sal from emp where empno = 7654;
    --2.7788從事的工作 ANALYST
    select job from emp where empno = 7788;
    --3.兩個條件合併
    select * from emp where sal > (select sal from emp where empno = 7654) and job = (select job from emp where empno = 7788);
    --查詢每個部門最低工資的員工資訊和他所在的部門資訊
    select e.DEPTNO, min(e.sal) from emp e GROUP by e.DEPTNO;
    select * from emp e1
        inner join (select e.DEPTNO, min(e.sal) minsal from emp e GROUP by e.DEPTNO) t1
            on e1.DEPTNO=t1.DEPTNO and e1.sal=t1.minsal

二、多值子查詢(in  not in  any  all  exist 子查詢的結果為多個數據)

exist(當做布林值來處理,當查詢語句有結果時,返回true,否則返回false)

    --查詢不到資料    
    select * from emp where exists(select * from emp where deptno = 123456);
    --查詢emp中所有記錄 相對於where後條件永遠為true
    select * from emp where exists(select * from emp where deptno = 20); 
    --查詢有員工的部門的資訊
    select * from dept d1 where exists(select * from emp e1 where e1.deptno = d1.deptno );
    --查詢不是領導的資訊(含null值正確寫法)
    select * from emp where empno not in (select mgr from emp where mgr is not null); --查詢出8條記錄

  三、子查詢中的null值問題(解決方法where ... is not null)

  通常情況下, 資料庫中不要出現null,最好的做法加上非空約束Not null,null值並不代表不佔空間, char(100) null佔100個字元

    --查詢不是領導的資訊(含null值錯誤寫法)
    select * from emp where empno not in (select mgr from emp); --查詢不到記錄
    select * from emp where empno <>all(select mgr from emp);--上行等價寫法

    --查詢不是領導的資訊(含null值正確寫法)
    select * from emp where empno not in (select mgr from emp where mgr is not null); --查詢出8條記錄