select deptno,dname,(select count(*) from emp e where e.deptno=d.deptno) amount from dept d;
此处子查询位于select后面,是每个部门的员工总人数。 Example2:查找工资大于部门平均工资的员工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');
此处子查询位于where条件中,是和scott员工一样的职位。 Example4:查询部门平均工资大于30号部门最高工资的部门信息。select deptno,avg(sal) from emp group by deptno having avg(sal)>(select max(sal) from emp where deptno=30);
此处子查询位于having子句中,是30号部门的最高工资。 Example5:查询部门是开发部或销售部的员工信息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);
此处用到了多行子查询中的ALL操作符,用于获取30号部门的所有工资信息,这里all起的主要作用是为了获得30号部门的最大工资,大于所有的意思就是大于最大的即可。 Example7:获取工资大于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,
外层查询判rownum>=7 and rownum<=8不符合条件去除记录,当第二条记录产生时,oracle仍然会为其伪列赋值rownum=1,
外层判断仍然不会通过,这样无论内层查询产生多少数据都会因为外层查询的条件不符合记录而流失数据。
而想要避免这样的情况发生,就需要将伪列当成一个查询中的字段,将它不在看做“伪列”,而是真正的一个字段,