《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再強大對我們來說也沒有。