Oracle教程
Oracle练习题

Oracle Rownum用法

Oracle提供了rownum,rownum是一个隐含的(查询结果集)字段,rownum是一个行号,从1开始。

rownum隐含字段

select rownum, a.* from emp a;

取得前5条数据

select * from emp where rownum <=5;

取得大与第5条的所有数据

select * from emp where rownum >5;

以上语句,oracle不支持,oracle只支持rownum小于或小于等于的运算, 不支持大于或大于等于的运算。

取得薪水最好的前5名

select rownum, empno, ename, sal from emp where rownum<=5 order by sal desc;

上面的结果不正确,因为采用order by不会改变rownum,rownum的值在数据插入到表中时已经形成,正确使用的方式,将排序好的数据作为一张表来使用,这样这个表的rownum是新形成的,所以可以保证它的顺序是正确的,如下:

select empno, ename, sal 
from (select empno, ename, sal from emp order by sal desc)
where rownum <=5

采用rownum进行分页

分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置结束位置,如每页两条数据:

第一页:记录1~2

第二页:记录3~4

。。。。。。。

因为rownum存在问题,所以需要采用三层的select嵌套完成分页,嵌套的目的将rownum转换成我们自己的字段,如:

select empno, ename, sal
from 
(
 select rownum r, empno, ename, sal 
 from 
  (
   select empno, ename, sal from emp order by sal desc
  )    
  where rownum <=5 
)where r>0

通用的分页方法,使用的时候可以直接拷贝。只需要修改红色字体的部分就可以了。

select *
from 
(
 select rownum r, t.* 
 from 
  (
    任意的SQL语句
  )  t  
  where rownum <=结尾的行号 
)where r>开始的行号