首頁 > 資料庫 > Oracle > 主體

oracle分頁查詢原理是什麼

WBOY
發布: 2022-01-25 16:59:31
原創
5084 人瀏覽過

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.將M,N當作參數傳遞,就可以得到分頁的結果。

範例:  查詢表中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
登入後複製

--結果查詢不出內容

--同樣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<=10)
WHERE rn>=5;
登入後複製

#--這樣其實就是下面的方法轉換而來。

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

--關鍵的一步就是ROWNUM rn。

--而且不要忘了e.*,不然沒有完整資料。

SELECT * FROM (SELECT ROWNUM rn, e.*
          FROM emp e
         WHERE ROWNUM <= 10) table_1
 WHERE table_1.rn>= 5;
登入後複製

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

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

--方法二#​​##

SELECT * FROM
(SELECT ROWNUM rm ,e.* FROM emp e order by sal DESC )
WHERE rm>=5 AND rm<=10
登入後複製

--下面是用分析函數的方法;

--方法三

SELECT * 
FROM (SELECT emp.*,
   ROW_NUMBER () OVER (ORDER BY sal DESC) rank 
    FROM emp)   
WHERE rank >=6 AND rank<=10;
登入後複製

--可是我們實際查詢看一下結果,發現完全不一樣。

--人工查看了一下。分析函數的方法結果是正確的。不理解。

--有沒有誰能解釋一下。

--下面來一個沒有意義的

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
登入後複製

--方法四(海量資料查詢,如百度,天貓查詢)

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
登入後複製

--猜測錯誤。

SELECT e .*,ROWNUM rn FROM
(SELECT * FROM emp ORDER BY sal DESC) e
WHERE rn<=10
登入後複製

--起別名必須查詢出資料表才行,

--而查詢條件用還不存在的條件去判斷,自然失敗。

--方法五,閒的無聊的用法

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影片教學

以上是oracle分頁查詢原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!