- 靈活運用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;