oracle如何實現(xiàn)翻頁 oracle翻頁查詢語句

如何實現(xiàn)Oracle數(shù)據(jù)庫的分頁顯示?

1.使用T_BASE_PROVINCE表作為測試演示使用

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比莊河網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式莊河網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋莊河地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

2.查詢下總共數(shù)據(jù)量select count(*) from T_BASE_PROVINCE,在分頁的時候,一般會顯示總頁數(shù),需要先查詢總數(shù)據(jù)量得到總頁數(shù),總頁數(shù)=總量/每頁顯示記錄數(shù)。

3.前面的測試數(shù)據(jù)初始化完成之后,查詢前20條大概有什么樣的數(shù)據(jù)。

4.含order by排序,多一層嵌套,因為order by在select之后執(zhí)行,不在里面寫的話可能會出現(xiàn)不是預(yù)期的排序結(jié)果。

如以上回答未能解決問題請看:

一種是利用相反的。

使用minus,即中文的意思就是減去。

一種是利用Oracle的rownum,這個是Oracle查詢自動返回的序號,一般不顯示,但是可以通過select rownum from [表名],可以看到,是從1到當(dāng)前的記錄總數(shù)。 ? ?

oracle怎么實現(xiàn)分頁

因為Oracle數(shù)據(jù)庫沒有Top關(guān)鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:

一種是利用相反的。

PAGESIZE:每頁顯示的記錄數(shù)

CURRENTPAGE:當(dāng)前頁號

數(shù)據(jù)表的名字是:components

索引主鍵字是:id

select * from components where id not in(select id from components where rownum=(PAGESIZE*(CURRENTPAGE-1))) and rownum=PAGESIZE order by id;

如下例:

select * from components where id not in(select id from components where rownum=100) and rownum=10 order by id;

從101到記錄開始選擇,選擇前面10條。

使用minus,即中文的意思就是減去,呵呵,這語句非常的有意思,也非常好記

select * from components where rownum=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum=(PAGESIZE*(CURRENTPAGE-2));

如例:select * from components where rownum=10 minus select * from

一種是利用Oracle的rownum,這個是Oracle查詢自動返回的序號,一般不顯示,但是可以通過select rownum from [表名],可以看到,是從1到當(dāng)前的記錄總數(shù)。

select * from (select rownum tid,components.* from components where rownum=100) where tid=10;

oracle數(shù)據(jù)庫怎么實現(xiàn)分頁,且每頁三條數(shù)據(jù)

您好:oracle查詢分頁可分為兩種情況,一種使用的是rownum ,另外一種則是使用 row_number() over(order by column_name desc)。

1.使用rownum分頁查詢,可用以下方式:

select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum = page * page_size) t2 where t2.rn (page - 1) * page_size;

2.使用 row_number() over() 分頁查詢

select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn (page-1)* page_size and t2.rn = page * page_size;

這種方式,也是可以分頁的。

希望能幫助您!

Oracle常見SQL分頁實現(xiàn)方案

在Oracle中 用SQL來實現(xiàn)分頁有很多種實現(xiàn)方式 但有些語句可能并不是很通用 只能用在一些特殊場景之中

以下介紹三種比較通用的實現(xiàn)方案 在以下各種實現(xiàn)中 ROWNUM是一個最核心的關(guān)鍵詞 在查詢時他是一個虛擬的列 取值為 到記錄總數(shù)的序號

首先來介紹我們工作中最常使用的一種實現(xiàn)方式

SELECT *

FROM (SELECT ROW_ * ROWNUM ROWNUM_

FROM (SELECT *

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) ROW_

WHERE ROWNUM = )

WHERE ROWNUM_ = ;

其中最內(nèi)層的查詢SELECT為不進(jìn)行翻頁的原始查詢語句 可以用自己的任意Select SQL替換 ROWNUM = 和ROWNUM = 控制分頁查詢的每頁的范圍

分頁的目的就是控制輸出結(jié)果集大小 將結(jié)果盡快的返回 上面的SQL語句在大多數(shù)情況擁有較高的效率 主要體現(xiàn)在WHERE ROWNUM = 這句上 這樣就控制了查詢過程中的最大記錄數(shù)

上面例子中展示的在查詢的第二層通過ROWNUM = 來控制最大值 在查詢的最外層控制最小值 而另一種方式是去掉查詢第二層的WHERE ROWNUM = 語句 在查詢的最外層控制分頁的最小值和最大值 此時SQL語句如下 也就是要介紹的第二種實現(xiàn)方式

SELECT *

FROM (SELECT A * ROWNUM RN

FROM (SELECT *

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) A)

WHERE RN BEEEN AND ;

