亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQL Server 替代實(shí)現(xiàn) MySQL 中 LIMIT 的方法

admin
2025年1月9日 21:57 本文熱度 1291

在數(shù)據(jù)庫(kù)管理中,查詢(xún)結(jié)果的有效限制是優(yōu)化性能和確保檢索相關(guān)數(shù)據(jù)的關(guān)鍵。許多SQL數(shù)據(jù)庫(kù)系統(tǒng),如MySQL和PostgreSQL,使用LIMIT子句來(lái)指定查詢(xún)返回的記錄數(shù)。然而,SQL Server不支持LIMIT子句,而是使用TOP, OFFSET-FETCH和SET ROWCOUNT這樣的替代方案。這種設(shè)計(jì)體現(xiàn)了SQL Server的靈活性和高性能,它提供了各種方法來(lái)實(shí)現(xiàn)類(lèi)似的限制功能,同時(shí)滿(mǎn)足不同的用例和場(chǎng)景。

讓我們仔細(xì)看看SQL Server中的LIMIT選項(xiàng),重點(diǎn)介紹它們的獨(dú)特功能和限制。

?
使用SELECT TOP子句
?

在SQL Server中,SELECT TOP子句可以替代LIMIT子句,可以用于限制查詢(xún)返回的行數(shù)。當(dāng)你處理大型數(shù)據(jù)集并且只想檢索記錄的一個(gè)子集時(shí),它特別有用?;菊Z(yǔ)法是:

SELECT TOP (number | percent) column_names FROM table_name;

這里,number表示要返回的確切行數(shù),而percent是要從總結(jié)果集中返回的行數(shù)的百分比。根據(jù)你的需要使用其中一個(gè)參數(shù)。

-- 查詢(xún)返回按雇傭日期的前5名員工SELECT TOP 5 * FROM HumanResources.Employee ORDER BY HireDate;
-- 查詢(xún)休假超過(guò)20小時(shí)的前10%員工SELECT TOP 10 PERCENT *FROM HumanResources.Employee WHERE VacationHours > 20;

SELECT TOP不提供隨機(jī)行。為了實(shí)現(xiàn)隨機(jī)性,可以將其與ORDER BY NEWID() 結(jié)合使用,但這對(duì)于大型數(shù)據(jù)集來(lái)說(shuō)效率很低。另一方面,如果不指定ORDER BY子句,結(jié)果可能是不可預(yù)測(cè)的,因?yàn)镾QL Server不能保證返回行的順序。

?
用OFFSET-FETCH實(shí)現(xiàn)分頁(yè)
?

說(shuō)到分頁(yè),SQL Server中可以使用 offset - fetch來(lái)實(shí)現(xiàn)分頁(yè),允許你通過(guò)跳過(guò)一些行,然后獲取定義數(shù)量的行來(lái)檢索特定的記錄子集。這個(gè)子句的語(yǔ)法如下:

ORDER BY order_by_expression[ COLLATE collation_name ][ ASC | DESC ][ , ...n ][ <offset_fetch> ]<offset_fetch> ::={    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }    [      FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY    ]}

OFFSET子句允許你指定在返回行之前需要跳過(guò)多少行,而FETCH NEXT定義在跳過(guò)行之后要返回多少行。

SELECT * FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

我們將頁(yè)行數(shù)、頁(yè)碼作為參數(shù),可以實(shí)現(xiàn)動(dòng)態(tài)分頁(yè)查詢(xún)。

DECLARE @PageSize INT = 10; DECLARE @PageNumber INT = 5; SELECT BusinessEntityID, JobTitle, HireDate FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET (@PageSize * (@PageNumber - 1)) ROWS FETCH NEXT @PageSize ROWS ONLY;

OFFSET-FETCH遵循SQL標(biāo)準(zhǔn),使其可移植并易于開(kāi)發(fā)人員理解。最重要的是,與其他方法(如 ROW_NUMBER())不同,OFFSET-FETCH直接跳過(guò)并獲取行,而不需要復(fù)雜的變通方法。

但需要注意的是,對(duì)于大型數(shù)據(jù)集,在分頁(yè)中越往后查詢(xún)(如第1000頁(yè)),查詢(xún)可能會(huì)變得越慢,因?yàn)镾QL Server必須跳過(guò)更多行。需要考慮的另一點(diǎn)是,OFFSET-FETCH不返回總行數(shù),因此如果需要顯示分頁(yè)元數(shù)據(jù)(如總頁(yè)數(shù)),則需要一個(gè)額外的查詢(xún) count(*) 來(lái)獲取總行數(shù)。記住,當(dāng)使用OFFSET-FETCH時(shí),ORDER BY子句是強(qiáng)制性的,否則,結(jié)果是不可預(yù)測(cè)的。

?
使用SET ROWCOUNT命令
?

在SQL Server中,可以使用SET ROWCOUNT命令來(lái)限制SELECT語(yǔ)句返回或受UPDATE或DELETE影響的行數(shù)。命令格式如下:

SET ROWCOUNT { number | 0 }

不是指定number,而是指定要返回或處理的行數(shù),0表示重置行計(jì)數(shù)。

如果你將SET ROWCOUNT和SELECT與其他命令(如ORDER BY和WHERE)一起使用,它們的交互將非常強(qiáng)大。在這種組合中,WHERE子句首先過(guò)濾行,ORDER BY子句對(duì)過(guò)濾的行進(jìn)行排序,然后SET ROWCOUNT限制從排序的結(jié)果集中返回的行數(shù)。

下面我們查詢(xún)前5條記錄,然后重置行數(shù)限制,以便后續(xù)的查詢(xún)返回所有匹配的行:

SET ROWCOUNT 5; SELECT * FROM HumanResources.Employee WHERE VacationHours > 50 ORDER BY JobTitle; SET ROWCOUNT 0;

SET ROWCOUNT也可以用于DML ,它與select的工作原理類(lèi)似。

SET ROWCOUNT 1; UPDATE HumanResources.Employee SET JobTitle = 'Chief Stocker' WHERE JobTitle = 'Stocker'; 
SET ROWCOUNT 0; SELECT * FROM HumanResources.Employee WHERE JobTitle LIKE ('%Stocker%') ORDER BY JobTitle;

SET ROWCOUNT提供了一種簡(jiǎn)單的方法來(lái)限制結(jié)果,使用非常簡(jiǎn)單,主要優(yōu)勢(shì)有:

  • 不需要對(duì)原有的SQL進(jìn)行更改,就可以限制性查詢(xún);

  • 對(duì)整個(gè)會(huì)話(huà)生效,不影響到其他會(huì)話(huà);

  • 大量數(shù)據(jù)的DELETE和UPDATE,可以結(jié)合@@ROWCOUNT分批分成小事務(wù)處理;

注意,SET ROWCOUNT現(xiàn)在越來(lái)越不常用了。隨著SQL標(biāo)準(zhǔn)的發(fā)展,現(xiàn)代SQL實(shí)踐傾向于對(duì)結(jié)果集和數(shù)據(jù)操作進(jìn)行更顯式的控制。因此微軟建議使用TOP子句,因?yàn)門(mén)OP子句提供了更清晰的語(yǔ)義,SET ROWCOUNT在SQL Server 2022版本之后的未來(lái)版本中不會(huì)影響DELETE和UPDATE語(yǔ)句。

?
方案比較
?

綜上所述,讓我們簡(jiǎn)單地比較一下上面討論過(guò)的SQL Server的LIMIT子句:

  • SELECT TOP:最適合從結(jié)果集中快速檢索指定數(shù)量的行,特別是在需要固定限制的情況下。對(duì)于一些報(bào)告或儀表板,其中只需要前N個(gè)記錄。

  • OFFSET-FETCH:最適合大型數(shù)據(jù)集的分頁(yè)。它允許你跳過(guò)指定數(shù)量的行,并返回定義的行集,因此非常適合跨多個(gè)頁(yè)面顯示結(jié)果。

  • SET ROWCOUNT:在舊版本的SQL Server中用于限制行數(shù),或用于更新或刪除特定數(shù)量的記錄。然而,它的使用正在減少,取而代之的是TOP和OFFSET-FETCH。


閱讀原文:原文鏈接


該文章在 2025/1/10 11:13:37 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved