首页 > 代码库 > 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 复杂的查找用法