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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM