1. 程式人生 > >《SQLServer》------常用的分頁查詢語句

《SQLServer》------常用的分頁查詢語句

前言

  • 在SqlServer中,分頁查詢是經常用到的查詢語句,一個好的分頁查詢語句,不能能將程式碼省略,還能提高執行效率,下面我們來探討一下SQLServer中的分頁查詢語句。

  • 具體的業務邏輯是這樣的,我資料庫中有100條資料,我要查第40-50資料,表中有兩個欄位,一個欄位是id,一個欄位是name,其中id是不連續的,因為我刪除id為44、45的記錄,因為我要查資料的第40-50條記錄,也就是id分別為41、42、43、46、47、…52的十條記錄。那該怎麼辦吶?下面就是一些具體的例子。

方法一

  • 先搜出id在1-40之間的資料,緊接著搜出id不在1-40之間的資料,最後將搜出的結果取前十條。
SELECT TOP 10           --3、最後再取出前10條資料,這就是資料庫中第41-50條資料(注意,id不是41-50,因為我刪除了id為4445的記錄)
        *
FROM    dbo.a
WHERE   id NOT IN (     --2、然後搜出id不在前40之內的其它資料
        SELECT TOP 40   --1、按照id排序之後先搜出前40條資料
                id 
        FROM    dbo.a
        ORDER BY id )
ORDER BY id;

這裡寫圖片描述

方法二

  • 先查詢前40條記錄,然後獲得其最id值,如果id值為null的,那麼就返回0,然後查詢id值大於前40條記錄的最大id值的記錄。這個查詢有一個條件,就是id必須是int型別的。效果圖同上。

方法三、 使用Row_Number

  • 把表中的所有資料都按照一個rowNumber進行排序,然後查詢rownuber大於40的前十條記錄。
SELECT TOP 10
        *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ) AS rownumber ,
                    *
          FROM      a
        ) A
WHERE   rownumber > 40;

方法四 OFFSET x ROW FETCH NEXT y ROWS ONLY;

  • 使用OFFSET是SQLServer2012新具有的分頁功能,主要功能是從第x條資料開始共取y資料。但是其必須根再Order By
    後面使用,相比前三種方式更加方便。例如
select id from a Order by id Offset 0 Row Fetch Next 5 Rows Only.
  • 這種方法支援SQLServer2012,但是SQLServer2008不支援,這種方法就像lamda表示式的Skip().Take()原理差不多;另外,MySQL的Limit函式也是這麼用的。

小結

  • 自我感覺第四種方式非常的爽,而且是爽到家了,因為沒有巢狀查詢啊,少了Sql語句的巢狀,就少了“視覺上的邏輯”,但是大家一定要切記,這種方式只是適合SqlServer2012以及更高的版本,由於小編就吃過這虧。由上面的例子可以看出,SqlServer的確挺強大的,但是如果我們缺少發現“功能” 的眼睛的話,Sql Server再強大對我們來說也沒有。