MSSQL 基础之数据库分页

浏览: 2614

引言

不论什么数据库,一遇到信息化管理系统,总避不开一个话题:数据分页。数据分页显示,随着信息化进程的发展,数据量的猛增,用户体检的重视,早已成为了一个常识性的事情。各数据库厂商也是逐步的在数据分页方面做着自己的努力和改变。今天我们就概述下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。
      • 可以使用算术表达式或变量来确定偏移多少行或获取多少行,但不可以使用标量子查询。
          推荐 3
          本文由 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
          转载、引用前需联系作者,并署名作者且注明文章出处。
          本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

          2 个评论

          Offset..Fetch分页 第一见
          悟

          回复 Jmarry

          嗯 我也是最近刚看到,2012新增的。

          要回复文章请先登录注册