1. 程式人生 > >Oracle分頁查詢探究

Oracle分頁查詢探究

導語 :接觸oracle有一段時間了,對於分頁查詢,偽列等概念並不是很透徹,因此一步步查詢分析分頁查詢的意義,為什麼要這麼寫,以此記錄

標準的Oracle分頁 查詢 為三層巢狀,如下
select * from
( select A.*,rownum rn from
( select * from table) Arr
where rownum <=10
) where rn >0

兩層不可以嗎,一層直接查詢呢,開始探究

1. 基礎查詢表資料

SELECT  T.* FROM ONE_NEW T 

查詢結果如下:

基礎查詢
              圖1

查詢結果全部展示出來,但問題是這樣沒法對資料進行分頁,這時候用到了偽列

2. 新增偽列查詢

分頁要用到偽列:

那麼什麼是Oracle的偽列呢?
在Oracle官方文件的Oracle Database SQL Language Reference 11g Release 2 (11.2) E41084-02找到了對偽劣的定義:

A pseudocolumn behaves like a table column, but is not actually stored in the table. You can select from pseudocolumns, but you cannot insert, update, or delete their values. A pseudocolumn is also similar to a function without arguments . However, functions without arguments typically return the same value for every row in the result set, whereas pseudocolumns typically return a different value for each row.

大致的意思如下:

偽列的操作類似於表中的列,但是它並不存實際儲存在表中。你可以對其進行查詢操作,但是你卻不能對其進行增加、修改或者是刪除,一個偽列也類似於一個沒有引數的函式。但是,沒有引數的函式通常在結果集中為每一列返回相同的結果,偽列通常為每一列返回不同的值。

簡單來說,偽列物理上並不存在,只是在查詢時才構造出來
這裡以 ROWNUM為例探究,新增偽列查詢

SELECT ROWNUM,T.* FROM ONE_NEW T 

查詢結果:

新增偽列
               圖2

可以看到,新增偽列後查詢結果確實是多了一列,從上到下自動排列,那這樣能做到分頁嗎?
把資料以1-8行為一頁查詢
首先,以ROWNUM=1進行查詢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM=1

為1的時候
              圖3

以ROWNUM>1進行查詢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM>1

這裡寫圖片描述
              圖4

以ROWNUM=8進行查詢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM=8 

這裡寫圖片描述
              圖5

以ROWNUM>8進行查詢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM>8 

這裡寫圖片描述
               圖6

以ROWNUM<=8進行查詢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM<=8 

這裡寫圖片描述
              圖7

因為ROWNUM由1開始的,所以只能查到ROWNUM=1時的資料, 當查ROWNUM<=8時,也查詢到資料,相當於

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM>=1 AND ROWNUM<=8 

然後我們對此表按照 one_name排序

SELECT ROWNUM ,T.* FROM ONE_NEW T  ORDER BY T.ONE_NAME

這裡寫圖片描述
               圖8

對比圖2可以看出,ROWNUM和每一行對應,排序無法改變容ROWNUM的值,這在查詢過程中就已經確定好了
那這樣能分頁嗎,之前查詢的都是從第一行開始 ,如果我們要查詢第二行到第六行的資料呢

SELECT ROWNUM,T.* FROM ONE_NEW T WHERE ROWNUM>=2 AND ROWNUM<=6

這裡寫圖片描述
              圖9

結果為空,說明這種查詢方式是錯誤的,換下一種!

3. 偽列作為表中的一列來查詢

以上無法查出資料,因為將ROWNUM作為偽列來查的,現在把偽列當作一列來查詢

這裡給ROWNUM 起別名RN 用來排序查詢ROWNUM後的結果

    SELECT * FROM         
            (
           SELECT ROWNUM RN,T.* FROM ONE_NEW T WHERE ROWNUM<=6
                       ) 
                    WHERE RN>=2 

這裡寫圖片描述
               圖10

SELECT ROWNUM,A.* FROM 
                 (
            SELECT ROWNUM RN,T.* FROM ONE_NEW T WHERE ROWNUM<=6 
                 ) A            
                 WHERE RN>=2 

這裡寫圖片描述
              圖11

看結果顯示,查詢出來的RN完成了第一次查詢的排序,第二次從結果集中查詢顯示新的ROWNUM
感覺這樣已經可以了,也查詢到了我們要的結果了,是不是分頁這樣就可以了。
現在想對查詢結果按one_name排序後取2到5條 按照圖八的樣子應該顯示如下

這裡寫圖片描述
              圖12

現在進行查詢

SELECT * FROM  
   (  
     SELECT ROWNUM RN,T.* FROM ONE_NEW T WHERE ROWNUM<=5  
                                   ORDER BY T.ONE_NAME  
       )  
           WHERE RN>=2 

這裡寫圖片描述
               圖13

對比圖12明顯這種查詢結果不同 ,這種是錯誤的,現在換個方式查詢

4. 三層查詢

SELECT * FROM ( 
        SELECT ROWNUM RN,T.*  FROM  
               (          
             SELECT * FROM ONE_NEW  ORDER BY ONE_NAME 
                    )  T   
               WHERE ROWNUM<=5  )  
                        WHERE RN>=2 ;

結果如下,
這裡寫圖片描述
              圖14

