码迷,mamicode.com
首页 > 数据库 > 详细

oracle 复杂的查找用法

时间:2016-09-20 00:02:24      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

【第一题】: 找到员工表中工资最高的前三名,要求按如下格式输出(第一步部分);以及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, sal
from (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 e
12   where sal>(select avg(sal) from emp
13           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 emp
16      group by to_char(hiredate ,yyyy)

 

oracle 复杂的查找用法

标签:

原文地址:http://www.cnblogs.com/yyx1-1/p/5887067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!