MSSQL分页查询:如何实现?

引言

在软件开发中,分页查询是非常常见的需求。对于大型数据量的系统而言,避免数据一次性全部查询出来,通过分页的方式来减轻数据库的负担,提高数据的查询效率。本文将结合实例讲解如何使用T-SQL在MSSQL数据库中进行分页查询。

什么是分页查询

分页查询即是将查询结果按页进行划分,每页展示一部分数据供用户查看,而用户可以通过界面上的翻页按钮或者滚动条来切换不同页码,查询相应的数据结果。在实际应用中,很多时候,我们不需要一次性将所有的查询结果都返回到客户端,而是根据实际需求分阶段返回结果。

分页查询实现方式

在MSSQL数据库中,实现分页查询的方式有多种,本文介绍的是使用ROW_NUMBER和OFFSET-FETCH语句的方式。

ROW_NUMBER函数简介

ROW_NUMBER是MSSQL数据库中的一个窗口函数,常用于计算行号。具体使用方法为:

 

SELECT ROW_NUMBER() OVER (ORDER BY [列名]) AS 行号 ,[其他列] FROM [表名]

上述代码中,ROW_NUMBER()函数用于计算每行的行号,OVER子句用于指定排序方式。通过这个函数,我们可以在查询结果中加上一列行号,然后以这列行号为基础来实现分页查询。

OFFSET-FETCH语句简介

OFFSET-FETCH语句是从MSSQL2012版本开始引入的新特性,它可以很方便地实现分页查询。具体使用方法为:

SELECT [列名1],[列名2],……

FROM [表名]

ORDER BY [排序列1] [升/降序] ,[排序列2] [升/降序],[排序列N] [升/降序]

OFFSET [页码-1] * [每页数据量] ROWS # 从第几行开始

FETCH NEXT [每页数据量] ROWS ONLY # 每页数据量

其中OFFSET子句指定从第几行开始查询,FETCH NEXT子句指定查询每页展示的数据量。

分页查询实例

以下是一个使用ROW_NUMBER和OFFSET-FETCH进行分页查询的实例,我们通过这个实例来演示如何实现基于页码进行分页查询。

实例准备

为了方便演示,我们需要提前在MSSQL数据库中创建一个测试表,并向其中插入几条数据。

USE [test]

GO

CREATE TABLE [dbo].[TestTable](

[ID] [int] IDENTITY(1,1) NOT NULL,

[Name] [nvarchar](50) NOT NULL,

[Age] [int] NOT NULL,

[Address] [nvarchar](200) NOT NULL,

PRIMARY KEY CLUSTERED

(

[ID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'张三', 23, N'北京市海淀区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'李四', 32, N'北京市西城区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'王五', 19, N'北京市东城区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'赵六', 27, N'北京市朝阳区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'孙七', 30, N'上海市浦东新区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'郑八', 21, N'上海市宝山区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'钱九', 18, N'上海市虹口区')

INSERT [dbo].[TestTable]([Name], [Age], [Address]) VALUES (N'周十', 35, N'上海市松江区')

分页查询实现

假设我们需要实现三页每页展示两个数据的分页查询,查询结果按ID升序排列,即每页展示如下数据:

第一页:ID=1,姓名=张三,年龄=23,地址=北京市海淀区;ID=2,姓名=李四,年龄=32,地址=北京市西城区

第二页:ID=3,姓名=王五,年龄=19,地址=北京市东城区;ID=4,姓名=赵六,年龄=27,地址=北京市朝阳区

第三页:ID=5,姓名=孙七,年龄=30,地址=上海市浦东新区;ID=6,姓名=郑八,年龄=21,地址=上海市宝山区

我们可以使用以下SQL语句来实现该分页查询:

SELECT [ID],[Name],[Age],[Address]

FROM (

SELECT [ID],[Name],[Age],[Address],

ROW_NUMBER() OVER (ORDER BY [ID]) AS RowNumber

FROM [dbo].[TestTable]

) as t

WHERE t.RowNumber > [页码-1]*[每页数据量] AND t.RowNumber <= [页码]*[每页数据量]

ORDER BY [ID]

上述SQL语句先将查询结果按照ID升序排列,并添加一列行号,然后根据指定的页码和每页数据量来返回相应数据。我们可以通过不同的页码和每页数据量来查询不同的数据结果。

总结

本文通过实例演示了如何使用ROW_NUMBER和OFFSET-FETCH语句在MSSQL数据库中实现分页查询,通过上述方法,我们可以很方便地查询出符合需求的数据结果,提高数据查询效率。

数据库标签