由于Oracle可以將外層的查詢條件推到內(nèi)層查詢中 以提高內(nèi)層查詢的執(zhí)行效率 但不能跨越多層

對于第一個查詢語句 第二層的查詢條件WHERE ROWNUM = 就可以被Oracle推入到內(nèi)層查詢中 這樣Oracle查詢的結(jié)果一旦超過了ROWNUM限制條件 就終止查詢將結(jié)果返回了

而 第二個查詢語句 由于查詢條件BEEEN AND 是存在于查詢的第三層 而Oracle無法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒有意義 因為最內(nèi)層查詢不知道RN代表什么) 因此 對于第二個查詢語句 Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù) 而中間層返回給最外層的也是所有數(shù)據(jù) 數(shù)據(jù)的過濾在最外層完成 顯然這個效率要比第一個查詢低得多

以上兩種方案完全是通過ROWNUM來完成 下面一種則采用ROWID和ROWNUM相結(jié)合的方式 SQL語句如下

SELECT *

FROM (SELECT RID

FROM (SELECT R RID ROWNUM LINENUM

FROM (SELECT ROWID RID

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) R

WHERE ROWNUM = )

WHERE LINENUM = ) T

TABLE T

WHERE T RID = T ROWID;

從語句上看 共有 層Select嵌套查詢 最內(nèi)層為可替換的不分頁原始SQL語句 但是他查詢的字段只有ROWID 而沒有任何待查詢的實際表字段 具體查詢實際字段值是在最外層實現(xiàn)的

這種方式的原理大致為 首先通過ROWNUM查詢到分頁之后的 條實際返回記錄的ROWID 最后通過ROWID將最終返回字段值查詢出來并返回

和前面兩種實現(xiàn)方式相比 該SQL的實現(xiàn)方式更加繁瑣 通用性也不是非常好 因為要將原始的查詢語句分成兩部分(查詢字段在最外層 表及其查詢條件在最內(nèi)層)

但這種實現(xiàn)在特定場景下還是有優(yōu)勢的 比如我們經(jīng)常要翻頁到很后面 比如 條記錄中我們經(jīng)常需要查 及其以后的數(shù)據(jù) 此時該方案效率可能要比前面的高

因為前面的方案中是通過ROWNUM = 來控制的 這樣就需要查詢出 條數(shù)據(jù) 然后取最后 之間的數(shù)據(jù) 而這個方案直接通過ROWID取需要的那 條數(shù)據(jù)

從不斷向后翻頁這個角度來看 第一種實現(xiàn)方案的成本會越來越高 基本上是線性增長 而第三種方案的成本則不會像前者那樣快速 他的增長只體現(xiàn)在通過查詢條件讀取ROWID的部分

當(dāng)然 除了以上提了這些方案 我們還可以用以下的SQL來實現(xiàn)

SELECT *

FROM TABLE

WHERE TABLE _ID NOT IN

(SELECT TABLE _ID FROM TABLE WHERE ROWNUM = )

AND ROWNUM = ;

SELECT *

FROM TABLE

WHERE ROWNUM =

MINUS

SELECT * FROM TABLE WHERE ROWNUM = ;

………………

注意 當(dāng)ROWNUM作為查詢條件時 他是在order by之前執(zhí)行 所以要特別小心

比如我們想查詢TABLE 中按TABLE _ID倒序排列的前 條記錄不能用如下的SQL來完成

lishixinzhi/Article/program/Oracle/201311/11198

oracle分頁查詢語句怎么寫每頁查詢10條

1、通常的分頁寫法,也是第一種分頁方法,類似如下方式:

select * from (

select a.*, rownum rn from

(select * from test a order by object_name) a

where rownum =1000)

where rn 990;

這種方式,是對表進(jìn)行排序翻頁,比較常見,但是,第一頁與第1000頁的性能差異還是挺明顯的。

2、第二種的分頁寫法是對索引進(jìn)行翻頁操作,然后根據(jù)rowid 去表中取數(shù)據(jù)。 這種方式,第一頁與第1000頁性能相差不大。

以下語句雖然使用HINT指定使用索引, 但是仍然沒有生效。

select b.* from (

select * from (

select a.*, rownum rn from

(select /*+ index(a ix_object_name) */ rowid rid from test a order by object_name) a

where rownum =20)

where rn 10) a, test b

where a.rid = b.rowid;

網(wǎng)站名稱:oracle如何實現(xiàn)翻頁 oracle翻頁查詢語句
URL分享:http://muchs.cn/article38/hgchsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站內(nèi)鏈、用戶體驗、網(wǎng)站制作服務(wù)器托管、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)