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