這樣就正確了,綜上,oracle分頁查詢時 第一次查詢的為待分頁的結果集,
外面兩層select是對結果集進行分頁。
所以 ,Oracle分頁查詢語句為

select  * from
          (   select  A.*,rownum rn  from 
                      (  select * from table) A
                      where rownum <=10 
                      ) where rn >0

end~

個人淺薄之見,歡迎指正~~ ~~ ~~ ~~ ~~ ~~ ~~~

相關推薦

Oracle查詢探究

導語 :接觸oracle有一段時間了,對於分頁查詢,偽列等概念並不是很透徹,因此一步步查詢分析分頁查詢的意義,為什麼要這麼寫,以此記錄 標準的Oracle分頁 查詢 為三層巢狀,如下 select * from ( s

大數據oracle查詢

增加 返回 and 一個 data 連接 相等 查詢條件 重復數 ROWNUM 可能都知道ROWNUM只適用於小於或小於等於,如果進行等於判斷,那麽只能等於1,不能進行大於的比較。 ROWNUM是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是

ORACLE查詢SQL語法——高效的

推薦 col 停止 sql 條件 esc 記錄 table select --1:無ORDER BY排序的寫法。(效率最高)--(經過測試,此方法成本最低,只嵌套一層,速度最快!即使查詢的數據量再大,也幾乎不受影響,速度依然!) SELECT * FROM (SEL

MySQL、Oracle查詢

del count app spa pos per mail 分頁 request mysql分頁 需用到的參數: pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 s

oracle 查詢

image oracl ora info from bsp lec mage RR select * from (select rownum as rr,t.* from (select * from emp where sal is not null order by

Oracle 查詢總結 ( rownum )

改寫於:   https://blog.csdn.net/fw0124/article/details/42737671    感謝博主 我只是選取自己需要的,你們想知道全部內容可以去訪問以上鍊接,是篇非常好的博文 RowNum 可能都知

ORACLE查詢SQL語句(最有效的)

** 一、效率高的寫法 ** 1.無ORDER BY排序的寫法。(效率最高) (經過測試,此方法成本最低,只巢狀一層,速度最快!即使查詢的資料量再大,也幾乎不受影響,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.*

oracle查詢資料重複問題、排序陷阱

select * from (select rownum as rn, ab.* from (SELECT t.id, e.ehr_id, nh_code,

Oracle 查詢語句SQL

通用模板 SELECT * FROM (SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( ...//替換這裡 ) TMP_PAGE WHERE ROWNUM <

oracle逐步學習總結之oracle查詢(基礎三)

  原創作品,轉載請在文章開頭明顯位置註明出處:https://www.cnblogs.com/sunshine5683/p/10087205.html oracle 的分頁有三種,下面將這三種方式一一列舉,進行分析:   一、根據rowid來分頁   二、根據分

Oracle 查詢總結 ( rownum )

RowNum 可能都知道ROWNUM只適用於小於或小於等於,如果進行等於判斷,那麼只能等於1,不能進行大於的比較。 ROWNUM是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推。 ROWNUM總是從1開始,不管當前的記錄是否

Oracle查詢的提升階段

--Oracle分頁查詢 --簡單初級階段 SELECT * FROM (SELECT * FROM score s ORDER BY math DESC) WHERE ROWNUM = 1; --中級階段,基本實現了結果,但仍有可優化的空間! SELECT *   FRO

通用ORACLE 查詢語句,儲存過程實現

PROCEDURE RECORDS_LIST  (       sqlrecords in varchar2,   sqlrecordscount in varchar2,   cur_result_out out serarch_result,   totalcount o

oracle查詢資料重複問題的解決

在oracle分頁查詢中,我們採用類似以下所示的公認的比較高效的資料庫分頁查詢語句(Effective Oracle by Design中有描述、眾多oracle使用者也做過測試)。 寫道 SELECT * FROM ( SELECT A.*, ROWNUM RN F

oracle查詢

select * from (select rownum rn, employees.*       from employees where rownum <=30) where rn between 21 and 30

oracle查詢步驟

1.首先在資料庫中寫好要使用的sql語句並放到對應的mapper.xml中 2.在對應的mapper中寫相應的方法 3.在寫servic層之前,首先封裝一個怕個Bean類負責分頁查詢的實現 相對應的屬性的getter和setter方法 4.然後去寫相應的servi

oracle 查詢和sql server 查詢 的sql語句

oracle: SELECT * FROM ( SELECT TEMP.* ,ROWNUM RN FROM ( 表) TEMP WHERE ROWNUM <=currentPage * perPageRows ) WHERE RN >  (currentPage

mysql和oracle查詢

mysql分頁 分頁查詢 使用 pan mysql分頁查詢 nbsp max 記錄 不能 MYSQL分頁查詢 方式1: select * from table order by id limit m, n;   該語句的意思為,查詢m+n條記錄,去掉前m

Oracle 查詢與數據去重

不能 根據 back not char text order by 工資 集中 1.rownum字段 Oracle下select語句每個結果集中都有一個偽字段(偽列)rownum存在。rownum用來標識每條記錄的行號,行號從1開始,每次遞增1。rownum是虛擬的順序值

Oracle查詢語句的寫法

Oracle分頁查詢語句的寫法 Oracle分頁查詢語句使我們最常用的語句之一,下面就為您介紹的Oracle分頁查詢語句的用法,