MSSQL MySQL 資料庫分頁 儲存過程

2022-09-25 01:48:11 字數 3823 閱讀 1659

先看看單條 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 第...