自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle分頁(yè)小談

數(shù)據(jù)庫(kù) Oracle
今天突然看到這篇文章,回想了一下原來(lái),好像大家關(guān)注MySQL和SQL Server的分頁(yè)多一些,不知道是否也有人關(guān)注Oracle的分頁(yè)呢?,借這個(gè)機(jī)會(huì)和大家分享一下Oracle的分頁(yè)吧!

【小編碎語(yǔ)】今天突然看到這篇文章,回想了一下原來(lái),好像大家關(guān)注MySQL和SQL Server的分頁(yè)多一些,不知道是否也有人關(guān)注Oracle的分頁(yè)呢?借這個(gè)機(jī)會(huì)和大家分享一下Oracle的分頁(yè)吧!閑言到此,下面我們開(kāi)始吧!

今天做項(xiàng)目時(shí)要實(shí)現(xiàn)分頁(yè)功能,以前只在mysql上弄過(guò),oracle倒沒(méi)試過(guò),但知道有這樣一個(gè)rownum這個(gè)東西。

但這個(gè)東西也不是那么容易用的,還是有蠻多地方要注意的。它不是物理上存在的一列,而是oracle自己在結(jié)果集中進(jìn)行添加的。

首先我們來(lái)看一下我們的表結(jié)構(gòu)先:

我們新建一個(gè)表:

也就一個(gè)字段ID而已,這方便我們直接地看到結(jié)果。

我們先隨便插入幾條數(shù)據(jù):

先弄進(jìn)去5條吧。

我們直接來(lái)一個(gè):

  1. select rownum,id from test; 

我們看到結(jié)果:

 

很高興吧,都是一模一樣的,ronwum和ID是一樣的,方便我們看。

但結(jié)果看到的結(jié)果可能就會(huì)讓你郁悶啦。

繼續(xù)下來(lái),我們刪除幾條數(shù)據(jù)再插入幾條:

看到結(jié)果,我們是刪除了后面兩條,4,5這兩條記錄,而插入了8,9這兩條記錄。我們?cè)賮?lái)執(zhí)行查詢(xún):

  1. select rownum,id from test; 

我們看到ID為8,9的已經(jīng)取代了之前的4,5得到了rownum為4,5。這個(gè)說(shuō)明了什么,說(shuō)明了rownum并不是物理存在的,如果是物理存在的那么它肯定會(huì)隨著4,5的刪除而把rownum的4,5都刪除了,但它并沒(méi)有,而是把新插入的記錄的rownum作為此值,這說(shuō)明rownum肯定只是一個(gè)邏輯上的列,它有一個(gè)專(zhuān)門(mén)的名稱(chēng)——偽列。

下面我們繼續(xù)插入數(shù)據(jù),方便做下面的實(shí)驗(yàn):

如果我們需要取得前5條記錄,我們會(huì)怎么做呢?我們看到前面的rownum是根據(jù)我們查出來(lái)的結(jié)果來(lái)進(jìn)行賦值的,那么我們就明白了,也許可以這樣:

  1. select rownum,id from test where rownum <= 5 order by id; 

但很杯具的是,我們錯(cuò)了,看看結(jié)果:

為什么錯(cuò)呢?

原因就是rownum會(huì)在我們查詢(xún)出來(lái)結(jié)果還沒(méi)排序前就進(jìn)行編號(hào)。由于是這個(gè)原因,我們只要加個(gè)字查詢(xún)就OK啦。

  1. select rownum,id from (select * from test order by id) where rownum <= 5; 

我們看看結(jié)果:  

現(xiàn)在沒(méi)問(wèn)題了,已經(jīng)按照rownum來(lái)排序了,也就是實(shí)現(xiàn)了我們的要求,查出前5個(gè)。

不要高興的太早,查前5個(gè)沒(méi)問(wèn)題,那中間的記錄呢,第2到5個(gè)呢,或者大于5呢。我們來(lái)看看:

  1. select rownum,id from (select * from test order by id) where rownum >=1 and rownum <= 4; 

看看結(jié)果:

這個(gè)有數(shù)據(jù),而且正常,很好。

但不要高興,我們分頁(yè)一般不會(huì)只要***條開(kāi)始吧,如果要中間呢?我們看看:

  1. select rownum,id from (select * from test order by id) where rownum >= 2 and rownum <= 4; 

