《SQLServer》------常用的分頁查詢語句
阿新 • • 發佈:2019-02-09
前言
在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為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型別的。效果圖同上。
方法三、 使用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再強大對我們來說也沒有。