SQL分页查询方式汇总

所属分类: 数据库 / MsSql 阅读数: 1070
收藏 0 赞 0 分享

需求:查询表dbo.Message,每页10条,查询第2页

1:TOP()

SELECT TOP(20) * FROM dbo.Message WHERE Code NOT IN
(SELECT TOP(10) Code FROM dbo.Message)

2:BETWEEN * AND * , Row_Number() OVER(ORDER BY *) AS rowNum

SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM dbo.Message 
SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20
DROP TABLE #a;

3:WITH * AS () , Row_Number() OVER(ORDER BY *) AS rowNum

WITH sss AS(
SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message
)
SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 20

4: SQL Server 2012的OFFSET-FETCH筛选

SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

这里第4中方法做详细介绍:

TOP选项是一个非常实用的筛选类型,但它有两个缺陷——不是标准SQL,且不支持跳过功能。标准SQL定义的TOP类似筛选称为OFFSET-FETCH,支持跳过功能,这对针对特定页面的查询非常有用。SQL Server2012引入了对OFFSET-FETCH筛选的支持。

SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER BY子句的一部分,通常用于实现按顺序显示效果。OFFSET子句指定要跳过的行数,FETCH子句指定在跳过的行数后要筛选的行数。请思考一下下面的查询示例。

SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate, orderid
OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

此查询按orderdate、orderid顺序(订单日期从最远到最近,并添加了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选下面的25行。

请注意,使用OFFSET-FETCH的查询必须具有ORDER BY子句。此外,FETCH子句不支持没有OFFSET子句。如果你不想跳过任何行,但是希望使用FETCH筛选,你应当使用OFFSET 0 ROWS来表示。不过,没有FETCH的OFFSET是允许的,这种情况是跳过指定的行数,并返回查询结果中所有剩余行。

OFFSET-FETCH语法有一些有趣的语言方面需要注意。单数格式ROW和复数格式ROWS是可以互换的,此举是让你能够以直观的类似英语方式来描述筛选。例如,假设你仅希望获取一行,如果你指定了FETCH 1 ROWS,虽然这在语法上是有效的,不过看上去会很怪。因此,你可以使用FETCH 1 ROW格式。此互换同样适用于OFFSET子句。另外,如果你不希望跳过任何行(OFFSET 0 ROWS),你可能觉得“first”比“next”更合适,因此,FIRST 和NEXT格式是可以互换的。

如你所见,从支持跳过功能看,OFFSET-FETCH子句比TOP子句更灵活。不过,OFFSET-FETCH 不支持PERCENT和WITH TIES选项,而TOP支持。由于OFFSET-FETCH是标准的,而TOP不是,我建议使用OFFSET-FETCH作为你的默认选择,除非你需要TOP支持且OFFSET-FETCH不支持的功能。

以上所述是小编给大家介绍的SQL分页查询方式汇总,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

更多精彩内容其他人还在看

sql 分组查询问题

sql 分组查询问题,需要的朋友可以参考下。
收藏 0 赞 0 分享

MSSQL 数据库备份和还原的几种方法 图文教程

MSSQL 数据库备份和还原的几种方法小结,配有图文,大家看了就知道了。
收藏 0 赞 0 分享

GridView自定义分页的四种存储过程

首先要说说为什么不用GridView的默认的分页功能,GridView控件并非真正知道如何获得一个新页面,它只是请求绑定的数据源控件返回适合规定页面的行,分页最终是由数据源控件完成。
收藏 0 赞 0 分享

Godaddy 导入导出MSSQL数据库的实现步骤

可以从限制文件中导入SQL共享服务器数据库。如果想把存放在其他地方的数据导入,需要先把其内容拷到限制文件中。(
收藏 0 赞 0 分享

得到自增列的下一个会插入的id

怎么得到自增列的下一个会插入的id
收藏 0 赞 0 分享

几个简单的基本的sql语句

这个是从网上看到的。。。COPY一下。。有时候忘记了。。
收藏 0 赞 0 分享

sqlserver 自动备份所有数据库的SQL

可自动备份除系统数据库外的所有数据库。备份文件的周期保存周期可以更改。
收藏 0 赞 0 分享

SQL Server 服务器优化技巧浅谈

数据文件和日志文件的操作会产生大量的I/O。在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据文件不同的硬盘上以分散I/O,同时还有利于数据库的灾难恢复。
收藏 0 赞 0 分享

sql2005 存储过程分页示例代码

sql2005分页存储过程示例
收藏 0 赞 0 分享

union组合结果集时的order问题

如果能确定各查询结果不会有重复的项,最好就带上all,因为这样还是可以提高一些效率的。
收藏 0 赞 0 分享
查看更多