Oracle的分頁是通過rownum實現的
從策劃到設計制作,每一步都追求做到細膩,制作可持續發展的企業網站。為客戶提供網站建設、成都網站建設、網站策劃、網頁設計、空間域名、虛擬空間、網絡營銷、VI設計、 網站改版、漏洞修補等服務。為客戶提供更好的一站式互聯網解決方案,以客戶的口碑塑造優易品牌,攜手廣大客戶,共同發展進步。
rownum是一個偽列 是oracle系統自動為查詢返回結果的每行分配的編號 第一行為 第二行為 以此類推
一個oracle分頁 至少要包含三層(除非不用order by 暫時可以用 層實現) 模板為
select temp * from(
select rownum num temp * from(
SQL查詢
) temp where rownum=n
)temp ?? where temp numn
例如 值返回查詢結果第 條到 條著 條的信息的SQL如下
select temp *
from(
select rownum num temp *
from(
select tt title_id tt name
from t_title tt
where tt name like %美%
order by tt sort_seqs asc tt title_Id desc) temp
where rownum=
)temp
where temp num
分析
首先是一個正常的查詢語句(包含order by)
select tt title_id tt name
from t_title tt
where tt name like %美%
order by tt sort_seqs asc tt title_Id desc
這個和正常的SQL語句沒有任何的區別
添加rownum字段 顯示列數
select rownum num temp *
from(
select tt title_id tt name
from t_title tt
where tt name like %美%
order by tt sort_seqs asc tt title_Id desc) temp
where rownum=
我們添加了rownum 顯示字段 這時候就會會每行添加一個行數的編號 并且只返回 條之前的數據(包含 條)
截取第 條到 條的數據 SQL就是上面最完整的那個啦
使用精解
rownum的使用
如下兩條語句
select rownum id name from student where rownum ;
select rownum id name from student where rownum= ;
第一條語句的執行結果為空 第二條語句的執行結果為前 條記錄
為什么會這樣呢 我們知道rownum是偽列 是oracle為查詢結果自動添加的偽列 第一行是 如果where rownum 這時候查找第一條發現它的rownum= 不滿足條件 于是拋棄掉 把第二條語句的rownum賦值為 再判斷第二條記錄是否滿足條件 同樣不滿足 于是發生了死循環一樣的判斷 最終返回空
有人這時候就奇怪啦 為什么第一條記錄rownum= 不滿足條件時候 第二條記錄rownum= 卻要重新設值為 呢 非常簡單 你直接在where后添加了條件rownum 它是個條件啦 第一條記錄不滿足條件 叫拋棄掉啦 這時候結果集是空的 當然會一直rownum= 的賦值
解決辦法:先查詢 并為每條記錄分配rownum 然后嵌套查詢
select t * from (select rownum num id name from student) t where t num
第二條語句可以正常的執行 根據上面的解釋 這個可以理解了吧!
rownum與order by同時存在的問題
當 where 后面有rownum的判斷 并且存在order by時候 rownum的優先級高!
oracle會先執行rownum的判斷 然后從結果中order by 很明顯是錯誤的結果啦!就好像學校要取成績最好的前 名同學 結果這種方法一執行 成了取出 名同學 然后按照成績的高低排序!
這點與SQL Server的TOP完全不同 TOP遇上order by 是先執行order by 在分頁的
lishixinzhi/Article/program/Oracle/201311/17827
在Oracle中有一個方法rownum用來查詢第一行到第n行的內容,但沒有一個合適的方法若查詢第x行到第y行的內容,而在實際應用中卻經常需要查詢第x行到第y行的內容,這時我們就需要使用rownum和子表查詢等內容來進行查詢,因為這一塊內容屬于Oracle總的常用部分所以專門在此介紹。
在Oralce中有一個偽列rownum,其在創建表的時候就存在了卻不顯示,若要使用這個列可以直接調用即可,也可以對這個列添加別名來調用。
rownum只能用于顯示小于某行的數據即第一行開始到你要查詢到的那一行為止的數據。
在Oracle把查詢第幾行到第幾行的操作稱為分頁,其具體操作是通過子查詢等操作完成。
select 列名 from (select 表名.*,rownum rn from 表名)表名 ?where rn操作;
思考如下:
1.選擇所有內容
select * from emp;
2.顯示rownum
select e.*,rownum rn from(select * from emp)e;
這一步可以精簡為下面形式,但某些情況只能用上面那種
select emp.*,rownum rn from emp;
3.查詢
select * from(select e.*,rownum rn from (select * from emp)e);
4.其他變化
在某些時候我們需要先對表的內容進行排序,隨后查詢第x行到第y行的內容,這個時候有一個需要注意的點是rownum是在表產生的時候產生的偽列,所以使用排序會連著rownum的值進行排序,從而達不到想要的效果。
為了解決上述這個問題,我們需要使用子表查詢即先排好序,再在新表之中顯示rownum來規避這個問題。
考慮到排序的問題,所以在上方第二步的時候使用第一種方法即select e.*,rownum rn from(select * from emp)e;,在內表select * from emp中進行排序可以完成在亂序中找到第x行到第y行的效果。
1、通常的分頁寫法,也是第一種分頁方法,類似如下方式: select * from ( select a.*, rownum rn from (select * from test a order by object_name) a where rownum 990; 這種方式,是對表進行排序翻頁
因為一個功能需要讀取一個大表的所有數據做業務處理,那這樣肯定不能一次性查出所有數據,需要程序分頁查詢處理,模擬測試一個200萬數據量的表發現耗時很久,并不是業務處理耗時,而且分頁查詢耗時了。oracle的分頁查詢可能大家都知道利用rownum,而且大部分公司這種分頁都是底層封裝好的了,所有平時大家使用的時候也沒注意(這次之后特意留意了一下,我們公司就是用了錯誤的)
這兩條查詢語句看著區別不大,但是性能卻差很多。經過測試第一種性能最好,而且隨著數量的增大,幾乎不受影響。第二種隨著數據量的增大,查詢速度也越來越慢。表200W條數據的情況下,第一種查詢耗時基本是0.3s,第二種基本在1.3s以上。一個查詢足足差了一秒。別小看這1秒。200W條數據每次查詢1000條,查詢完也差了2000s=33分鐘.
分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM = 20這句上。
這是由于CBO優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。
對于正確有order by語句,第二層的查詢條件WHERE ROWNUM = 20就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了
對于錯誤有order by 語句,由于查詢條件where b.rowno = 11 and b.rowno = 20是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道b.rowno代表什么)。因此對于這個語句,Oracle最內層返回給中間層的是所有滿足條件的數據,而中間層返回給最外層的也是所有數據。數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。
上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內層查詢是復雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。
sql語句如下:
分頁1
SELECT *
FROM (Select ROWNUM AS ROWNO, T.*
from 表名 T(別名)
where 表字段 between to_date('20060501', 'yyyymmdd') and ?to_date('20060731', 'yyyymmdd')
AND ROWNUM = 20) TABLE_ALIAS
WHERE TABLE_ALIAS.ROWNO = 10;
經過測試,此方法成本最低,只嵌套一層,速度最快,即使查詢的數據量再大,也幾乎不受影響,速度依然.
分頁2:
SELECT *
FROM (SELECT TT.*, ROWNUM AS ROWNO
FROM (Select t.*
? ? from 表名 T(別名)
? ? where flight_date between to_date('20060501', 'yyyymmdd') and
? ? ? ?to_date('20060531', 'yyyymmdd')
? ? ORDER BY FACT_UP_TIME, flight_no) TT(別名二)
WHERE ROWNUM = 20) TABLE_ALIAS
where TABLE_ALIAS.rowno = 10;
經過測試,此方法隨著查詢范圍的擴大,速度也會越來越慢,
可以根據下面操作進行編寫。
1.#返回前5行 Mssql 2000分頁采用top關鍵字(20005以上版本也支持關鍵字Select top 10 * from t_order where id not in (select id from t_order where id5 )。
2.Oracle分頁采用rownum關鍵字(三層嵌套) SELECT * FROM( SELECT A.*,ROWNUM num FROM (SELECT * FROM t_order)A WHERE ROWNUM=15) WHERE num=5;--返回第5-15行數據。
3.采用row_number解析函數進行分頁(效率更高) SELECT xx.* FROM --返回第5-15行數據 解析函數能用格式 函數over(pertion by 字段 order by 字段)。
4.Pertion 按照某個字段分區 Order 按照勒個字段排序。
網站名稱:oracle分頁如何事項 oracle分頁怎么寫
網頁地址:http://m.newbst.com/article14/hjpjge.html
成都網站建設公司_創新互聯,為您提供外貿網站建設、商城網站、云服務器、手機網站建設、網站設計公司、軟件開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