1. 程式人生 > >《Sql Server 分頁查詢》

《Sql Server 分頁查詢》

     記得在做牛腩新聞釋出系統的時候就做過分頁查詢,分頁查詢在查詢語句中起到了很大的作用,它能提高查詢效率,寫好了也能簡化程式碼。現在我簡單介紹一下Sql Server中的分頁查詢。

     具體的業務邏輯是這樣的,我資料庫中有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為44、45的記錄)
        *
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型別的。
     

SELECT TOP 10                               --3、最後再取出前10條資料,
        *
FROM    dbo.a
WHERE   id > ( SELECT   ISNULL(MAX(id), 0)  --2、如果Id為空則賦值為0
               FROM     ( SELECT TOP 40     --1、按照id排序之後先搜出前40條資料
                                    id
                          FROM      dbo.a
                          ORDER BY  id
                        ) B
             )
ORDER BY id;

      效果圖同上

      方法三  使用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()原理差不多。

    小結

    自我感覺第三種方式非常的爽,而且是爽到家了,因為沒有巢狀查詢啊,少了Sql語句的巢狀,就少了“視覺上的邏輯”,由上面的例子可以看出,Sql Server的確挺強大的,但是如果我們缺少發現“功能” 的眼睛的話,Sql Server再強大對我們來說也沒有。