Oracle中的分頁查詢~~~ROWNUM(行號(hào))

Oracle中的表,除了我們建表時(shí)設(shè)計(jì)的各個(gè)字段,其實(shí)還有兩個(gè)字段(此處只介紹2個(gè)),分別是ROWID(行標(biāo)示符)和ROWNUM(行號(hào))。即使我們使用DESCRIBE命令查看表的結(jié)構(gòu),也無法看到這兩個(gè)列的描述,因?yàn)樗鼈兤鋵?shí)是只在數(shù)據(jù)庫內(nèi)部使用的,所以也通常稱它們?yōu)閭瘟校╬seudo column)。
建一個(gè)只有兩個(gè)字段(id,col)的表。使用describe命令查看表結(jié)構(gòu),可以看到確實(shí)只有建表時(shí)的兩個(gè)字段。但我們可以查詢的時(shí)候,可以查找到偽列的值。

10年的武穴網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整武穴建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“武穴網(wǎng)站設(shè)計(jì)”,“武穴網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

select rowid,rownum,id,col from table;

這個(gè)rowid我們一般用不到,Oracle數(shù)據(jù)庫內(nèi)部使用它來存儲(chǔ)行的物理位置,是一個(gè)18位的數(shù)字,采用base-64編碼。而這個(gè)rownum,我們正是用它來進(jìn)行分頁查詢的,它的值,就是表示的該行的行號(hào)。
對(duì)于分頁查詢,我們只要想辦法可以查詢到從某一起始行到終止行就可以的,分頁的邏輯可以放到程序里面。于是,我們理所當(dāng)然會(huì)想到如下語句查詢第2頁的數(shù)據(jù)(每頁2條數(shù)據(jù),頁碼從1開始,所以起始行的行號(hào)為 (頁碼-1)*每頁長(zhǎng)度+1=3,終止行的行號(hào)為 頁碼*每頁長(zhǎng)度=4):

select * from table where rownum>=3 rownum <= 4;

出人意料,沒有任何結(jié)果。原因很簡(jiǎn)單,Oracle機(jī)制就是這樣的:因?yàn)榈谝粭l數(shù)據(jù)行號(hào)為1,不符合>=3的條件,所以第一行被去掉,之前的第二行變?yōu)樾碌牡谝恍校催@個(gè)行號(hào)不是寫死的,可以理解為是動(dòng)態(tài)的),如此下去,一直到最后一行,條件始終沒法滿足,所以就一條數(shù)據(jù)也查不出來。
對(duì)癥下藥,要想解決這個(gè)問題,我們只要將行號(hào)查詢出來生成一個(gè)結(jié)果集,然后再從這個(gè)結(jié)果集中,選擇行號(hào)大于我們?cè)O(shè)定的那個(gè)值就可以了,上面的分頁查找正確的寫法應(yīng)該是這樣:

select id,col from(
select rownum rn,u.* from table u) ua
where ua.rn between 3 and 4;

上面的語句還可以優(yōu)化:雖然不能用">=",但"<="卻可以用。為提高查詢效率,我們可以使用終止行篩選子查詢的結(jié)果,SQL如下:

select id,col from(
select rownum rn,u.* from table u where rownum<=4) ua
where ua.rn >= 3;

很多時(shí)候,我們并不是盲目的分頁查找的,而是按某一個(gè)或多個(gè)字段的升序或降序分頁,即包含 order by 語句的分頁查詢,我們先看一下 order by 的查詢結(jié)果中rownum是怎樣的:

select rownum,id,col from table order by col;

結(jié)果,這時(shí)候的行號(hào)并不是經(jīng)過 order by 后結(jié)果的增序行號(hào)。
但有了上面的嵌套查詢的經(jīng)驗(yàn),這里也可以好好應(yīng)用一下,怎么做呢:先查找出排序好的結(jié)果集,然后應(yīng)用上面的方法得到最終結(jié)果,sql如下:

select id,col from(
select rownum rn,uo.* from
(select * from table order by col) uo
where rownum<=4 ) ua
where ua.rn>=3;

分頁效果的實(shí)現(xiàn),思路有三種:

其一:純JS實(shí)現(xiàn)分頁。一次性查詢記錄并加載到html的table中。然后通過選擇性地顯示某些行來達(dá)到分頁顯示的目的。這是一種偽分頁,障眼法而已。只能用于數(shù)據(jù)少的情況下。一旦數(shù)據(jù)多了,十幾萬條數(shù)據(jù)加載到html中會(huì)變得很慢。而且不實(shí)時(shí),一次加載完后數(shù)據(jù)就寫死在頁面了,若數(shù)據(jù)庫中有變化,瀏覽器端顯示的仍是上次加載過來的數(shù)據(jù)。

其二:一次查詢,分批顯示。
就是說,我們可以執(zhí)行一個(gè)數(shù)據(jù)庫查詢操作,得到結(jié)果集rs。然后,通過指針的移動(dòng)來顯示當(dāng)前頁面的記錄。這樣,就可以以 rs.absolute(當(dāng)前頁面號(hào)*每頁記錄數(shù))定位到當(dāng)前頁的第一條記錄,然后通過while循環(huán)顯示n條記錄(n為每頁顯示記錄數(shù))。在跳頁時(shí),只需修改currentPage,即可在重定位到下一頁時(shí)把當(dāng)前頁面號(hào)改掉,重新定位記錄指針,通過while遍歷顯示n條記錄。與JS選擇性顯示不同,這里是選擇性遍歷。與JS分頁不同的是,這里分頁每次跳頁修改的是遍歷的指針,每次跳頁都要進(jìn)行一次全面查詢。同樣地,不適合大數(shù)據(jù)量查詢。這里比JS分頁優(yōu)化的地方在于——實(shí)時(shí)性。每次跳頁都會(huì)查詢一次數(shù)據(jù)庫,保證數(shù)據(jù)的實(shí)時(shí)性。

其三:在服務(wù)端分頁。跳到第n頁才查詢、顯示第n頁內(nèi)容。要點(diǎn)就是根據(jù)客戶端表格的“頁面”計(jì)算出數(shù)據(jù)庫要查詢的當(dāng)前頁面的第一條記錄的位置。優(yōu)點(diǎn):實(shí)時(shí)性:跳頁才查詢。數(shù)據(jù)量小:只加載當(dāng)前頁的記錄進(jìn)行顯示。

文章標(biāo)題:Oracle中的分頁查詢~~~ROWNUM(行號(hào))
網(wǎng)站路徑:http://muchs.cn/article32/pppssc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、外貿(mào)建站域名注冊(cè)、網(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í)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司