首頁 > 軟體

sqlServer實現分頁查詢的三種方式

2023-03-02 18:00:41

sqlServer的分頁查詢和mysql語句不一樣,有三種實現方式。分別是:offset /fetch next、利用max(主鍵)、利用row_number關鍵字

一、offset /fetch next關鍵字

2012版本及以上才有,SQL server公司升級後推出的新方法。

公式:

-- 分頁查詢公式-offset /fetch next
select * from 表名
order by 主鍵 或 其他索引列 
-- @pageIndex:頁碼、@pageSize:每頁記錄數
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

範例:

-- 分頁查詢第2頁,每頁有10條記錄
select * from tb_user
order by uid
offset 10 rows
fetch next 10 rows only ;

說明:

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

二、利用max(主鍵)

公式:

-- 分頁查詢公式-利用max(主鍵)
select top @pageSize * 
from 表名 
where 主鍵>=
(select max(主鍵) 
	from (
		select top ((@pageIndex-1)*@pageSize+1) 主鍵
		from 表名  
		order by  主鍵 asc) temp_max_ids) 
order by 主鍵;

範例:

-- 分頁查詢第2頁,每頁有10條記錄
select top 10 * 
from tb_user 
-- 3、再重新在這個表查詢前10條,條件: id>=max(id)
where uid>=
-- 2、利用max(id)得到前11條記錄中最大的id
(select max(uid) 
	from (
		-- 1、先top前11條行記錄
		select top 11 uid
		from tb_user 
		order by  uid asc) temp_max_ids) 
order by uid;

說明:

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

中心思想:其實就是先得到該頁的初始id,PS:別忘了加上排序哦

三、利用row_number關鍵字

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

公式:

-- 分頁查詢公式-row_number()
select top @pageSize * 
from (
	-- rownumber是別名,可按自己習慣取
	select row_number() over(order by 主鍵 asc) as rownumber,* 
	from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

範例:

-- 分頁查詢第2頁,每頁有10條記錄
select top 10 * 
from (
	-- 子查詢,多加一個rownumber列返回
	select row_number() over(order by uid asc) as rownumber,* 
	from tb_user) temp_row
	--限制起始行標
where rownumber>10;

說明:

利用row_number函數給每行記錄標了一個序號,相當於在原表中多加了1列返回。

上述範例,是以序號11為起始行,查詢前10條記錄,即為第2頁資料。

優化:

可以看到,子查詢查詢了全表資料,如果資料量大,效率是比較低的。

下面是優化後的SQL,

公式:

-- 分頁查詢公式-row_number()-優化版本
select * 
from (
	-- rownumber是別名,可按自己習慣取
	select top (@pageIndex*@pageSize) row_number() over(order by 主鍵 asc) 
	as rownumber,* 
	from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

範例:

-- 分頁查詢第2頁,每頁有10條記錄
select * 
from (
	-- 子查詢,限制了返回前20條資料
	select top 20 row_number() over(order by uid asc) as rownumber,* 
	from tb_user) temp_row
	--限制起始行標
where rownumber>10;

說明:

這裡,子查詢僅查詢到當前頁的最後一行,沒有進行全表查詢,所以效率上要快一點。在外層限制起始行標,是沒變的,但是卻在內層控制了結尾行標。

上述範例,是以序號11為起始行,查詢20以內的記錄,即為第2頁資料。

總結

更多介紹,可檢視我的另外篇文章:SQL Server中row_number函數用法介紹

到此這篇關於sqlServer實現分頁查詢的三種方式的文章就介紹到這了,更多相關sqlServer分頁查詢實現內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com