在Oracle中,分頁有兩種方式:rownum和row_number。
現(xiàn)有以下兩張表:
DEPT: DEPTNO,DNAME,LOC
EMP: EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
rownum必須從1開始,記錄查詢出來之后又會從1開始,如:
-
- select rownum,e.* from emp e where rownum<=3;
-
- select rownum,e.* from emp e where rownum>=2 and rownum<=5;
-
- SELECT * FROM (SELECT ROWNUM r,e.* FROM emp e) a
- WHERE r>=4 AND r<=6
--這樣做能成功獲得結(jié)果
select rownum,e.* from emp e where rownum<=3;
--這樣做時沒辦法獲得結(jié)果的
select rownum,e.* from emp e where rownum>=2 and rownum<=5;
--解決辦法是在子查詢中先生成行號,如:
SELECT * FROM (SELECT ROWNUM r,e.* FROM emp e) a
WHERE r>=4 AND r<=6
使用rownum不能直接排序的原因是rownum在order by 之前生成,所以必須先排序,如:
現(xiàn)需要查詢出第二頁記錄(按hiredate倒序,每頁顯示10條記錄)
1.使用rownum分頁:
- SELECT b.* FROM (
- SELECT ROWNUM r,a.* FROM (
- SELECT * FROM emp ORDER BY hiredate DESC) a ) b
- WHERE b.r>=11 AND b.r<=20
SELECT b.* FROM (
SELECT ROWNUM r,a.* FROM (
SELECT * FROM emp ORDER BY hiredate DESC) a ) b
WHERE b.r>=11 AND b.r<=20
2.使用row_number解析函數(shù)分頁:
- SELECT b.* FROM (
- SELECT row_number() over (ORDER BY hiredate DESC) r,x.* FROM emp x ) b
- WHERE b.r>=11 AND b.r<=20
SELECT b.* FROM (
SELECT row_number() over (ORDER BY hiredate DESC) r,x.* FROM emp x ) b
WHERE b.r>=11 AND b.r<=20
在這里注意的是使用解析函數(shù)row_number的效率比使用rownum的效率高。