select deptno,dname,(select count(*) from emp e where e.deptno=d.deptno) amount from dept d;
select ename,sal,e.deptno from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) m where e.deptno=m.deptno and e.sal>m.avgsal;
select * from emp where job=(select job from emp where ename='SCOTT');
select deptno,avg(sal) from emp group by deptno having avg(sal)>(select max(sal) from emp where deptno=30);
select * from emp where deptno in(select deptno from dept where dname='RESEARCH' or dname='SALES');
select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);
select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);
select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum<=5;
select * from emp e where e.deptno in(20,30) and rownum<=5 order by e.sal desc;
select * from (select rownum rowline,emp1.* from (select * from emp where deptno in (20,30) order by sal) emp1 where rownum<=10) emp2 where emp2.rowline>=7 and emp2.rowline<=8;
select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum>=7 and rownum<=8;
這個查詢永遠也不會有數據生成,爲何呢,由於當內層查詢產生第一條記錄時,oracle爲其僞列賦值rownum=1,oracle
外層查詢判rownum>=7 and rownum<=8不符合條件去除記錄,當第二條記錄產生時,oracle仍然會爲其僞列賦值rownum=1,spa
外層判斷仍然不會經過,這樣不管內層查詢產生多少數據都會由於外層查詢的條件不符合記錄而流失數據。code
而想要避免這樣的狀況發生,就須要將僞列當成一個查詢中的字段,將它不在看作「僞列」,而是真正的一個字段,blog
這樣就須要在外面在嵌套一層查詢將僞列作成一個物理上存在的字段,而最後咱們只須要將外層查詢的條件改成內層查詢中「真實」存在的僞列便可。排序
子查詢的相關內容總結完畢,有不明處請多多指教。 2018-08-13 15:51:41開發