目錄
方法一:三重循環
思路
程式碼實作
查詢出的結果及時間
方法二:利用max (主鍵)
方法三:利用row_number關鍵字
SQL實作
第四種方法: offset /fetch next(2012版本以上才有)
結果及運行時間
#封裝的預存程序
總結
首頁 資料庫 SQL SQL server分頁方法有哪些

SQL server分頁方法有哪些

Aug 06, 2021 am 09:22 AM

這篇講的是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關鍵字(是透過蒐集網路上的其他人的方法總結的,應該目前只有這四種方法的思路,其他方法都是基於此變形的)。

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

SQL server分頁方法有哪些

方法一:三重循環

思路

  先取前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
;
登入後複製

查詢出的結果及時間

SQL server分頁方法有哪些

SQL server分頁方法有哪些

方法二:利用max (主鍵)

  先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;
登入後複製

查詢出的結果及時間

SQL server分頁方法有哪些

SQL server分頁方法有哪些

方法三:利用row_number關鍵字

  直接利用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;
登入後複製

查詢出的結果及時間

SQL server分頁方法有哪些

SQL server分頁方法有哪些

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

程式碼實作

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條數據。

結果及運行時間

SQL server分頁方法有哪些

SQL server分頁方法有哪些

#封裝的預存程序

最後,我封裝了一個分頁的儲存過程,方便大家調用,這樣到時候寫分頁的時候,直接調用這個預存程序就可以了。

分頁的預存程序

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公司升級後推出的新方法,所以應該理論上效能和可讀性都會更加好。

相關推薦:《mysql教學

###

以上是SQL server分頁方法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
SQL:命令,mysql:引擎 SQL:命令,mysql:引擎 Apr 15, 2025 am 12:04 AM

SQL命令在MySQL中分為DQL、DDL、DML、DCL和TCL五類,用於定義、操作和控制數據庫數據。 MySQL通過詞法分析、語法分析、優化和執行等階段處理SQL命令,並利用索引和查詢優化器提升性能。使用示例包括SELECT用於數據查詢,JOIN用於多表操作。常見錯誤有語法、邏輯和性能問題,優化策略包括使用索引、優化查詢和選擇合適的存儲引擎。

SQL和MySQL:了解核心差異 SQL和MySQL:了解核心差異 Apr 17, 2025 am 12:03 AM

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個具體的數據庫管理系統。 SQL提供統一語法,適用於多種數據庫;MySQL輕量、開源,性能穩定但在大數據處理上有瓶頸。

SQL:使所有人都可以訪問數據管理 SQL:使所有人都可以訪問數據管理 Apr 12, 2025 am 12:14 AM

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允許inserstospecefifywhattheywanttododowithththedata.2)

SQL與MySQL:澄清兩者之間的關係 SQL與MySQL:澄清兩者之間的關係 Apr 24, 2025 am 12:02 AM

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

用於數據分析的SQL:商業智能的高級技術 用於數據分析的SQL:商業智能的高級技術 Apr 14, 2025 am 12:02 AM

SQL的高級查詢技巧包括子查詢、窗口函數、CTE和復雜JOIN,能夠處理複雜數據分析需求。 1)子查詢用於找出每個部門工資最高的員工。 2)窗口函數和CTE用於分析員工的薪資增長趨勢。 3)性能優化策略包括索引優化、查詢重寫和使用分區表。

SQL:如何克服學習障礙 SQL:如何克服學習障礙 Apr 26, 2025 am 12:25 AM

要成為SQL高手,應掌握以下策略:1.了解數據庫基礎概念,如表、行、列、索引。 2.學習SQL的核心概念和工作原理,包括解析、優化和執行過程。 3.熟練使用基本和高級SQL操作,如CRUD、複雜查詢和窗口函數。 4.掌握調試技巧,使用EXPLAIN命令優化查詢性能。 5.通過實踐、利用學習資源、重視性能優化和保持好奇心來克服學習挑戰。

SQL和MySQL:數據管理初學者指南 SQL和MySQL:數據管理初學者指南 Apr 29, 2025 am 12:50 AM

SQL和MySQL的區別在於,SQL是用於管理和操作關係數據庫的語言,而MySQL是實現這些操作的開源數據庫管理系統。 1)SQL允許用戶定義、操作和查詢數據,通過命令如CREATETABLE、INSERT、SELECT等實現。 2)MySQL作為RDBMS,支持這些SQL命令,並提供高性能和可靠性。 3)SQL的工作原理基於關係代數,MySQL通過查詢優化器和索引等機制優化性能。

SQL的重要性:數字時代的數據管理 SQL的重要性:數字時代的數據管理 Apr 23, 2025 am 12:01 AM

SQL在數據管理中的作用是通過查詢、插入、更新和刪除操作來高效處理和分析數據。 1.SQL是一種聲明式語言,允許用戶以結構化方式與數據庫對話。 2.使用示例包括基本的SELECT查詢和高級的JOIN操作。 3.常見錯誤如忘記WHERE子句或誤用JOIN,可通過EXPLAIN命令調試。 4.性能優化涉及使用索引和遵循最佳實踐如代碼可讀性和可維護性。

See all articles