首页 > 代码库 > oracle 复杂的查找用法
oracle 复杂的查找用法
【第一题】: 找到员工表中工资最高的前三名,要求按如下格式输出(第一步部分);以及oracle查询结果指定分页显示的方法(第二部分)。
——涉及Top-N分析问题。
一般不在子查询中使用order by, 但在Top-N分析问题中,必须使用order by
想将现有的表进行分页。1-4第一页,5-8第二页……
参考内容:
行号rownum(伪列)需要注意的问题:
1. rownum永远按照默认的顺序生成。
SQL> select rownum, empno, ename, sal from emp order by sal desc
——发现行号是跟着行走的。查询结果顺序变了,行号依然固定在原来的行上。行号始终使用默认顺序。
2.rownum只能使用<, <=符号,不能使用>,>=符号。
原因:与行号生成的机制有关:Oracle中的行号永远从1开始——取了1才能取2,取了2才能取3,<=8可以是因为1234567挨着取到,而>=5不行,因为没有1234,不能直接取5。
第一部分:输出图片的效果;SQL> select rownum, empno, ename, sal from (select * from emp order by sal desc) where rownum <=3第二部分,对查询的内容进行分页显示:1-4为一页;select rownum, empno, ename, salfrom (select * from emp order by sal desc)where rownum<=4 and rownum>=1/5-8为一页select * from (select rownum r, empno, ename, sal from (select * from emp order by sal desc) where rownum<=8) where r >= 5关键是>=5 的获取问题,是不能直接写rownum>=5的。但是这条SQL语句查询的结果是一个新的“集合”,该集合中有一列是专门表示行号,可以假想这列不再是伪列,而是该集合中专门用来表示行号的列。所以,可以给该列取一个别名r,并把该查询语句整体作为子查询,放到另外一条SQL语句的from后。
【第二题】找到员工表中薪水大于本部门平均薪水的员工
采用两种方法:
第一种:一般子查询,使用自连接(多表查询的一种特殊情况)
与第一题一样,别名的特殊用法;可以从子查询中带出来,当作一个元素来使用。
一般子查询的的执行顺序:先执行子查询(内查询),再执行主查询(外查询),相关子查询除外
第二种:使用相关子查询()
概念:将主查询的某个值,当作参数传递给子查询。
1 一.一般子查询 2 1 select empno, e.deptno, ename, sal , d.davg 3 2 from emp e, (select deptno, avg(sal) davg 4 3 from emp 5 4 group by deptno) d 6 5 where e.deptno = d.deptno and e.sal > d.davg 7 8 9 二.相关子查询10 select empno, e.deptno, ename, sal , (select avg(sal) from emp where deptno = e.deptno group by deptno) as "avg"11 from emp e12 where sal>(select avg(sal) from emp13 where deptno = e.deptno)
【第三题】统计每年入职的员工个数:以下图的格式展现:已知员工的入职年份是---1980,1981, 1982,1987;
提示:该练习只考察函数的应用,注意调用关系。
——decode():第一个参数:待判断的值,条件,结果,条件,结果……最后是else的情况。
1 以图中的格式输出 2 select count(*) Total, 3 sum(decode(to_char(hiredate, ‘yyyy‘), ‘1981‘, 1, 0)) "1981", 4 sum(decode(to_char(hiredate, ‘yyyy‘), ‘1980‘, 1, 0)) "1980", 5 sum(decode(to_char(hiredate, ‘yyyy‘), ‘1982‘, 1, 0)) "1982", 6 sum(decode(to_char(hiredate, ‘yyyy‘), ‘1987‘, 1, 0)) "1987" 7 from emp; 8 9 10 11 12 如忽略输出格式:(即不是图中的输出格式:)13 14 select to_char(hiredate ,‘yyyy‘) as "年份", count(*) as "人数"15 from emp16 group by to_char(hiredate ,‘yyyy‘)
oracle 复杂的查找用法