這次不要大跌眼睛了:

杯具了吧。

為什么我們剛才拿到的>=1時(shí)會(huì)有呢,而現(xiàn)在>=2沒(méi)有呢?

原因就是oracle在賦值rownum的時(shí)候會(huì)從1開(kāi)始賦值,而當(dāng)我們進(jìn)行rownum >=1時(shí),由于=1這個(gè)條件是成立的,所以它可以繼續(xù)取下一條rownum,繼續(xù)賦值到2,接連賦值下去。

而當(dāng)我們用rownum >=2時(shí),由于=2這個(gè)條件是不成立的,因?yàn)楫?dāng)取到***條rownum=1時(shí),會(huì)把它丟棄,而當(dāng)取到下一條時(shí),rownum還是為1,還是不滿足,一直這樣的循環(huán),***的結(jié)果就是沒(méi)數(shù)據(jù)可查出了。

但我們分頁(yè)確實(shí)要這樣要進(jìn)行,怎么辦呢?

其實(shí)也簡(jiǎn)單,還是子查詢(xún)的方式,不是直接用rownum那我們把子查詢(xún)中的rownum命一個(gè)別名然后通過(guò)它來(lái)限定不就OK了。

我們看看:

  1. select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4; 

也許很多朋友看不明白是什么意思,我們先看看結(jié)果:

很正常,沒(méi)問(wèn)題吧。

但為什么這樣就沒(méi)問(wèn)題呢?其實(shí)我們?cè)谏厦娴淖硬樵?xún)中,直接把rownum用rn作為別名,它就被完全記錄下來(lái)了,這里我們用它來(lái)作限定條件已經(jīng)不關(guān)原來(lái)的rownum的事了。之所以要用兩個(gè)子查詢(xún)是因?yàn)?**個(gè)排序需要作為子查詢(xún)才可以取到正確的rownum,才可以定義別名。

相信看到這,大家都應(yīng)該知道怎么用oracle來(lái)實(shí)現(xiàn)分頁(yè)啦。

這幾天工作忙啊,BlogWriter暫時(shí)進(jìn)展不大,努力啊。

原文鏈接:http://cxshun.iteye.com/blog/1095793

【編輯推薦】

  1. PL/SQL開(kāi)發(fā)中動(dòng)態(tài)SQL的使用與過(guò)程分頁(yè)
  2. 詳解Oracle的幾種分頁(yè)查詢(xún)語(yǔ)句
  3. 談?wù)凧ava調(diào)用SQL Server分頁(yè)存儲(chǔ)過(guò)程
  4. 淺述asp.net海量分頁(yè)數(shù)據(jù)存儲(chǔ)過(guò)程
責(zé)任編輯:艾婧 來(lái)源: 編程人生
相關(guān)推薦

2014-03-21 09:05:40

2011-09-09 09:50:40

Oracle

2010-10-27 10:11:07

Oracle分頁(yè)查詢(xún)

2012-09-18 09:39:57

Linq項(xiàng)目高效

2010-11-18 13:32:12

Oracle分頁(yè)查詢(xún)

2012-08-23 14:09:20

函數(shù)

2011-07-28 09:22:56

Oracle WDPOracle數(shù)據(jù)庫(kù)

2009-11-02 18:03:25

Oracle用戶(hù)表空間

2019-05-30 09:25:59

2010-05-04 15:15:39

Oracle分頁(yè)查詢(xún)

2010-04-16 16:12:51

jdbc分頁(yè)

2015-12-27 23:28:19

云存儲(chǔ)

2009-09-10 14:18:59

Functional F#

2010-10-26 14:50:11

oracle存儲(chǔ)過(guò)程

2012-07-23 14:30:33

Oracle

2009-04-09 13:14:09

Oracle分頁(yè)查詢(xún)CBO

2011-08-19 09:30:42

分頁(yè)查詢(xún)SQL ServerMySQL

2016-01-04 13:32:46

云計(jì)算互聯(lián)網(wǎng)云存儲(chǔ)

2010-04-30 08:47:22

Oracle分頁(yè)存儲(chǔ)

2009-03-04 13:32:28

排序SQLOracle
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)