oracle分頁查詢原理是什么

oracle的分頁查詢原理:1、利用ORACLE的rownum字段的特性查詢;2、查詢指定數量N條數據;3、從指定數量N條查詢結果中,取出M條數據;4、在web開發中將M、N作為參數進行傳遞,就可以得到分頁的結果。

oracle分頁查詢原理是什么

本教程操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle分頁查詢原理是什么

分頁的原理:

? ? ? ? 1.借助ORACLE的rownum這個字段的特性查詢。

? ? ? ? 2. ?查詢前N條數據

? ? ? ? 3.從第2步的查詢結果中取M到N條數據

? ? ? ?4.在web開發中將M,N作為參數進行傳遞,就可以得到分頁的結果。

例子:? 查詢表中20~30條記錄,sql語句如下。

select?*???from(? ?select???rownum??as??pageNo,??A.*???from????tableName?????A???where???rownum???=20;

示例:

–如何獲取雇員表中薪水最高的前5人?

SELECT?*?FROM( SELECT?*?FROM?emp?ORDER?BY?sal?DESC) WHERE?Rownum<p>--如何獲取雇員表中薪水排名第5的雇員信息</p><pre class="brush:sql;toolbar:false">SELECT?*?FROM( SELECT?*?FROM?emp?ORDER?BY?sal?DESC) WHERE?Rownum=5

–結果查詢不出內容

–同樣ROWNUM>=5查詢5名之后的成績也失敗

–這里就涉及到ROWNUM只能小于不能大于等于。所以–oracle數據庫分頁查詢的一個重要障礙就是這個。

–至于原理因為ROWNUM是一個每一次都要從1開始排列的偽列。于是ROWNUM>=n。比如1大于任何n(第幾條)都不成立。倒是可以ROWNUM=1.可以查到。因為1>=1成立。N=2,1>=2就不成立了。所以大于等于只能查第一條。加上小于等于。只能查這些了。所以這個困難算是增加了分頁查詢的難度與障礙。

–方法一 最簡單的查詢

–第五條到第十條。

–只有一層嵌套,一個子查詢,

SELECT?*?FROM (SELECT?ROWNUM?rn?,e.*?FROM?emp?e?WHERE?ROWNUM=5;

–這樣其實就是下面的方法轉化而來。

–也就是子查詢得到的新表再次被查詢。

–關鍵的一步就是ROWNUM rn。

–而且不要忘了e.*,不然沒有完整數據。

SELECT?*?FROM?(SELECT?ROWNUM?rn,?e.* ??????????FROM?emp?e ?????????WHERE?ROWNUM?=?5;

–上面的沒有排序,下面進行排序

–因為要先排序,才能查詢,所以表越大,效率越慢。

–方法二

SELECT?*?FROM (SELECT?ROWNUM?rm?,e.*?FROM?emp?e?order?by?sal?DESC?) WHERE?rm&gt;=5?AND?rm<p>--下面是用分析函數的方法;</p><p>--方法三</p><pre class="brush:sql;toolbar:false">SELECT?*? FROM?(SELECT?emp.*, ???ROW_NUMBER?()?OVER?(ORDER?BY?sal?DESC)?rank? ????FROM?emp)??? WHERE?rank?&gt;=6?AND?rank<p>--可是我們實際查詢看一下結果,發現完全不一樣。</p><p>--人工查看了一下。分析函數的方法結果是正確的。不理解。</p><p>--有沒有誰能解釋一下。</p><p>--下面來一個沒有意義的</p><pre class="brush:sql;toolbar:false">SELECT?*?FROM? (SELECT?e.*,?ROWNUM?AS?rn?from? (?SELECT?*?FROM?emp?ORDER?BY?sal?DESC)?e )ee? WHERE?ee.rn&gt;=5?AND?ee.rn<p>--方法四(海量數據查詢,如百度,天貓查詢)</p><pre class="brush:sql;toolbar:false">SELECT?*?FROM( SELECT?e.*?,ROWNUM?rn FROM?( SELECT?* FROM?emp ORDER?BY?sal?DESC )?e WHERE??ROWNUM=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<p>--第四步:</p><pre class="brush:sql;toolbar:false">SELECT?*?FROM( SELECT?e?.*,ROWNUM?rn?FROM (SELECT?*?FROM?emp?ORDER?BY?sal?DESC)?e WHERE?ROWNUM=5

–猜測錯誤。

SELECT?e?.*,ROWNUM?rn?FROM (SELECT?*?FROM?emp?ORDER?BY?sal?DESC)?e WHERE?rn<p>--起別名必須查詢出數據表才行,</p><p>--而查詢條件用還不存在的條件去判斷,自然失敗。</p><p>--方法五,閑的無聊的用法</p><pre class="brush:sql;toolbar:false">WITH?ee?AS?( ??SELECT?e.*,?ROWNUM?rn?FROM ?(?SELECT?*?FROM?emp?ORDER?BY?sal?DESC?)e ??) ??SELECT?ee.* ??FROM?ee ??WHERE?ee.rn&gt;=5?AND?ee.rn<p>推薦教程:《<a href="https://www.php.cn/course/list/52.html" target="_blank">Oracle視頻教程</a>》</p>

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享