SQL SERVER 分页方法

摘要:
在最近的项目中,需要在SQLSERVER中执行分页,并且需要编写分页查询语句。因此,在办公时间,一篇由外国人撰写的关于SQL SERVER分页的文章在微软社区Bing上发表。本文描述了两种分页方法,其中一种仅适用于SQLSERVER2012及更高版本。结果如下:关于ROW_ NUMBER()的原始地址:http://msdn.microsoft.com/en-us/library/ms186734.aspx.这种分页方法的主要思想是使用ROW_NUMBER()为每一行生成一个标识符。然后通过BETWEENAND语句获取当前页面的数据,实现了分页功能。

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句。之前也写过一些关于分页查询的语句,但是性能不敢恭维。于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的文章。看过之后,感觉自己之前写的语句,太低端,太不科学了。  文章中讲了两种分页方法,其中一种只适用于SQL SERVER2012以上版本。

  ROW_NUMBER()函数分页

 先介绍一下ROW_NUMBER()函数,这个函数的主要作用,从它的命名中就可看出来。ROW,每列,NUMBER数字,它的作用就是为每行分配一个数字。但是它一般不单独使用。它的语法是这样的:

image

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.

image

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

image

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

image

在这个场景中,我们用到了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

image

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

image

关于ROW_NUMBER()的原文地址:http://msdn.microsoft.com/en-us/library/ms186734.aspx.

这种分页方法的主要思想,就是通过ROW_NUMBER()为每行生成标识。再通过BETWEEN  AND 语句来获取当前页的数据,已达到分页的作用。

image

  我们创建了一个表名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)

结果如下:

image

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 分页方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Zbrush遮罩边界该怎么实现羽化和锐化java生成临时文件夹和删除临时文件夹下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Vlmcsd(KMS)激活服务器程序

vlmcs-Windows-x64.exe127.0.0.1检查服务器是否正常联通,端口1688。vlmcs-Windows-x64.exe-X127.0.0.1显示支持的激活app类型。...

docker运行mysql容器自动停止的问题解救方案如下

3.此时,通过输入dockers可以发现MySQL容器正在正常运行:...

Lynx浏览器简明使用指南(转)

Lynx可以运行在很多种操作系统下,如VMS,UNIX,Windows95,WindowsNT等,当然也包括Linux。由于没有漂亮的图形界面,所以Lynx占用资源极少,而且速度很快。另外Lynx还是唯一能在字符终端下运行的WWW浏览器。Lynx的主页地址是:http://lynx.browser.org,另外http://www.cc.ukans.edu/...

Linux查看机器和硬盘的SN

查看硬件RAID中硬盘的SN#sas端口:[root@~]$smartctl-a/dev/sda dmegaraid,n***序列号:6RJ974SR***#sat端口[root@~]$smarttl-a/dev/sda-dsat+megaraid,n***序列号:6BRJ974SR***查看机器SN[root@~~]$dmidcode-t1**序列号...

JS获取当前时间

如果有更好的方法,请提出建议。进一步解释如下:varmyDate=newDate();我的日期。getYear();//获取当前年份(2位数)myDate getFullYear();//获取完整的年份(4位数,1970-???=0)||);}//----------------------------------------------//日期格式//格式...

部署springboot+vue项目文档(若依ruoyi项目部署步骤)

1: 部署Linux+nginx部署背景代码1.1因为我使用了idea工具进行开发,所以终端中的mvnclean包生成了相应的jar包。这个jar包可以在相应文件所在目录的目标中找到。linux服务器需要加载redis和nginx。redis存储缓存数据,nginx用于代理前端和后端服务。打包vue项目并将dist文件复制到tomcat的webapps目录中...