oracle的分頁查詢原理:1、利用ORACLE的rownum字段的特性查詢;2、查詢指定數(shù)量N條數(shù)據(jù);3、從指定數(shù)量N條查詢結(jié)果中,取出M條數(shù)據(jù);4、在web開發(fā)中將M、N作為參數(shù)進(jìn)行傳遞,就可以得到分頁的結(jié)果。
本教程操作環(huán)境:Windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。
oracle分頁查詢原理是什么
分頁的原理:
1.借助ORACLE的rownum這個(gè)字段的特性查詢。
2. 查詢前N條數(shù)據(jù)
3.從第2步的查詢結(jié)果中取M到N條數(shù)據(jù)
4.在web開發(fā)中將M,N作為參數(shù)進(jìn)行傳遞,就可以得到分頁的結(jié)果。
例子: 查詢表中20~30條記錄,sql語句如下。
select * from( select rownum as pageNo, A.* from tableName A where rownum <= 30) B where B.pageNo >=20;
示例:
–如何獲取雇員表中薪水最高的前5人?
SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum<6
–如何獲取雇員表中薪水排名第5的雇員信息
SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum=5
–結(jié)果查詢不出內(nèi)容
–同樣ROWNUM>=5查詢5名之后的成績也失敗
–這里就涉及到ROWNUM只能小于不能大于等于。所以–oracle數(shù)據(jù)庫分頁查詢的一個(gè)重要障礙就是這個(gè)。
–至于原理因?yàn)镽OWNUM是一個(gè)每一次都要從1開始排列的偽列。于是ROWNUM>=n。比如1大于任何n(第幾條)都不成立。倒是可以ROWNUM=1.可以查到。因?yàn)?>=1成立。N=2,1>=2就不成立了。所以大于等于只能查第一條。加上小于等于。只能查這些了。所以這個(gè)困難算是增加了分頁查詢的難度與障礙。
–方法一 最簡單的查詢
–第五條到第十條。
–只有一層嵌套,一個(gè)子查詢,
SELECT * FROM (SELECT ROWNUM rn ,e.* FROM emp e WHERE ROWNUM<=10) WHERE rn>=5;
–這樣其實(shí)就是下面的方法轉(zhuǎn)化而來。
–也就是子查詢得到的新表再次被查詢。
–關(guān)鍵的一步就是ROWNUM rn。
–而且不要忘了e.*,不然沒有完整數(shù)據(jù)。
SELECT * FROM (SELECT ROWNUM rn, e.* FROM emp e WHERE ROWNUM <= 10) table_1 WHERE table_1.rn>= 5;
–上面的沒有排序,下面進(jìn)行排序
–因?yàn)橐扰判?,才能查詢,所以表越大,效率越慢?/p>
–方法二
SELECT * FROM (SELECT ROWNUM rm ,e.* FROM emp e order by sal DESC ) WHERE rm>=5 AND rm<=10
–下面是用分析函數(shù)的方法;
–方法三
SELECT * FROM (SELECT emp.*, ROW_NUMBER () OVER (ORDER BY sal DESC) rank FROM emp) WHERE rank >=6 AND rank<=10;
–可是我們實(shí)際查詢看一下結(jié)果,發(fā)現(xiàn)完全不一樣。
–人工查看了一下。分析函數(shù)的方法結(jié)果是正確的。不理解。
–有沒有誰能解釋一下。
–下面來一個(gè)沒有意義的
SELECT * FROM (SELECT e.*, ROWNUM AS rn from ( SELECT * FROM emp ORDER BY sal DESC) e )ee WHERE ee.rn>=5 AND ee.rn<=10
–方法四(海量數(shù)據(jù)查詢,如百度,天貓查詢)
SELECT * FROM( SELECT e.* ,ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC ) e WHERE ROWNUM<=10 )WHERE rn>=6;
–分解步驟
–第一步:
SELECT * FROM emp ORDER BY sal DESC
–第二步:
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e
–第三步:
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10
–第四步:
SELECT * FROM( SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10) WHERE rn>=5
–猜測錯(cuò)誤。
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE rn<=10
–起別名必須查詢出數(shù)據(jù)表才行,
–而查詢條件用還不存在的條件去判斷,自然失敗。
–方法五,閑的無聊的用法
WITH ee AS ( SELECT e.*, ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC )e ) SELECT ee.* FROM ee WHERE ee.rn>=5 AND ee.rn<=10
推薦教程:《Oracle視頻教程》