前日读书了瞬间SQL的分页查询,总括了以下两种形式。

第第一建工公司立了二个表,随便插队的局地测量试验数据,表结会谈数码如下图:

4503.com 1

几日前后生可畏经我们要做的是每页5条数据,而明天我们要取第三页的数量。(数据太少,就每页5条了卡塔 尔(阿拉伯语:قطر‎

方法一:

  select top 5 * 
  from [StuDB].[dbo].[ScoreInfo] 
  where [SID] not in 
    (select top 10 [SID] 
    from [StuDB].[dbo].[ScoreInfo] 
    order by [SID])
  order by [SID]

结果:

4503.com 2

此措施是先抽取前10条的SID(前两页),杀绝前10条数据的SID,然后在剩余的数量里面抽取前5条数据。

劣点正是它会遍历表中享有数据三遍,数据量大时质量倒霉。

方法二:

  select top 5 * 
  from [StuDB].[dbo].[ScoreInfo] 
  where [SID]> 
    (select MAX(t.[SID]) from (select top 10 [SID] from [StuDB].[dbo].[ScoreInfo] order by [SID]) t )
  order by [SID]

结果:

4503.com 3

此方法是先抽取前10条数据的SID,然后抽取SID的最大值,再从数额里面取出大于 前10条SID的最大值 的前5条数据。

症结是性质比较不好,和措施一八九不离十。

方法三:

  select * 
  from (select *,ROW_NUMBER() over(order by [SID]) ROW_ID from [StuDB].[dbo].[ScoreInfo]) t
  where t.[SID] between (5*(3-1)+1) and 5*3

结果:

4503.com 4

此办法的特色便是运用 ROW_4503.com,NUMBETucson()
函数,那些措施质量比前二种艺术要好,只会遍历一回具有的数目。适用于Sql
Server 二零零三今后的本子(不含卡塔 尔(阿拉伯语:قطر‎。

方法四:

  select * 
  from [StuDB].[dbo].[ScoreInfo]
  order by [SID] 
  offset 5*2 rows fetch next 5 rows only

结果:

4503.com 5

此措施适用于Sql Server 二〇一〇过后的本子(不含卡塔尔。

offset 10 rows fetch next 5 rows only
那句代码笔者的知情是:跳过前面10条数据(前2页卡塔 尔(英语:State of Qatar)从下一条开端取5条数据。

个人感觉那几个点子比使用 ROW_NUMBE途睿欧()
函数的法子要好(从代码方面来看,代码也少非常多卡塔尔国,至于品质方面未有做过测验,就不说了。

不过,最后三种办法的质量明确是远超前边三种艺术的,具体的依然看实用。