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>開始的行號