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