SQL分页查询方式汇总

作者:mrr 时间:2024-01-24 00:33:29 

需求:查询表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,分页查询
0
投稿

猜你喜欢

  • numpy之sum()的使用及说明

    2023-12-12 00:31:16
  • 如何修改被表单引用的ASP页面?

    2010-06-10 18:32:00
  • mysql 列转行的技巧(分享)

    2024-01-18 09:54:13
  • Python多个装饰器的调用顺序实例解析

    2021-09-30 06:54:56
  • 程序员的七夕用30行代码让Python化身表白神器

    2023-10-26 12:27:41
  • Vue如何获取url路由地址和参数简单示例

    2024-05-09 09:53:08
  • 微信小程序上传图片功能(附后端代码)

    2023-07-24 04:21:40
  • Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解

    2022-03-02 10:43:08
  • 如何用ASP输出HTML文件?

    2010-06-11 20:01:00
  • Python中如何优雅的合并两个字典(dict)方法示例

    2023-08-02 16:15:25
  • 讲解SQL Server2005数据项的分拆与合并

    2009-01-04 14:40:00
  • 运行(runCode)复制(copyCode)保存(saveCode)代码框方法

    2007-10-21 08:41:00
  • 基于Python的ModbusTCP客户端实现详解

    2022-02-03 10:54:25
  • Python走楼梯问题解决方法示例

    2021-07-07 22:57:51
  • Keras之自定义损失(loss)函数用法说明

    2023-09-24 12:12:15
  • 日常收集整理php正则表达式(超常用)

    2024-05-03 15:35:49
  • vue 过滤、模糊查询及计算属性 computed详解

    2024-05-09 09:53:30
  • 属性与 @property 方法让你的python更高效

    2023-02-02 08:20:18
  • Python自动化测试Eclipse+Pydev 搭建开发环境

    2022-07-15 07:01:54
  • python分布式环境下的限流器的示例

    2023-07-11 19:25:38
  • asp之家 网络编程 m.aspxhome.com