SQL分页查询方式汇总

需求:查询表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不支持的功能。

以上所述是www.887551.com给大家介绍的sql分页查询方式汇总,希望对大家有所帮助

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