Navicat 部落格

巢狀聯結的說明 2022 年 5 月 26 日,由 Robert Gravelle 撰寫

就在你以為你了解各種類型的聯結時,又有另一種出現!可能你曾聽過巢狀聯結,甚至是巢狀迴圈查詢計劃,並想知道它們是什麼。好吧,今天的文章將為你解開謎團!

術語案例

在關聯式資料庫中,同一事物可以有許多不同的名稱。聯結也不例外。事實上,當談及巢狀聯結時,資料庫從業人員會根據他們對巢狀聯結的看法而有所不同。有人說沒有這回事;但也有人務實一點,承認它們只是多個資料表聯結的另一個術語。

該術語很可能是在談及巢狀迴圈查詢計劃時出現的。查詢引擎經常使用這些來回答聯結。在其最原始的形式中,巢狀迴圈是這樣的:

for all the rows in outer table 
  for all the rows in the inner table 
    if outer_row and inner row satisfy the join condition 
      emit the rows 
  next inner 
next outer

這是最簡單但也是最慢的巢狀迴圈類型。同時,多個資料表巢狀迴圈聯結的效能更差,因為它們隨著所有相關資料表中的列數的乘積增長而急劇擴展。

巢狀迴圈的一種更有效的形式是 nested-loop-over-index:

for all the rows that pass the filter from the outer table 
  use join qualifier from outer table row on index on inner table 
    if row found using index lookup 
      emit the rows 
next outer 

巢狀聯結語法

既然我們已經確定術語「巢狀聯結」只是指兩個以上資料表之間的聯結,那麼讓我們快速了解一下它們的語法。

通常,當我們需要聯結多個資料表和/或檢視時,我們會使用以下泛型格式逐一列出它們:

FROM  Table1 
[ join type ] JOIN Table2 
                ON condition2 
[ join type ] JOIN Table3 
                ON condition3 

但這不是唯一的方法。SQL 的官方 ANSI 語法標準提出了另一種編寫上述聯結的有效方法:

FROM  Table1 
[ join type ] JOIN Table2 
[ join type ] JOIN Table3 
                ON condition3 
                ON condition2 

為了使上述聯結樣式較易閱讀,我們可以加入括號和縮排以使其更清晰:

FROM  Table1 
[ join type ] JOIN ( Table2 
                    [ join type ] JOIN Table3 
                                    ON condition3 ) 
                ON condition2 

現在更容易看到 Table2 和 Table3 之間的聯結是首先指定的,並且必須在聯結 Table1 之前完成。此查詢樣式還將 Table2 和 Table3 之間的聯結定位為看起來是巢狀的。而實際上,我們可以認為 Table2 和 Table3 之間的聯結是巢狀的。

以下是 Navicat Premium 中以兩種樣式編寫的相同查詢:

syntax_comparison (98K)

總結

今天的文章闡述了「巢狀聯結」和「巢狀迴圈查詢計劃」這兩個術語。因此,下次你聽到它們時,要意識到它們只是指聯結多個資料表或檢視,而不管使用了哪種語法。

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