- 灵活运用select语句解决实际的问题
- 通过三个具体的示例,演示如何编写高效的查询语句
示例一
分页查询显示员工信息:显示员工号,姓名,月薪
- 每页显示四条记录
- 显示第二页的员工
- 按照月薪降序排列
注意:rownum只能使用<, <=, 不能使用>, >=
select r, empno,ename,sal
from (select rownum r,empno,ename,sal
from (select rownum,empno,ename,sal
from emp order by sal desc) el
where rownum<=8) e2
where r >=5;
示例二
(1)找到员工表中薪水大于本部门平均薪水的员工
参考运行结果一:
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
from emp e
where sal > (select avg(sal) from emp where deptno= e.deptno);
参考运行结果一,执行效率:
explain plan for
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
from emp e
where sal > (select avg(sal) from emp where deptno=e.deptno) ;
select * from table(dbms_xplan.display);
(2)找到员工表中薪水大于本部门平均薪水的员工
参考运行结果二:
select e.empno,e.ename,e.sal,d.avgsal
from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno = d.deptno and e.sal > d.avgsal;
参考运行结果二,执行效率:
explain plan for
select e.empno,e.ename,e.sal,d.avgsal
from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno = d.deptno and e.sal > d.avgsal;
select * from table(dbms_xplan.display);
示例三
按部门统计员工人数,按照年份进行统计
(1)使用函数解决
select count(*) Total,
sum(decode(to_char(hiredate,'YYYY'),'1980',1,0)) "1980",
sum(decode(to_char(hiredate,'YYYY'),'1981',1,0)) "1981",
sum(decode(to_char(hiredate,'YYYY'),'1982',1,0)) "1982",
sum(decode(to_char(hiredate,'YYYY'),'1987',1,0)) "1987"
from emp;
(2)使用子查询解决
select
(select count(*) from emp) Total,
(select count(*) from emp where to_char (hiredate, 'yyyy')='1980') "1980",
(select count(*) from emp where to_char (hiredate, 'yyyy')='1981') "1981",
(select count(*) from emp where to_char (hiredate, 'yyyy')='1982') "1982",
(select count(*) from emp where to_char (hiredate, 'yyyy')='1987') "1987"
from dual;