SQL SERVER 分页方法
最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句。之前也写过一些关于分页查询的语句,但是性能不敢恭维。于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的文章。看过之后,感觉自己之前写的语句,太低端,太不科学了。 文章中讲了两种分页方法,其中一种只适用于SQL SERVER2012以上版本。
ROW_NUMBER()函数分页
先介绍一下ROW_NUMBER()函数,这个函数的主要作用,从它的命名中就可看出来。ROW,每列,NUMBER数字,它的作用就是为每行分配一个数字。但是它一般不单独使用。它的语法是这样的:

PARTITION BY value_expression: 这个参数是通过value_expression,把我们查询到结果集给分成若干区。举个例子,我们有一张成绩表。我们要为女生、男生在各自性别内按成绩排名次。这时,我们就可以通过PARTITTION BY GENDER(性别字段) 将全班人员分为两个区,女生区、男生区。男生在男生区排名次,女生在女生区排名次。
order_by_clause:这个是就是order by 语句,将数据集按某个字段进行排序。
需要注意的是,PARTITION BY value_expression不是必要参数,但是order_by_clause是必要参数。要使用ROW_NUMBER()必须要有order by 语句。下面给出几个ROW_NUMBER() 实际使用场景:
1.

这个语句把表中TerritoryName不为空、SalesYID不为空的数据按字段SalesYTD降序排序,再通过ROW_NUMBER()函数为每行分配一个连续的数字,将数字存入新添加的一个名为Row的字段中。结果如下:

2.这种情况,就是我们今天要讲的分页方法。(Returning a subset of rows)

在这个场景中,我们用到了Comoon table expression(中间表表达式),它的作用与临时表差不多。就是将查询到的结果放入一个地方,供再次查询。对Common Table Expression感兴趣的可以去MSDN上学习。原文地址:http://msdn.microsoft.com/en-us/library/ms175972.aspx.
我们使用ROW_NUMBER()函数为查询的结果每行数据分配一个数字,将数字放入RowNumber列中(通过AS 生成的新列)。再将数据集放入中间表OrderedOrders中。查询中间表,这个时候我们就可以使用Where RowNumber BETWEEN A AND B.来读取从A条到B条的数据了,就可以达到我们的分页需求了.
3.Using ROW_NUMBER() with PARTITION

在这个场景中,我们用到了PARTITION参数。我们按区域(territoryName)将查询结果进行分区,再在分过区的数据集中以SalesYTD降序,再为降序后的每行数据分配数字。最后以TerritoryName字段升序。结果如下图:

关于ROW_NUMBER()的原文地址:http://msdn.microsoft.com/en-us/library/ms186734.aspx.
这种分页方法的主要思想,就是通过ROW_NUMBER()为每行生成标识。再通过BETWEEN AND 语句来获取当前页的数据,已达到分页的作用。

我们创建了一个表名TB.EXMPLE的表,添加了1,000,000条数据。我们通过这种分页方法来编写如下查询语句:
-----查看每页显示10条,第2页的数据
DECLARE @PageNumber AS INT,@RowNumber AS INT
SET @PageNumber=2
SET @RowNumber=5 SELETCT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ID_EXMPLE) AS NUMBER,
* FROM TB_EXAMPLE
)AS TBL WHERE NUMBER BETWEEN ((@PageNumber-1)*@RowNumber+1) AND (@PageNumber*@RowNumber)
结果如下:

2.OFFSET AND FETCH 分页
offset and fetch,这是SQL SERVER 2012新添加的功能。2012以下版本,不支持。
DECALER @PageNumber AS INT,@RowNumber AS INT
SET @PageNumber=2
SET @RowNumber=5 SELECT * FROM TB_EXAMPLE
WHERE OFFSET ((@PageNumber-1)*@RowNumber) ROWS
FETCH NEXT @RowNumber ROWS ONLY;
OFFSET A ROWS ,将前A条记录舍去,FETCH NEXT B ROWS ,向后在读取B条数据。
原文地址如下:http://social.technet.microsoft.com/wiki/contents/articles/23811.paging-a-query-with-sql-server.aspx.
SQL SERVER 分页方法的更多相关文章
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL Server 分页方法汇总
PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...
- SQL server 分页方法小结
这里面介绍一下常用的分页方法: 1.使用top来分页 select top @pageSize * from table where id not in (select top @pageSize*( ...
- SQL server分页的四种方法
SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路 先取前20页, ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
- 解决hibernate对Sql Server分页慢的问题
一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...
- 干货 | SSMS客户端连接京东云RDS SQL Server配置方法
干货 | SSMS客户端连接京东云RDS SQL Server配置方法 原创: 于振江 京东云开发者社区 微软SQL Server, Oracle数据库以及MySQL系列占据了关系型数据库市场的绝对 ...
- SQL Server分页模板
SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...
- SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条
SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...
随机推荐
- query等待ajax执行完毕再继续执行下面代码的操作
Jquery等待ajax执行完毕再继续执行下面代码的效果,具体代码如下,其实就是将 jquery ajax 函数的 async 参数设置为 false 即可,该参数默认为 true: $(docume ...
- smarty 练习: 分页查询
对查出的数据进行分页,并添加查询 在main.php和main.html两个页面操作: 后台:main.php <?php include("../init.inc.php" ...
- xheditor在线编辑器的使用
在你所需要在线编辑器的工程目录下,导入xheditor_emot.xheditor_plugins和xheditor_skin.jquery四个文件夹,然后在textarea标签中加入: class= ...
- 安全cookie登录状态设计方案
我们知道web是基于HTTP协议传输的,明文传输是极其危险的,随便哪个抓包工具分析下数据包,就over啦,一个加密的传输过程应该包括两部分,一部分为身份认证,用户鉴别这个用户的真伪:另外一部分为数据加 ...
- 细说PHP优化那些事
我们在用PHP编程的时候,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行 ...
- Python实现类似switch...case功能
最近在使用Python单元测试框架构思自动化测试,在不段的重构与修改中,发现了大量的if...else之类的语法,有没有什么好的方式使Python具有C/C#/JAVA等的switch功能呢? 在不断 ...
- oracle数据泵之解决方案(用户)导入导出。
看到网上有这样的介绍而且很多,但觉得都是大神才能一下子看的懂.自己总结下菜鸟能看懂的. 1.导出. 首先第一步: 操作系统—开始—运行输入“cmd”进入dos界面输入“sqlplus/nolog”按回 ...
- Spark运行问题备忘一(网络搜集)
问题一 ERROR storage.DiskBlockObjectWriter: Uncaught exception -9ca8//shuffle_1_1562_27 java.io.FileNot ...
- DotNET知识点总结五(笔记整合)
1.委托:通常指的是 多播委托 通常的说,委托就是一个存放方法指针的容器,是一个安全的函数指针,供程序员安全调用.委托的本质就是一个类,继承于MulticastDelegate——>Delega ...
- QQ音乐的请求
CEF 3.2357.1291.g47e6d4bChromium 43.0.2357.134OS WindowsWebKit 537.36JavaScript 4.3.61.38Flash User ...