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不支持的功能。
以上所述是小编给大家介绍的sql分页查询方式汇总,希望对大家有所帮助