Oracle之子查詢(巢狀查詢select巢狀)
阿新 • • 發佈:2019-01-10
一、單值子查詢(> >= = < <= <> 子查詢的結果為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條記錄