引言
不论什么数据库,一遇到信息化管理系统,总避不开一个话题:数据分页。数据分页显示,随着信息化进程的发展,数据量的猛增,用户体检的重视,早已成为了一个常识性的事情。各数据库厂商也是逐步的在数据分页方面做着自己的努力和改变。今天我们就概述下SQL SERVER数据库分页的几个阶段,着重介绍下SQL SERVER2012新提供的一种数据库分页方式。
知识点
自从在SQL 2005中引入排名函数之后,人们就经常使用该函数帮助实现这种页,但是实现这种解决方案所需的SQL语句有一些复杂。在SQL Server2012中,专门设计了一种新语法来解决这种复杂性:OFFSET…FETCH。OFFSET向SELECT查询表明跳过多少行,而FETCH表明从特定位置开始检索多少行。(引用)
这有点类似MySQL的Limit,呈一度比较羡慕MySQL开发人员,现在我们微软粉的福利终于来喽!
Top分页
Top分页其实是利用了Top可以取前N条数据的特性,再结合Where条件排除当前分页前面的数据来达到数据分页的效果。SQL 2005之前多是这样的方式,只不过在Where条件上可能会有许多不同的形式。当然还有游标的方式。
SELECT TOP 10 *
FROM HumanResources.Employee
WHERE EmployeeID NOT IN(
SELECT TOP 20 EmployeeID
FROM HumanResources.Employee
ORDER BY EmployeeID
)
Rownumber分页
SQL Server 05之后,新加了over开窗函数,与之匹配的新加了几个排名函数(必须配合使用)。万能的大神们为之一振,发现这个排名函数无比简单的实现了分页这一难题。于是排名函数分页就被广泛的推广和应用了起来。再配合上With as 表表达式,分页过程即清晰又简洁。
SELECT *
FROM ( SELECT *
, ROW_NUMBER() OVER ( ORDER BY EmployeeID ) rn
FROM HumanResources.Employee
) tmp
WHERE rn BETWEEN 21 AND 30
WITH tmp
AS ( SELECT *
, ROW_NUMBER() OVER ( ORDER BY EmployeeID ) rn
FROM HumanResources.Employee
)
SELECT *
FROM tmp
WHERE rn BETWEEN 21 AND 30
Offset..Fetch分页
在SQL Server2012中,专门设计了一种新语法来解决这种复杂性:OFFSET…FETCH。OFFSET向SELECT查询表明跳过多少行,而FETCH表明从特定位置开始检索多少行。
SELECT *
FROM HumanResources.Employee
ORDER BY EmployeeID
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
关于该语法的一些小限制(引用):
- 使用OFFSET…FETCH子句时必须同时使用ORDER BY。
- 可以单独使用OFFSET,但不能单独使用FETCH。
- 不可以同时使用SELECT TOP和OFFSET…FETCH。
- 可以使用算术表达式或变量来确定偏移多少行或获取多少行,但不可以使用标量子查询。