不同資料庫分頁

2021-08-23 13:27:33 字數 2874 閱讀 7461

oracle分頁

****************************************=

分頁的宗旨是控制查詢出來的資料個數,下面這條語句對於oracle分頁已經足夠了。

(注:該語句只能用於oracle)

select * from (select aa.*, rownum rn from (select * from users order by id desc) aa where rownum <= 10) where rn > 0

上面的這兩個數值只需要你在程式中動態傳入值,例如在struts或servlet中動態傳入兩個引數就可以進行分頁控制。

oracle的rownum欄位是個比較奇怪的字段。拿一張有26條記錄的test表來舉例。 select * from test where rownum >=1; select * from test where rownum >=2; select * from test where rownum <= 10; 第一條sql查出了26條記錄,第二條sql一條記錄也沒查出。第三條sql查出10條記錄。 導致這個的原因是因為rownum是個虛擬的字段,它是在記錄輸出的時候逐步產生的。 對第一條sql,第一條記錄的rownum是1,滿足條件被輸出,因此第二條紀錄的rownum就變成2,滿足條件被輸出,依此類推,就把所有紀錄都查出來了。 對於第二條sql,第一條記錄的rownum是1,不滿足條件沒被輸出,因此第二條記錄的rownum還是1,沒滿足條件沒被輸出,依此類推,所有紀錄都沒能被查出來。 對於第三條sql,第一條記錄的rownum是1,滿足條件被輸出,因此第二條記錄的rownum就遞增為2,滿足條件被輸出,直到第11條及之後的所有記錄的rownum變成了11,不滿足條件沒被輸出。 所以要查詢test表第n條到第m條的記錄,我們應該這樣寫: //對已形成的rownum進行過濾 select * from ( //先用乙個select把待查sql包圍起來,此時rownum已經形成 select row_.*, rownum rownum_ from ( select * from test ) row_ ) where rownum_ <= m and rownum_ >= n;

sqlserver 分頁

****************************************=

分頁方案一:(利用not in和select top分頁)

語句形式:

select top 10 *

from testtable

where (id not in

(select top 20 id

from testtable

order by id))

order by id

select top 頁大小 *

from testtable

where (id not in

(select top 頁大小*頁數 id

from 表

order by id))

order by id

-------------------------------------

分頁方案二:(利用id大於多少和select top分頁)

語句形式:

select top 10 *

from testtable

where (id >

(select max(id)

from (select top 20 id

from testtable

order by id) as t))

order by id

select top 頁大小 *

from testtable

where (id >

(select max(id)

from (select top 頁大小*頁數 id

from 表

order by id) as t))

order by id

-------------------------------------

分頁方案三:(利用sql的游標儲存過程分頁)

create procedure xiaozhengge

@sqlstr nvarchar(4000), --查詢字串

@currentpage int,--第n頁

@pagesize int--每頁行數

asset nocount on

declare @p1 int,--p1是游標的id

@rowcount int

exec sp_cursoropen @p1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output

select ceiling(

1.0*@rowcount/@pagesize

) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁

set @currentpage=(@currentpage-1)*@pagesize+1

exec sp_cursorfetch @p1,16,@currentpage,@pagesize

exec sp_cursorclose @p1

set nocount off

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。

建議優化的時候,加上主鍵和索引,查詢效率會提高。

通過sql 查詢分析器,顯示比較:我的結論是:

分頁方案二:(利用id大於多少和select top分頁)效率最高,需要拼接sql語句

分頁方案一:(利用not in和select top分頁) 效率次之,需要拼接sql語句

分頁方案三:(利用sql的游標儲存過程分頁) 效率最差,但是最為通用

在實際情況中,要具體分析。

不同資料庫的分頁技術

針對不同的資料庫,分頁的實現方法是不一樣的。oracle分頁技術 oracle資料庫為我們提供了兩個很重要的字段 rowid和rownumber。rowid是乙個絕對的值,是針對某一行分配的乙個唯一的行識別符號,根據它我們可以非常迅捷地定位到某乙個具體的行。它也起著主鍵的作用,即它是唯一的 uniq...

不同資料庫的分頁實現

oracle 1 偽列 rownum select from select t.rownum rn from t user t where rownum page.getcurrentpage 1 page.getpagesize 2 物理列 rowid select from t user t w...

不同資料庫中的分頁查詢方法

不同資料庫中的分頁查詢方法 在實際應用中,往往能碰到分頁的需求。雖然有不少元件可以實現物件導向的分頁,但是都是利用了快取。很多時候,這些方法是不可用的。原因很簡單,在乙個資料量非常大的應用中,快取全部資料無論是對網路傳輸還是對記憶體都是不小的浪費。所以,還是回歸自然吧,利用分頁查詢來獲取當前頁的資料...