在Oracle中有一個(gè)方法rownum用來(lái)查詢第一行到第n行的內(nèi)容,但沒(méi)有一個(gè)合適的方法若查詢第x行到第y行的內(nèi)容,而在實(shí)際應(yīng)用中卻經(jīng)常需要查詢第x行到第y行的內(nèi)容,這時(shí)我們就需要使用rownum和子表查詢等內(nèi)容來(lái)進(jìn)行查詢,因?yàn)檫@一塊內(nèi)容屬于Oracle總的常用部分所以專門(mén)在此介紹。

成都創(chuàng)新互聯(lián)公司成立于2013年,我們提供高端成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站定制、全網(wǎng)整合營(yíng)銷推廣、微信小程序、微信公眾號(hào)開(kāi)發(fā)、seo優(yōu)化排名服務(wù),提供專業(yè)營(yíng)銷思路、內(nèi)容策劃、視覺(jué)設(shè)計(jì)、程序開(kāi)發(fā)來(lái)完成項(xiàng)目落地,為成都加固企業(yè)提供源源不斷的流量和訂單咨詢。
在Oralce中有一個(gè)偽列rownum,其在創(chuàng)建表的時(shí)候就存在了卻不顯示,若要使用這個(gè)列可以直接調(diào)用即可,也可以對(duì)這個(gè)列添加別名來(lái)調(diào)用。
rownum只能用于顯示小于某行的數(shù)據(jù)即第一行開(kāi)始到你要查詢到的那一行為止的數(shù)據(jù)。
在Oracle把查詢第幾行到第幾行的操作稱為分頁(yè),其具體操作是通過(guò)子查詢等操作完成。
select 列名 from (select 表名.*,rownum rn from 表名)表名 ?where rn操作;
思考如下:
1.選擇所有內(nèi)容
select * from emp;
2.顯示rownum
select e.*,rownum rn from(select * from emp)e;
這一步可以精簡(jiǎn)為下面形式,但某些情況只能用上面那種
select emp.*,rownum rn from emp;
3.查詢
select * from(select e.*,rownum rn from (select * from emp)e);
4.其他變化
在某些時(shí)候我們需要先對(duì)表的內(nèi)容進(jìn)行排序,隨后查詢第x行到第y行的內(nèi)容,這個(gè)時(shí)候有一個(gè)需要注意的點(diǎn)是rownum是在表產(chǎn)生的時(shí)候產(chǎn)生的偽列,所以使用排序會(huì)連著rownum的值進(jìn)行排序,從而達(dá)不到想要的效果。
為了解決上述這個(gè)問(wèn)題,我們需要使用子表查詢即先排好序,再在新表之中顯示rownum來(lái)規(guī)避這個(gè)問(wèn)題。
考慮到排序的問(wèn)題,所以在上方第二步的時(shí)候使用第一種方法即select e.*,rownum rn from(select * from emp)e;,在內(nèi)表select * from emp中進(jìn)行排序可以完成在亂序中找到第x行到第y行的效果。
因?yàn)镺racle數(shù)據(jù)庫(kù)沒(méi)有Top關(guān)鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:
一種是利用相反的。
PAGESIZE:每頁(yè)顯示的記錄數(shù)
CURRENTPAGE:當(dāng)前頁(yè)號(hào)
數(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到記錄開(kāi)始選擇,選擇前面10條。
使用minus,即中文的意思就是減去,呵呵,這語(yǔ)句非常的有意思,也非常好記
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,這個(gè)是Oracle查詢自動(dòng)返回的序號(hào),一般不顯示,但是可以通過(guò)select rownum from [表名],可以看到,是從1到當(dāng)前的記錄總數(shù)。
select * from (select rownum tid,components.* from components where rownum=100) where tid=10;
1、通常的分頁(yè)寫(xiě)法,也是第一種分頁(yè)方法,類似如下方式:
select * from (
select a.*, rownum rn from
(select * from test a order by object_name) a
where rownum =1000)
where rn 990;
這種方式,是對(duì)表進(jìn)行排序翻頁(yè),比較常見(jiàn),但是,第一頁(yè)與第1000頁(yè)的性能差異還是挺明顯的。
2、第二種的分頁(yè)寫(xiě)法是對(duì)索引進(jìn)行翻頁(yè)操作,然后根據(jù)rowid 去表中取數(shù)據(jù)。 這種方式,第一頁(yè)與第1000頁(yè)性能相差不大。
以下語(yǔ)句雖然使用HINT指定使用索引, 但是仍然沒(méi)有生效。
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;
前提:
分頁(yè)參數(shù):size = 20 page = 2;
沒(méi)有order by的查詢;
嵌套子查詢,兩次篩選(推薦使用)。
SQL語(yǔ)句:
SELECT *
FROM (SELECT ROWNUM AS rowno, t.*
FROM DONORINFO t
WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
AND TO_DATE ('20060731', 'yyyymmdd')
AND ROWNUM = 20*2) table_alias
WHERE table_alias.rowno 20*(2-1);
擴(kuò)展資料:
rownum總是從1開(kāi)始的,第一條不滿足去掉的話,第二條的rownum 又成了1。依此類推,所以永遠(yuǎn)沒(méi)有不滿足條件的記錄。
可以這樣理解:rownum是一個(gè)序列,是Oracle數(shù)據(jù)庫(kù)從數(shù)據(jù)文件或緩沖區(qū)中讀取數(shù)據(jù)的順序。它取得第一條記錄則rownum值為1,第二條為2。
依次類推:當(dāng)使用“、=、=、between...and”這些條件時(shí),從緩沖區(qū)或數(shù)據(jù)文件中得到的第一條記錄的rownum為1,不符合sql語(yǔ)句的條件,會(huì)被刪除,接著取下條。下條的rownum還會(huì)是1,又被刪除,依次類推,便沒(méi)有了數(shù)據(jù)。
1.使用T_BASE_PROVINCE表作為測(cè)試演示使用
2.查詢下總共數(shù)據(jù)量select count(*) from T_BASE_PROVINCE,在分頁(yè)的時(shí)候,一般會(huì)顯示總頁(yè)數(shù),需要先查詢總數(shù)據(jù)量得到總頁(yè)數(shù),總頁(yè)數(shù)=總量/每頁(yè)顯示記錄數(shù)。
3.前面的測(cè)試數(shù)據(jù)初始化完成之后,查詢前20條大概有什么樣的數(shù)據(jù)。
4.含order by排序,多一層嵌套,因?yàn)閛rder by在select之后執(zhí)行,不在里面寫(xiě)的話可能會(huì)出現(xiàn)不是預(yù)期的排序結(jié)果。
如以上回答未能解決問(wèn)題請(qǐng)看:
一種是利用相反的。
使用minus,即中文的意思就是減去。
一種是利用Oracle的rownum,這個(gè)是Oracle查詢自動(dòng)返回的序號(hào),一般不顯示,但是可以通過(guò)select rownum from [表名],可以看到,是從1到當(dāng)前的記錄總數(shù)。 ? ?
您好:oracle查詢分頁(yè)可分為兩種情況,一種使用的是rownum ,另外一種則是使用 row_number() over(order by column_name desc)。
1.使用rownum分頁(yè)查詢,可用以下方式:
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() 分頁(yè)查詢
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;
這種方式,也是可以分頁(yè)的。
希望能幫助您!
本文題目:oracle怎么寫(xiě)分頁(yè),oracle sql 分頁(yè)
URL鏈接:http://chinadenli.net/article9/dsicdoh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)建站、商城網(wǎng)站、網(wǎng)站收錄、網(wǎng)站改版、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)