Oracle提供了rownum,rownum是一个隐含的(查询结果集)字段,rownum是一个行号,从1开始。
select rownum, a.* from emp a;
select * from emp where rownum <=5;
select * from emp where rownum >5;
以上语句,oracle不支持,oracle只支持rownum小于或小于等于的运算, 不支持大于或大于等于的运算。
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
分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置和结束位置,如每页两条数据:
第一页:记录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>开始的行号