欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL分页查询方式汇总

程序员文章站 2022-03-10 07:51:33
需求:查询表dbo.message,每页10条,查询第2页 1:top() select top(20) * from dbo.message where co...

需求:查询表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分页查询方式汇总,希望对大家有所帮助