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
圖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分頁查詢語句的用法,