sql允許多次嵌套,子查詢即嵌套其他查詢中得查詢
可把子查詢返回結(jié)果理解成一張表,外層查詢會(huì)把子查詢返回的結(jié)果當(dāng)成一張表
子查詢要用括號(hào)括起來
將子查詢放在比較運(yùn)算符的右邊,增強(qiáng)可讀性
子查詢的分類:
單行子查詢:子查詢返回一行記錄,可使用單行比較運(yùn)算符

多行子查詢:子查詢返回多行記錄
--有哪些雇員薪水在平均薪水之上
--1、先求平均薪水
select avg(nvl(e.sal,0)) from emp e;
--2.把所有人的薪水和平均薪水作比較,使用的單行比較運(yùn)算符
select * from emp e where e.sal > (select avg(nvl(e.sal,0)) from emp e);
-- 查詢雇員表哪些人是經(jīng)理人
-- 1.先查詢所有經(jīng)理人 distinct去重(多行子查詢)
select distinct e.mgr from emp e;
--2.在雇員表中過濾是經(jīng)理的
select * from emp where empno in (select distinct e.mgr from emp e);
-- 每個(gè)部門的平均薪水等級(jí)
--1.求出每個(gè)部門的平均薪水等級(jí)
select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno;
--2.根據(jù)部門平均薪水?dāng)喑鲂剿燃?jí)
select g.deptno,sg.grade from salgrade sg join (select e.deptno,avg(nvl(e.sal,0)) avgsal from emp e group by e.deptno) g on g.avgsal between sg.losal and sg.hisal;
--1.求平均薪水最高的部門的部門編號(hào)
-- 求部門平均薪水
select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno;
-- 求最高的薪水
select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t;
-- 求部門編號(hào)(重復(fù)的sql可以抽取為視圖)
select t.deptno,t.vsal from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t where t.vsal = (select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t);
)
--2.求部門的平均薪水的等級(jí)
--3.求部門平均的薪水等級(jí) (薪水等級(jí)的平均)
--求每個(gè)人的薪水等級(jí)
select e.deptno, sg.grade
from emp e
join salgrade sg
on e.sal between sg.losal and sg.hisal;
--求部門的平均薪水等級(jí)
select t.deptno, avg(t.grade)
from (select e.deptno, sg.grade
from emp e
join salgrade sg
on e.sal between sg.losal and sg.hisal) t
group by t.deptno;
--4.求薪水最高的前5名員工
-- 所有員工薪水降序
select * from emp e order by e.sal desc;
-- oracle中沒有l(wèi)imit子句,rownum只存在于查詢出來的虛擬表中
select * from (select * from emp e order by e.sal desc) t where rownum <=5;
--5.求薪水最高的第6到10名
-- 默認(rèn)對(duì)于基表 rownum,跟插入順序有關(guān)
select rownum rn,t.* from emp t;
-- 對(duì)于子查詢r(jià)ownum跟內(nèi)層查詢的順序有關(guān)
--rn順序是根據(jù)內(nèi)層查詢記錄進(jìn)行分配的
select rownum rn,t.* from (select * from emp e order by e.sal desc) t;
-- 根據(jù)rn順序來過濾第6到10條
select * from (select rownum rn,t.* from (select * from emp e order by e.sal desc) t) t1 where t1.rn >5 and t1.rn <=10;