先看看單條 sql 語句的分頁 sql 吧。
方法1:
適用於 sql server 2000/2005
複製** **如下:
select top 頁大小 *
from table1
where id not in
( select top 頁大小*(頁數-1) id frwww.cppcns.comom table1 order by id
) order by id
方法2:
適用於 sql server 2000/2005
複製** **如下:
select top 頁大小 *
from table1
where id >
( select isnull(max(id),0)
from
( select top 頁大小*(頁數-1) id from table1 order by id
) a
) order by id
方法3:
適用於 sql server 2005
複製** **如下:
select top 頁大小 *
from
( select row_number() over (order by id) as rownumber,* from table1
) a
where rownumber > 頁大小*(頁數-1)
方法4:
適用於 sql server 2005
複製** **如下:
row_number() 必須制定 order by ,不指定可以如下實現,但不能保證分頁結果正確性,因為排序不一定可靠。可能第一次查詢記錄a在第一頁,第二次查詢又跑到了第二頁。
declare @pageno int ,@pagesize int;
set @pageno = 2
set @pagesize=20
select * from (
select row_number() over(order by getdate()) rn,* from sys.objects)
tb where rn >(@pageno-1)*@pagesize a程式設計客棧nd rn <=@pageno*@pagesize
還有一種方法就是將排序字段作為變數,通過動態sql 實現,可以改成儲存過程。
複製** **如下:
declare @pageno int ,@pagesize int;
declare @tablename varchar(128),@ordercolumns varchar(500), @sql varchar(max);
set @pageno = 2
set @pagesize=20
set @tablename = 'sys.objects'
set @ordercolumns = 'name asc,object_id desc'
set @sql = 'select * from (
select row_number() over(order by '+@ordercolu程式設計客棧mns+' ) rn,* from ' +@tablename+')tb where rn >'+convert(varchar(50),(@pageno-1)*@pagesize) +' and rn <= '+convert(varchar(50),@pageno*@pagesize)
print @sql
exec(@sql)
方法5:(利用sql的游標儲存過程分頁)
適用於 sql server 2005
複製** **如下:
create procedure sqlpager
@sqlstr nvarchar(4000), --查詢字串
@currentpage int, --第n頁
@pagesize int --每頁行數
as set 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
程式設計客棧
方法5:(利用mysql的limit)
適用於 mysql
mysql中limit的用法詳解[資料分頁常用]
在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣乙個功能。
複製** **如下:
select * from table limit [offset,] rows | rows offset offset
limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初 始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 相容,mysql 也支援句法: limit # offset #。
mysql> select * from table limit 5,10; // 檢索記錄行 6-15
//為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:
mysql> select * from table limit 95,-1; // 檢索記錄行 96-last.
//如果只給定乙個引數,它表示返回最大的記錄行數目:
mysql> select * from table limit 5; //檢索前 5 個記錄行
//換句話說,limit n 等價於 limit 0,n。
1. select * from tablename 條件語句》 limit 100,15
從100條記錄後開始取15條 (實際取取的是第101-115條資料)
2. select * from tablename 條件語句》 limit 100,-1
從第100條後開始-最後一條的記錄
3. select * from tablename 條件語句》 limit 15
相當於limit 0,15 .查詢結果取前15條資料
說程式設計客棧明,頁大小:每頁的行數;頁數:第幾頁。使用時,請把"頁大小"和"頁大小*(頁數-1)"替換成數字。
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。
通過sql 查詢分析器,顯示比較:我的結論是:
分頁方案二:(利用id大於多少和select top分頁)效率最高,需要拼接sql語句
分頁方案一:(利用not in和select top分頁) 效率次之,需要拼接sql語句
分頁方案三:(利用sql的游標儲存過程分頁) 效率最差,但是最為通用
本文標題: mssql mysql 資料庫分頁(儲存過程)
本文位址:
資料庫分頁
mysql 分頁採用limt 關鍵字select from t order limit 5,10 返回第6 15 行資料 select from t order limit 5 返回前5 行 select from t order limit 0,5 返回前5 行 mssql 2000 分頁採用to...
資料庫分頁
oracle分頁 方法1 根據rowid來分 select from uop crm1.tf f user where rowid in select rid from select rownum r,rid from select rowid rid from uop crm1.tf f user...
資料庫分頁
一 mysql 資料庫分頁查詢 mysql資料庫實現分頁比較簡單,提供了limit函式。一般只需要直接寫到sql語句後面就行了。limit子句可以用來限制由select語句返回過來的資料數量,它有乙個或兩個引數,如果給出兩個引數,第乙個引數指定返回的第一行在所有資料中的位置,從0開始 注意不是1 第...