SqlServer三种分页查询语句
SqlServer 的三种分页查询语句
  先说好吧,查询的数据排序,有两个地⽅(1、分页前的排序。2、查询到当前页数据后的排序)
第⼀种、
  1、先查询当前页码之前的所有数据id
    select top ((当前页数-1)*每页数据条数) id from 表名
  2、再查询所有数据的前⼏条,但是id不在之前查出来的数据中
    select top 每页数据条数 * from 表名 where id not in ( select top ((当前页数-1)*每页数据条数) id from 表名 )
  3、查询出当前页⾯的所有数据后,再根据⼀列数据进⾏排序
    select * from (
      select top 每页数据条数 * from 表名 where id not in (select top ((当前页数-1)*每页数据条数) id from 表名)
    ) as b order by 排序列名 desc
  4、当然,如果想要修改排序列再查询也可以(默认是按照id asc 排序的,我们可以改为其他列)
    select top 每页数据条数 * from 表名 where id not in (select top ((2-1)*5) id from wg_users order by 排序列名 desc) order by 排序列名 desc
    这⾥的排序列名⼀定要⽤同⼀列,不然的话,分页查询就会查出重复数据或者少数据,因为排序错乱的原因
第⼆种、ROW_NUMBER()分页
1、使⽤ROW_NUMBER()函数先给查询到的所有数据添加⼀列序号(就是给数据加⼀列1、
2、
3、
4、5......这个,⼀定不要去掉后⾯起的那个别名【我这⾥叫做b】)
    select * from (select ROW_NUMBER() OVER(Order by id) AS RowNumber,* from 表名) as b
  2、然后就是根据前⾯加的那⼀列序号,运⽤数学计算出当前页是第x 到 y条数据
    select * from (select ROW_NUMBER() OVER(Order by id) AS RowNumber,* from 表名) as b
    where b.RowNumber BETWEEN (当前页数-1)*每页数据条数+1 and 当前页数*每页数据条数order by 排序列名 desc
  3、这种分页语句的排序列在这⾥(这⾥默认根据id这⼀列排序的,有需要的可以改⼀下,多个排序列可以写【order by id, creatTime, name, ......】)
    select * from (select ROW_NUMBER() OVER(Order by 排序列名) AS RowNumber,* from 表名) as b
第三种、Offset and Fetch的分页⽅法——仅适⽤于SqlServer2012及以上版本(Offset and Fetch不仅可以⽤来分页,还有别的功能,不过我并不了解,分页⽅⾯也只是知道可以这么⽤)
  1、这种分页相较于第⼆种来说,⽆论是性能还是语法,都是有优势的,不过优势并不明显(仅供参考,看别⼈测试的,萌新表⽰并不知道该怎么⽐较-_-!!)记住我
    select * from 表名 order by 排序列名 offset (当前页数-1)*每页数据条数 row fetch next 每页数据条数 row only
  2、对当前页的数据再排序(如果不需要,可以不⽤加这部分)
    select * from (
      select * from 表名 order by 排序列名 offset (当前页数-1)*每页数据条数 row fetch next 每页数据条数 row only     ) as b order by 排序列名 desc