7.一般不在子查询中使用排序;但在Top-N分析问题中,必须对子查询排序
select rownum,empno,ename,sal
from emp
where rownum<3
order by sal desc;
select rownum,empno,ename,sal from emp order by sal desc;
行号永远按照默认的顺序生成
行号只能使用< <=不能使用> >=
select rownum,empno,ename,sal
from (select * from emp order by sal desc)
where rownum<=3;
*******************************************************
SQL> select rownum,empno,ename,sal
2 from emp
3 where rownum<3
4 order by sal desc;
ROWNUM EMPNO ENAME SAL
---------- ---------- ---------- ----------
2 7499 ALLEN 1600
1 7369 SMITH 800
SQL> select rownum,empno,ename,sal
2 from (select * from emp order by sal desc)
3 where rownum<=3;
ROWNUM EMPNO ENAME SAL
---------- ---------- ---------- ----------
1 7839 KING 5000
2 7788 SCOTT 3000
3 7902 FORD 3000
SQL> select rownum,empno,ename,sal from emp order by sal desc;
ROWNUM EMPNO ENAME SAL
---------- ---------- ---------- ----------
9 7839 KING 5000
13 7902 FORD 3000
8 7788 SCOTT 3000
4 7566 JONES 2975
6 7698 BLAKE 2850
7 7782 CLARK 2450
2 7499 ALLEN 1600
10 7844 TURNER 1500
14 7934 MILLER 1300
3 7521 WARD 1250
5 7654 MARTIN 1250
ROWNUM EMPNO ENAME SAL
---------- ---------- ---------- ----------
11 7876 ADAMS 1100
12 7900 JAMES 950
1 7369 SMITH 800
已选择14行。
上面的图1:rownum伪列,这里会默认根据伪列排序。
要找出员工表中工资最高的前三名,(在Top-n分析问题中,必须对子查询进行排序)
行号永远按照默认顺序生成,行号只能用<,<=;不能使用>,>=
图2,这种结果是错的,因为它会根据伪列去取了三个,就算根据sal排序,行号还是不会发生变化;
需要在排序后,行号自动生成才可以,如下图三(先根据子查询生成新的伪列,再取前三个):
一般不在子查询中排序,因为对主查询没有意义
rownum是伪列,oracle默认生成行号 行号需要注意的两个问题 1、行号永远按照默认的顺序生成 2、行号只能使用<,<=;不能使用>,>= select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum<=3; 将排序后的表作为一个集合放到from()中 生成一个新表 重新再查询rownum 就可以让rownum也实现排序了
子查询的排序问题
一般不在子查询中,使用排序;但在Top-N分析问题中,必须对子查询排序
找到员工表中工资最高的前三名
---rownum 行号
1、行号永远按照默认的顺序生成
2、行号只能使用<,<=;不能使用>,>=
select rownum,empno,ename,sal from emp;
select rownum,empno,ename,sal from emp order by sal desc;
select rownum,empon,ename,sal from (select * from emp order by sal desc) where rownum <=3;
原来子查询可以用来解决排序乱的问题
rownum 只能用< 或<=
行号排序:
rownum 行号 伪劣
行号永远按照默认的顺序生成
行号只能使用<, <=;不能使用>,>=
select rownum,empno,ename,sal
from (select * from emp order by sal desc)
where rownum<=3;
rownum 行号 伪劣
行号永远按照默认的顺序生成
行号只能使用<, <=;不能使用>,>=
select rownum,empno,ename,sal
from (select * from emp order by sal desc)
where rownum<=3;
--rownum 行号 伪列
oracle 中的伪列很多.
行号永远按默认顺序生成
行号只能使用<, <=, 不能使用>,>=
行号永远按照默认的顺序排序的,因为是先查出数据,查出数据的瞬间就会添加行号这个伪劣了,如果有order或group才会继续执行,order一般是最后执行的,所以如果where rownuum<3 order by column是先选出3行在order,而不是order后再拿出三行,所以如果要top-N的问题的话是要使用子查询先排序在选出rownum<3或者使用row_num再选出前3的数据。
rownum:行号默认排序
获取top-N需要先对数据进行排序,然后再设置行号
行号条件rownum只能使用</<=
行号永远按照默认顺序生成
行号只能使用<,<=;不能使用>.>=;
实例:查询emp表中薪水排行前三的员工信息
select rownum,empno,ename,sal
from (select * from emp order by sal desc) where ROWNUM<=3;
--TOP-N问题分析
--rownum是oracle伪列 是在生成的时候就默认存在的行号 不会因为我们的排序发生改变
select rownum,e.sal
from emp e
where rownum <=3
order by e.sal desc
--利用子查询的时候 新生成的行号rownum找到薪资前三名的员工信息
select rownum, info.*
from (
select * from emp e
order by e.sal desc
) info
where rownum<=3
rownum 行号 伪列
操作
行号
top n问题