Oracle分頁小談

2021-06-03 11:38:38 字數 2263 閱讀 6487

今天做專案時要實現分頁功能,以前只在mysql上弄過,oracle倒沒試過,但知道有這樣乙個rownum這個東西。

但這個東西也不是那麼容易用的,還是有蠻多地方要注意的。它不是物理上存在的一列,而是oracle自己在結果集中進行新增的。

首先我們來看一下我們的表結構先:

我們新建乙個表:

也就乙個欄位id而已,這方便我們直接地看到結果。

我們先隨便插入幾條資料:

先弄進去5條吧。

我們直接來乙個:

select rownum,id from test; 

我們看到結果:

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

但結果看到的結果可能就會讓你鬱悶啦。

繼續下來,我們刪除幾條資料再插入幾條:

看到結果,我們是刪除了後面兩條,4,5這兩條記錄,而插入了8,9這兩條記錄。我們再來執行查詢:

select rownum,id from test; 

我們看到id為8,9的已經取代了之前的4,5得到了rownum為4,5。這個說明了什麼,說明了rownum並不是物理存在的,如果是物理存在的那麼它肯定會隨著4,5的刪除而把rownum的4,5都刪除了,但它並沒有,而是把新插入的記錄的rownum作為此值,這說明rownum肯定只是乙個邏輯上的列,它有乙個專門的名稱——偽列。

下面我們繼續插入資料,方便做下面的實驗:

如果我們需要取得前5條記錄,我們會怎麼做呢?我們看到前面的rownum是根據我們查出來的結果來進行賦值的,那麼我們就明白了,也許可以這樣:

select rownum,id from test where rownum <= 5 order

by id; 

但很杯具的是,我們錯了,看看結果:

為什麼錯呢?

原因就是rownum會在我們查詢出來結果還沒排序前就進行編號。由於是這個原因,我們只要加個字查詢就ok啦。

select rownum,id from (select * from test order

by id) where rownum <= 5; 

我們看看結果:  

現在沒問題了,已經按照rownum來排序了,也就是實現了我們的要求,查出前5個。

不要高興的太早,查前5個沒問題,那中間的記錄呢,第2到5個呢,或者大於5呢。我們來看看:

select rownum,id from (select * from test order

by id) where rownum >=1 and rownum <= 4; 

看看結果:

這個有資料,而且正常,很好。

但不要高興,我們分頁一般不會只要第一條開始吧,如果要中間呢?我們看看:

select rownum,id from (select * from test order

by id) where rownum >= 2 and rownum <= 4; 

這次不要大跌眼睛了:

杯具了吧。

為什麼我們剛才拿到的》=1時會有呢,而現在》=2沒有呢?

原因就是oracle在賦值rownum的時候會從1開始賦值,而當我們進行rownum >=1時,由於=1這個條件是成立的,所以它可以繼續取下一條rownum,繼續賦值到2,接連賦值下去。

而當我們用rownum >=2時,由於=2這個條件是不成立的,因為當取到第一條rownum=1時,會把它丟棄,而當取到下一條時,rownum還是為1,還是不滿足,一直這樣的迴圈,最後的結果就是沒資料可查出了。

但我們分頁確實要這樣要進行,怎麼辦呢?

其實也簡單,還是子查詢的方式,不是直接用rownum那我們把子查詢中的rownum命乙個別名然後通過它來限定不就ok了。

我們看看:

select rn,id from (select rownum as rn,id from (select * from test order

by id) ) where rn >=2 and rn <= 4; 

也許很多朋友看不明白是什麼意思,我們先看看結果:

很正常,沒問題吧。

但為什麼這樣就沒問題呢?其實我們在上面的子查詢中,直接把rownum用rn作為別名,它就被完全記錄下來了,這裡我們用它來作限定條件已經不關原來的rownum的事了。之所以要用兩個子查詢是因為第乙個排序需要作為子查詢才可以取到正確的rownum,才可以定義別名。

相信看到這,大家都應該知道怎麼用oracle來實現分頁啦。

小談《金鎖記》

2005 1 18 金鎖記 是張愛玲1943年的作品。同年間的其他作品包括 傾城之戀 第一爐香 第二爐香 茉莉香片 等。張愛玲本人比較喜歡 傾城之戀 而許多讀者,包括 我在內比較傾向於中篇 金鎖記 張愛玲的大部分作品,讀者讀下來的感覺是蒼涼 凝重。我讀 金鎖記 這篇,更感受到 了命運的無奈。篇中幾位...

也談儲存過程分頁

最近我測試小春寫的儲存分頁,發現有些許問題 建立乙個test id,name,fid 向test添充幾十條資料,使id 1,2,3,4.即遞增的integer 其他任意 在t sql debugger給改儲存過程分別傳遞如下引數 querystr from test keyfield id page...

也談儲存過程分頁

最近我測試小春寫的儲存分頁,發現有些許問題 建立乙個test id,name,fid 向test添充幾十條資料,使id 1,2,3,4.即遞增的integer 其他任意 在t sql debugger給改儲存過程分別傳遞如下引數 querystr from test keyfield id page...