您的位置:首页 > 数据库 > Oracle

Oracle学习(七)----查询Top—N问题 & 相关子查询

2016-03-30 00:03 585 查看
<pre name="code" class="plain">习题课一:
1:找到员工表中工资最高的员工的信息

方法一:

SQL> select * from emp
2  where sal >= all(select sal from emp);

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10

方法二:

SQL> select * from emp
2  where sal >= (select max(sal) from emp);

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10

2:找到员工表中工资最高的前三名员工的信息(需要用到rownum,不会因为我们的排序而变化,也就是说,他是内置的)
注:
1)rownum按照oracle的默认机制生成
2)rownum只能使用< / <= 号,不能使用 > / >= 号
以上两点与rownum的实现机制有关系:rownum返回集的行号(是一个属性,固话到一行中,不会因为排序而变化),没有第

一行就没有第二行......

SQL> ed
已写入 file afiedt.buf

1  select rownum, ename, sal from
2  (select ename, sal from emp order by sal desc)
3* where rownum <= 3 ------注:不能用>=号,没有一哪有二
SQL> /

ROWNUM ENAME             SAL
---------- ---------- ----------
1 tom_abc          8000
2 KING             5000
3 SCOTT            3000

3:找到员工表中工资第五名到第八名员工的信息(处理a<b<c的情况)

SQL> ed
已写入 file afiedt.buf

1  select r, ename, sal from
2  (
3     select rownum r, ename, sal from   -----将行幻化为实例, 中层
4     (select ename, sal from emp order by sal desc)    ---- 最内层,将行号重新排序
5     where rownum <= 8
6  )
7* where r >= 5
SQL> /

R ENAME             SAL
---------- ---------- ----------
5 JONES            2975
6 BLAKE            2850
7 CLARK            2450
8 ALLEN            1600

=======oracle分页思想总结

(内层排序 外层选,需要三层查询)
内:排序。
中:使用rownum选择前n条;并给rownum指定一个别名,以供最外层过滤使用。
外:去掉前m条结果。

习题课二:
找到员工表中薪水大于本部门平均薪水的员工。

思路1:首先本部门,那么一定会有分组,并将此作为一个表结构
思路2:查找员工表和部门薪水表====>多表查询
思路3:等值条件连接

方法一:

1  select e.deptno, e.ename, e.job, e.sal, d.avgsal avgsal from emp e,
2     (select deptno, avg(sal) avgsal from emp group by deptno ) d
3  where e.deptno = d.deptno and e.sal > d.avgsal
4* order by 1
SQL> /

DEPTNO ENAME      JOB              SAL     AVGSAL
---------- ---------- --------- ---------- ----------
10 tom_abc                    8000     4187.5
10 KING       PRESIDENT       5000     4187.5
20 JONES      MANAGER         2975       2175
20 SCOTT      ANALYST         3000       2175
20 FORD       ANALYST         3000       2175
30 ALLEN      SALESMAN        1600 1566.66667
30 BLAKE      MANAGER         2850 1566.66667

方法二:相关子查询:主查询的参数,让子查询用,一般是通过别名
一般子查询:子查询的结果供主查询使用

1  select empno, ename, sal, (select avg(sal) from emp where deptno = e.deptno) salavg
2  from emp e
3  where sal > (select avg(sal) from emp where deptno = e.deptno)
4* order by 1
SQL> /

EMPNO ENAME             SAL     SALAVG
---------- ---------- ---------- ----------
1 tom_abc          8000     4187.5
7499 ALLEN            1600 1566.66667
7566 JONES            2975       2175
7698 BLAKE            2850 1566.66667
7788 SCOTT            3000       2175
7839 KING             5000     4187.5
7902 FORD             3000       2175

已选择7行。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: