翻譯|使用教程|編輯:吉煒煒|2024-11-04 13:55:24.213|閱讀 102 次
概述:在數(shù)據(jù)庫管理中,有效限制查詢結果對于優(yōu)化性能和確保檢索相關數(shù)據(jù)至關重要。本文將帶領大家仔細看看LIMITSQL Server 中的替代方案,重點介紹它們的獨特功能和局限性。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在數(shù)據(jù)庫管理中,有效限制查詢結果對于優(yōu)化性能和確保檢索相關數(shù)據(jù)至關重要。許多 SQL 數(shù)據(jù)庫系統(tǒng)(例如 MySQL 和 PostgreSQL)都使用LIMIT子句來指定查詢返回的記錄數(shù)。但是,SQL Server 不支持該LIMIT子句,而是選擇諸如TOP、和 之類的替代方案。這種設計選擇反映了 SQL Server 對靈活性和性能的關注,提供了各種方法來實現(xiàn)類似的功能,同時滿足不同的用例和場景。
讓我們仔細看看LIMITSQL Server 中的替代方案,重點介紹它們的獨特功能和局限性。
dbForge Studio for SQL Server官方正版下載
使用 SELECT TOP 子句
在 SQL Server 中,該SELECT TOP子句充當子句的替代LIMIT。同樣,它用于限制查詢返回的行數(shù)。當您處理大型數(shù)據(jù)集并且只想檢索記錄的子集時,它特別有用。基本語法是:
SELECT TOP (number | percent) column_names FROM table_name;
此處,number代表要返回的確切行數(shù),是percent返回的行數(shù)占總結果集的百分比。請根據(jù)需要使用這些參數(shù)之一。
您可以通過添加其他子句(比如WHERE or ORDER BY )來進一步優(yōu)化結果。
例如,以下查詢返回按受雇日期排序的前五名員工(此處和下面,我們將在示例中使用 AdventureWorks2022 示例數(shù)據(jù)庫):
USE AdventureWorks2022; SELECT TOP 5 * FROM HumanResources.Employee ORDER BY HireDate;
或者,此查詢檢索休假時間超過 20 小時的前 10% 員工的國家 ID 和職位:
USE AdventureWorks2022; SELECT TOP 10 PERCENT NationalIDNumber, JobTitle FROM HumanResources.Employee WHERE VacationHours > 20;
使用該SELECT TOP子句有很多好處。首先,性能優(yōu)化——它限制了結果集的大小,當只需要部分數(shù)據(jù)時,可以減少內存和處理負載。其次,它可用于通過僅檢索當前頁面所需的行來為大型結果集創(chuàng)建高效的分頁。此外,通過限制返回的行數(shù),它在測試大型表上的查詢時也很有用。
請注意,SELECT TOP不提供隨機行。要實現(xiàn)隨機性,您可以將其與 結合使用,但這對于大型數(shù)據(jù)集來說效率低下。另一方面,如果不指定子句,結果可能是不可預測的,因為 SQL Server 不保證返回行的順序。
使用 OFFSET-FETCH 實現(xiàn)分頁
說到分頁,另一個子句——OFFSET-FETCH——可以在 SQL Server 中使用來實現(xiàn)分頁,它允許您通過跳過一定數(shù)量的行然后獲取定義數(shù)量的行來檢索特定的記錄子集。此子句具有以下語法:
SELECT column_names FROM table_name ORDER BY column_name OFFSET number_of_rows_to_skip ROWS FETCH NEXT number_of_rows_to_return ROWS ONLY;
該OFFSET子句允許您指定在返回行之前需要跳過多少行,并FETCH NEXT定義在跳過的行之后返回多少行。
為了說明這一點,假設您需要跳過按 BusinessEntityID 排序的前 10 條記錄并返回后 10 條記錄,從而有效地獲取分頁結果中的第 2 頁。您的查詢將如下所示:
USE AdventureWorks2022; SELECT * FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
您還可以使用OFFSET-FETCH動態(tài)頁面大小和頁碼。例如,此動態(tài)查詢獲取第 3 頁的記錄,假設每頁大小為 10 行:
USE AdventureWorks2022; DECLARE @PageSize INT = 10; DECLARE @PageNumber INT = 3; SELECT BusinessEntityID, JobTitle, HireDate FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET (@PageSize * (@PageNumber - 1)) ROWS FETCH NEXT @PageSize ROWS ONLY;
這種子句組合非常棒,因為它可以讓您精確控制分頁 — 這是一種簡潔高效的分頁處理方法,尤其適用于 Web 應用程序。此外,它遵循 SQL 標準,因此對于來自其他 RDBMS 的開發(fā)人員來說,它具有可移植性且易于理解。最重要的是,與其他方法(例如使用子查詢)不同,它直接跳過并獲取行,而無需復雜的解決方法。
但值得注意的是,對于大型數(shù)據(jù)集,分頁越深(例如,第 1000 頁),查詢可能會變得越慢,因為 SQL Server 必須跳過更多行。另一個需要考慮的問題是,不返回總行數(shù),因此如果您需要顯示分頁元數(shù)據(jù)(例如總頁數(shù)),則需要額外的查詢——來獲取總行數(shù)。并且不要忘記,使用時必須使用子句;否則,結果是不可預測的。
使用 SET ROWCOUNT 命令
您可以使用SET ROWCOUNTSQL Server 中的命令來限制語句返回的行數(shù)SELECT或受UPDATE或影響的行數(shù)DELETE。該命令的語法如下:
SET ROWCOUNT { number | 0 }
而不是number您指定要返回或處理的行數(shù),而是0重置行數(shù)。
如果將SET ROWCOUNTandSELECT與其他命令(例如ORDER BYand WHERE)一起使用,它們的交互作用會非常強大。在此組合中,WHERE子句首先篩選行,ORDER BY子句對篩選出的行進行排序,然后SET ROWCOUNT限制從排序結果集返回的行數(shù)。
下面是一個示例,我們只想檢索按字母順序排序(按職位)且休假時間超過 50 小時的員工的前五條記錄,然后重置行數(shù)限制,以便將來的查詢返回所有匹配的行:
USE AdventureWorks2022; SET ROWCOUNT 5; SELECT * FROM HumanResources.Employee WHERE VacationHours > 50 ORDER BY JobTitle; SET ROWCOUNT 0;
SET ROWCOUNT使用數(shù)據(jù)修改命令(例如UPDATE或)DELETE的工作原理類似。讓我們考慮一個更新數(shù)據(jù)的示例。運行此腳本將僅將具有 Stocker 職位的第一位員工的職位更改為 Chief Stocker,然后重置行數(shù)限制,并顯示結果:
USE AdventureWorks2022; SET ROWCOUNT 1; UPDATE HumanResources.Employee SET JobTitle = 'Chief Stocker' WHERE JobTitle = 'Stocker'; SET ROWCOUNT 0; -- To see the result of the update SELECT * FROM HumanResources.Employee WHERE JobTitle LIKE ('%Stocker%') ORDER BY JobTitle;
如您所見,SET ROWCOUNT提供了一種簡單的方法來限制結果,而無需復雜的語法。與TOP有時需要子查詢來實現(xiàn)更復雜的邏輯的命令不同,它SET ROWCOUNT可以直接與語句一起使用SELECT。但是,該SET ROWCOUNT命令被認為已棄用,因為它限制了結果集,而傾向于TOP使用提供更清晰語義的子句。
缺點是, 的效果SET ROWCOUNT是特定于會話的,這意味著必須在每個需要它的會話中設置它。此外,SET ROWCOUNT如果不小心使用,在更復雜的查詢中使用可能會導致意想不到的結果。
請注意SET ROWCOUNT,現(xiàn)在越來越少使用了。SQL 標準已經(jīng)發(fā)展,現(xiàn)代 SQL 實踐更傾向于對結果集和數(shù)據(jù)操作進行更明確的控制。因此,Microsoft 建議改用子句TOP,因為SET ROWCOUNT不會影響SQL Server 2022 版本之后的未來版本中的DELETE和UPDATE語句。
使用 dbForge Studio 親自嘗試
我們將在 dbForge Studio for SQL Server 中嘗試上述用例之一。
讓我們首先檢查 AdventureWorks2022 數(shù)據(jù)庫的 HumanResources.Employee 表中有多少名員工擔任營銷專家職位。我們按如下方式執(zhí)行此操作:
SELECT COUNT(*) AS Count FROM HumanResources.Employee WHERE JobTitle = 'Marketing Specialist';
我們可以看到,共有五個:
我們想知道哪三位專家的未使用休假時間最多。我們使用以下查詢:
SET ROWCOUNT 3; SELECT * FROM HumanResources.Employee WHERE JobTitle = 'Marketing Specialist' ORDER BY VacationHours DESC; SET ROWCOUNT 0;
dbForge Studio 返回結果(為了演示的目的,我們改變了列的順序):
為什么選擇dbForge Studio for SQL Server?
我們相信,dbForge Studio 憑借其增強的用戶界面和高級功能,比 SQL Server Management Studio (SSMS) 更出色。雖然 SSMS 圍繞基礎功能展開,但 dbForge Studio 提供了復雜的工具,如可視化查詢構建、數(shù)據(jù)庫比較和同步、數(shù)據(jù)聚合和分析、自動單元測試以及與版本控制系統(tǒng)的集成。這種對用戶體驗和強大功能的關注使 dbForge Studio 成為SQL Server 管理中SSMS 的有力替代方案。
總而言之,讓我們簡單比較一下LIMIT上面討論的子句的 SQL Server 替代方案:
因此,根據(jù)使用情況,每種方法都有其獨特的優(yōu)勢。
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn