服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Sql Server - SQL Server分页方法汇总

SQL Server分页方法汇总

2022-09-16 17:11springsnow Sql Server

这篇文章介绍了SQL Server分页的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

根据SalesOrderID排序,取第16-18行这3条记录。

方法一:(最常用的分页代码, top / not in)

?
1
2
3
4
5
6
SELECT   TOP 3 [SalesOrderID], [RevisionNumber], [OrderDate]
FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
WHERE    [SalesOrderID] NOT IN (   SELECT   TOP 15 [SalesOrderID]
                                    FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
                                    ORDER BY [SalesOrderID] )
 ORDER BY SalesOrderID;

备注: 注意前后的order by 一致

方法二:排名开窗函数 (row_number() over (order by ))

?
1
2
3
4
5
6
SELECT  [SalesOrderID], [RevisionNumber], [OrderDate]
FROM    (   SELECT [SalesOrderID], [RevisionNumber], [OrderDate] ,
                   ROW_NUMBER() OVER ( ORDER BY SalesOrderID ) AS rowid
            FROM   [AdventureWorks2012].[Sales].[SalesOrderHeader] ) cte
WHERE   rowid
BETWEEN 16 AND 18;

方法三:(offset /fetch next, SQL Server 2012支持,性能最好!)

?
1
2
3
SELECT   [SalesOrderID], [RevisionNumber], [OrderDate]
 FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
 ORDER BY SalesOrderID OFFSET 15 ROW FETCH NEXT 3 ROWS ONLY;

总结:利用变量进行分页

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE @page INT, @size INT, @Total INT;
SELECT @page = 3, @size = 10; --当前页面为3,页面大小为10
 
-------方法一
SELECT   TOP ( @size ) [SalesOrderID], [RevisionNumber], [OrderDate]
FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
WHERE    [SalesOrderID] NOT IN (   SELECT   TOP (( @page - 1 ) * @size ) [SalesOrderID]
                                   FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
                                   ORDER BY [SalesOrderID] )
ORDER BY SalesOrderID;
 
-------方法二
SELECT  [SalesOrderID], [RevisionNumber], [OrderDate]
FROM    (   SELECT [SalesOrderID], [RevisionNumber], [OrderDate] ,
                   ROW_NUMBER() OVER ( ORDER BY SalesOrderID ) AS rowid
            FROM   [AdventureWorks2012].[Sales].[SalesOrderHeader] ) cte
WHERE   rowid
BETWEEN ( @page - 1 ) * @size + 1 AND @page * @size;
 
-------方法三
SELECT   [SalesOrderID], [RevisionNumber], [OrderDate]
FROM     [AdventureWorks2012].[Sales].[SalesOrderHeader]
ORDER BY SalesOrderID OFFSET ( @page - 1 ) * @size ROWS FETCH NEXT @size ROWS ONLY; ---offset的当前页面是从零开

到此这篇关于SQL Server分页的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/springsnow/p/9590661.html

延伸 · 阅读

精彩推荐