程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> MSSQL MySQL 數據庫分頁(存儲進程)

MSSQL MySQL 數據庫分頁(存儲進程)

編輯:MSSQL

MSSQL MySQL 數據庫分頁(存儲進程)。本站提示廣大學習愛好者:(MSSQL MySQL 數據庫分頁(存儲進程))文章只能為提供參考,不一定能成為您想要的結果。以下是MSSQL MySQL 數據庫分頁(存儲進程)正文


先看看單條 SQL 語句的分頁 SQL 吧。

辦法1:
實用於 SQL Server 2000/2005

SELECT TOP 頁年夜小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 頁年夜小*(頁數-1) id FROM 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 and 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 '+@OrderColumns+' ) 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的游標存儲進程分頁) 效力最差,然則最為通用
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved