SQL實(shí)現(xiàn)分頁(yè)查詢方法總結(jié)
開(kāi)發(fā)過(guò)程中經(jīng)常遇到分頁(yè)的需求,今天在此總結(jié)一下吧。
簡(jiǎn)單說(shuō)來(lái)方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁(yè)邏輯放在SQL層;端上控制一次性獲取所有數(shù)據(jù),把分頁(yè)邏輯放在UI上(如GridView)。顯然,端上控制開(kāi)發(fā)難度低,適于小規(guī)模數(shù)據(jù),但數(shù)據(jù)量增大時(shí)性能和IO消耗無(wú)法接受;源上控制在性能和開(kāi)發(fā)難度上較為平衡,適應(yīng)大多數(shù)業(yè)務(wù)場(chǎng)景;除此之外,還可以根據(jù)客觀情況(性能要求,源與端的資源占用等)在源和端之間加一層,應(yīng)用特殊算法和技術(shù)進(jìn)行處理。以下主要討論源上,即SQL上的分頁(yè)。
分頁(yè)的問(wèn)題其實(shí)就是在滿足條件的一堆有序數(shù)據(jù)中截取當(dāng)前所需要展示的那部分。實(shí)際上各種數(shù)據(jù)庫(kù)都考慮到分頁(yè)問(wèn)題而內(nèi)置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我們可以得到一系列分頁(yè)的方法。
1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回區(qū)間(以MySql為例,注意使用Oracle的ROWNUM時(shí)要應(yīng)用子查詢):
方法一、直接限制返回區(qū)間
SELECT * FROM table WHERE 查詢條件 ORDER BY 排序條件 LIMIT ((頁(yè)碼-1)*頁(yè)大小),頁(yè)大小;
優(yōu)點(diǎn):寫(xiě)法簡(jiǎn)單。
缺點(diǎn):當(dāng)頁(yè)碼和頁(yè)大小過(guò)大時(shí),性能明顯下降。
適用:數(shù)據(jù)量不大。
2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他們可以限制返回的行數(shù),因此可以得到以下兩套通用的方法(以SqlServer為例):
方法二、NOT IN
SELECT TOP 頁(yè)大小 * FROM table WHERE 主鍵 NOT IN ( SELECT TOP (頁(yè)碼-1)*頁(yè)大小 主鍵 FROM table WHERE 查詢條件 ORDER BY 排序條件 ) ORDER BY 排序條件
優(yōu)點(diǎn):通用性強(qiáng)。
缺點(diǎn):當(dāng)數(shù)據(jù)量較大時(shí)向后翻頁(yè),NOT IN中的數(shù)據(jù)過(guò)大會(huì)影響性能。
適用:數(shù)據(jù)量不大。
方法三、MAX
SELECT TOP 頁(yè)大小 * FROM table WHERE 查詢條件 AND id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP ((頁(yè)碼-1)*頁(yè)大小) id FROM table WHERE 查詢條件 ORDER BY id ) AS tempTable ) ORDER BY id
優(yōu)點(diǎn):速度快,特別是當(dāng)id為主鍵時(shí)。
缺點(diǎn):適用面窄,要求排序條件單一且可比較。
適用:簡(jiǎn)單排序(特殊情況也可嘗試轉(zhuǎn)換成類似可比較值處理)。
3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回?cái)?shù)據(jù)的行號(hào),基于此在限制返回區(qū)間得到如下方法(以SqlServer為例):
方法四、ROW_NUMBER()
SELECT TOP 頁(yè)大小 * FROM ( SELECT TOP (頁(yè)碼*頁(yè)大小) ROW_NUMBER() OVER (ORDER BY 排序條件) AS RowNum, * FROM table WHERE 查詢條件 ) AS tempTable WHERE RowNum BETWEEN (頁(yè)碼-1)*頁(yè)大小+1 AND 頁(yè)碼*頁(yè)大小 ORDER BY RowNum
優(yōu)點(diǎn):在數(shù)據(jù)量較大時(shí)相比NOT IN有優(yōu)勢(shì)。
缺點(diǎn):小數(shù)據(jù)量時(shí)不如NOT IN。
適用:大部分分頁(yè)查詢需求。
到此這篇關(guān)于SQL實(shí)現(xiàn)分頁(yè)查詢方法總結(jié)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。