SQL server分頁的四種方法(算很全面了)

2021-08-21 04:27:06 字數 4451 閱讀 5971

目錄:

方法二:利用max(主鍵)

方法三:利用row_number關鍵字

第四種方法:offset /fetch next(2012版本及以上才有)

結果及執行時間

總結這篇部落格講的是sql server的分頁方法,用的sql server 2012版本。下面都用pageindex表示頁數,pagesize表示一頁包含的記錄。並且下面涉及到具體例子的,設定查詢第2頁,每頁含10條記錄。

首先說一下sql server的分頁與mysql的分頁的不同,mysql的分頁直接是用limit (pageindex-1),pagesize就可以完成,但是sql server 並沒有limit關鍵字,只有類似limit的top關鍵字。所以分頁起來比較麻煩。

sql server分頁我所知道的就只有四種:三重迴圈;利用max(主鍵);利用row_number關鍵字,offset/fetch next關鍵字(是通過蒐集網上的其他人的方法總結的,應該目前只有這四種方法的思路,其他方法都是基於此變形的)。

要查詢的學生表的部分記錄

思路先取前20頁,然後倒序,取倒序後前10條記錄,這樣就能得到分頁所需要的資料,不過順序反了,之後可以將再倒序回來,也可以不再排序了,直接交給前端排序。

還有一種方法也算是屬於這種型別的,這裡就不放**出來了,只講一下思路,就是先查詢出前10條記錄,然後用not in排除了這10條,再查詢。

**實現

-- 設定執行時間開始,用來檢視效能的

set statistics time on ;

-- 分頁查詢(通用型)

select *

from (select top pagesize *

from (select top (pageindex*pagesize) *

from student

order by sno asc ) -- 其中裡面這層,必須指定按照公升序排序,省略的話,查詢出的結果是錯誤的。

as temp_sum_student

order by sno desc ) temp_order

order by sno asc

-- 分頁查詢第2頁,每頁有10條記錄

select *

from (select top 10 *

from (select top 20 *

from student

order by sno asc ) -- 其中裡面這層,必須指定按照公升序排序,省略的話,查詢出的結果是錯誤的。

as temp_sum_student

order by sno desc ) temp_order

order by sno asc

;

查詢出的結果及時間

先top前11條行記錄,然後利用max(id)得到最大的id,之後再重新再這個表查詢前10條,不過要加上條件,where id>max(id)。

**實現

set statistics time on;

-- 分頁查詢(通用型)

select top pagesize *

from student

where sno>=

(select max(sno)

from (select top ((pageindex-1)*pagesize+1) sno

from student

order by sno asc) temp_max_ids)

order by sno;

-- 分頁查詢第2頁,每頁有10條記錄

select top 10 *

from student

where sno>=

(select max(sno)

from (select top 11 sno

from student

order by sno asc) temp_max_ids)

order by sno;

查詢出的結果及時間

直接利用row_number() over(order by id)函式計算出行數,選定相應行數返回即可,不過該關鍵字只有在sql server 2005版本以上才有。

sql實現

set statistics time on;

-- 分頁查詢(通用型)

select top pagesize *

from (select row_number()

over(order by sno asc) as rownumber,*

from student) temp_row

where rownumber>((pageindex-1)*pagesize);

set statistics time on;

-- 分頁查詢第2頁,每頁有10條記錄

select top 10 *

from (select row_number()

over(order by sno asc) as rownumber,*

from student) temp_row

where rownumber>10;

查詢出的結果及時間

**實現

set statistics time on;

-- 分頁查詢(通用型)

select * from student

order by sno

offset ((@pageindex-1)*@pagesize) rows

fetch next @pagesize rows only;

-- 分頁查詢第2頁,每頁有10條記錄

select * from student

order by sno

offset 10 rows

fetch next 10 rows only ;

offset a rows ,將前a條記錄捨去,fetch next b rows only ,向後在讀取b條資料。

封裝的儲存過程

最後,我封裝了乙個分頁的儲存過程,方便大家呼叫,這樣到時候寫分頁的時候,直接呼叫這個儲存過程就可以了。

分頁的儲存過程

create procedure paging_procedure

( @pageindex int, -- 第幾頁

@pagesize int -- 每頁包含的記錄數)as

begin

select top (select @pagesize) * -- 這裡注意一下,不能直接把變數放在這裡,要用select

from (select row_number() over(order by sno) as rownumber,*

from student) temp_row

where rownumber>(@pageindex-1)*@pagesize;

end-- 到時候直接呼叫就可以了,執行如下的語句進行呼叫分頁的儲存過程

exec paging_procedure @pageindex=2,@pagesize=10;

根據以上四種分頁的方法執行的時間可以知道,以上四種分頁方法中,第二,第三,第三四種方法效能是差不多的,但是第一種效能很差,不推薦使用。還有就是這篇部落格這是測試了小量資料,還沒有分頁大量資料,所以不清楚在大量資料要分頁時哪種方法的效能更加好。我這裡推薦第四種,畢竟第四種是sql server公司公升級後推出的新方法,所以應該理論上效能和可讀性都會更加好。

SQL server分頁的四種方法

首先說一下sql server的分頁與mysql的分頁的不同,mysql的分頁直接是用limit pageindex 1 pagesize就可以完成,但是sql server 並沒有limit關鍵字,只有類似limit的top關鍵字。所以分頁起來比較麻煩。sql server分頁我所知道的就只有四種...

四種方式實現SQLServer 分頁查詢

sqlserver 的資料分頁 假設現在有這樣的一張表 create table test id int primary key not null identity,names varchar 20 然後向裡面插入大約1000條資料,進行分頁測試 假設頁數是10,現在要拿出第5頁的內容,查詢語句如下...

四種方式實現SQLServer 分頁查詢

sqlserver 的資料分頁 自己使用時的心得 select top 10 這個10 位一頁顯示的個數 from nrc news where n id notin 40 是這麼計算出來的 10 5 1 每頁10 條,查第5頁 select top40 n id from nrc news ord...