溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中如何實現SQL分頁查詢

發布時間:2020-07-16 15:11:51 來源:億速云 閱讀:317 作者:小豬 欄目:開發技術

小編這次要給大家分享的是MySQL中如何實現SQL分頁查詢,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

【SQL】SQL分頁查詢總結

開發過程中經常遇到分頁的需求,今天在此總結一下吧。

簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在SQL層;端上控制一次性獲取所有數據,把分頁邏輯放在UI上(如GridView)。顯然,端上控制開發難度低,適于小規模數據,但數據量增大時性能和IO消耗無法接受;源上控制在性能和開發難度上較為平衡,適應大多數業務場景;除此之外,還可以根據客觀情況(性能要求,源與端的資源占用等)在源和端之間加一層,應用特殊算法和技術進行處理。以下主要討論源上,即SQL上的分頁。

分頁的問題其實就是在滿足條件的一堆有序數據中截取當前所需要展示的那部分。實際上各種數據庫都考慮到分頁問題而內置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我們可以得到一系列分頁的方法。

1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回區間(以MySql為例,注意使用Oracle的ROWNUM時要應用子查詢):

方法一、直接限制返回區間

SELECT * FROM table WHERE 查詢條件 ORDER BY 排序條件 LIMIT ((頁碼-1)*頁大小),頁大小;

優點:寫法簡單。
缺點:當頁碼和頁大小過大時,性能明顯下降。
適用:數據量不大。

2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他們可以限制返回的行數,因此可以得到以下兩套通用的方法(以SqlServer為例):

方法二、NOT IN

SELECT TOP 頁大小 * FROM table WHERE 主鍵 NOT IN
(
 SELECT TOP (頁碼-1)*頁大小 主鍵 FROM table WHERE 查詢條件 ORDER BY 排序條件
)
ORDER BY 排序條件

優點:通用性強。
缺點:當數據量較大時向后翻頁,NOT IN中的數據過大會影響性能。
適用:數據量不大。

方法三、MAX

SELECT TOP 頁大小 * FROM table WHERE 查詢條件 AND id >
(
 SELECT ISNULL(MAX(id),0) FROM 
 (
  SELECT TOP ((頁碼-1)*頁大小) id FROM table WHERE 查詢條件 ORDER BY id 
 ) AS tempTable
) 
ORDER BY id

優點:速度快,特別是當id為主鍵時。
缺點:適用面窄,要求排序條件單一且可比較。
適用:簡單排序(特殊情況也可嘗試轉換成類似可比較值處理)。

3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回數據的行號,基于此在限制返回區間得到如下方法(以SqlServer為例):

方法四、ROW_NUMBER()

SELECT TOP 頁大小 * FROM 
(
 SELECT TOP (頁碼*頁大小) ROW_NUMBER() OVER (ORDER BY 排序條件) AS RowNum, * FROM table WHERE 查詢條件
) AS tempTable
WHERE RowNum BETWEEN (頁碼-1)*頁大小+1 AND 頁碼*頁大小
ORDER BY RowNum

優點:在數據量較大時相比NOT IN有優勢。
缺點:小數據量時不如NOT IN。
適用:大部分分頁查詢需求。

以上是自己總結的拙見,性能比較來自網上資料及個人判斷,并沒有深入實驗,不當之處請大家指正。

看完這篇關于MySQL中如何實現SQL分頁查詢的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女