Navicat 部落格

聯結與子查詢比較:哪個更快? 2021 年 2 月 18 日,由 Robert Gravelle 撰寫

聯結(Join)和子查詢(Subquery)都是用於將來自不同資料表中的資料結合為單一個結果集。因此,它們具有許多相似之處和不同之處。一個關鍵的差異是效能。如果執行速度對你的企業極為重要,你應該優先選擇哪一種方法?請繼續閱讀,找出答案!

議論

毫無疑問,在聯結和子查詢之間,聯結往往執行得更快。實際上,使用聯結的查詢擷取時間幾乎總是快過使用子查詢。原因是聯結透過用一個聯結查詢取代多個查詢來減輕資料庫的處理負擔。因而可以更好地利用資料庫的功能來搜尋、篩選和排序記錄。話雖如此,當你在查詢中加入更多的聯結時,資料庫伺服器必須完成更多的工作,使資料擷取時間減慢。

雖然聯結是從正規化資料庫擷取資料的必要部分,但正確撰寫聯結是很重要的,因為錯誤的聯結會嚴重降低效能和導致不準確的查詢結果。在某些情況下,子查詢可以用最小的效能下降(如有)代替複雜的聯結和聯集。

子查詢範例

有時,你可能無法使用子查詢輕鬆地取得所需的資料。以下幾個例子使用了 MySQL 的 Sakila 範例資料庫以及 Navicat Premium 資料庫開發和管理用戶端。

範例 1:將彙總函式用作聯結子句的一部分

在大多數情況下,我們使用通用欄位將資料表聯結一起。實際上,通用欄位通常有相同的名稱,以表明它們參考相同的資訊。但這情況並非總是如此。在以下查詢中,customer 資料表聯結至最新的(MAX)create_date,以便查詢具有最新註冊日期的客戶:

subquery_in_join_clause (268K)

上面的 SELECT 陳述式使用了子查詢,因為不能將彙總函式用作 WHERE 子句的一部分。這種巧妙的解決方法克服了這一個限制!

範例 2:雙彙總

在此範例中,使用子查詢來取得中介結果集,以便我們可以將 AVG() 函式套用於電影租借的 COUNT。這就是我所說的雙彙總,因為我們將彙總(AVG)套用於另一個彙總(COUNT)的結果。

aggregate_of_an_aggregate (70K)

此特定的查詢的速度非常快,僅花費 0.044 秒,因為內部查詢傳回單一(純量)值。通常,最慢的查詢是需要全資料表掃描的查詢,而這裡不是此類情況。

總結

雖然聯結和子查詢在 SQL 陳述式中都各有所長,但我個人建議你盡量嘗試只使用聯結撰寫查詢。只有在沒有子查詢的情況下無法取得你想要的資料時,才應使用子查詢。

如果你對 Navicat Premium 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