oracle查询语句(三)
子查询 select * from emp
where sal >(select sal from emp
where ename = 'SCOTT')
–子查询所要解决的问题: 问题不能一步求解。 select ename,sal,(select job from emp where empno=7839) myjob from emp;
–5.强调from后面放置子查询 select * from (select ename,sal from emp);
–主查询和子查询可以不是同一张表,只要子查询返回的结果,主查询可以使用,即可。 select *
from emp
where emp.deptno = (select deptno
from dept
where dname = 'SALES')
–多行操作符 select * from emp where deptno in (select deptno from dept where dname = 'SALES' or dname = 'ACCOUNTING');
–any 和集合的任意一个值比较 select * from emp where sal > any (select sal from emp where deptno = 30);
–类似于大于30号部门员工工资的最小值。可以改写成单行子查询 select * from emp where sal > (select min(sal) from emp where deptno = 30);
–all 和集合的所有值比较 select * from emp where sal > all (select sal from emp where deptno=30);
–null值在多行子查询中的问题 select * from emp where deptno not in (select mgr from emp where mgr is not null)
练习题 select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum <=3
–找到员工表中薪水大于本部门平均薪水的员工。 select e.empno,e.ename,e.sal,b.avgsal from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) b where e.sal > b.avgsal and e.deptno = b.deptno;
–统计员工总人数,以及员工每年入职的人数。 select count(*)total,sum(decode(to_char(hiredate,'yyyy'),'1981',1,0))"1981",'1980',0))"1980",'1982',0))"1982",'1987',0))"1987"
from emp;
集合查询 1、select * from emp where deptno in (10,20);
2、select * from emp where deptno=10 or deptno=20 3、集合运算 select * from emp where deptno=10 union select * from emp where deptno=20;
–利用集合运算实现group by的增强 select deptno,job,sum(sal) from emp group by deptno,job union select deptno,to_char(null),sum(sal) from emp group by deptno union select to_number(null),sum(sal)from emp (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |