Navicat 部落格

了解 SQL 外部聯結 2022 年 10 月 11 日,由 Robert Gravelle 撰寫

外部聯結(Outer Join)是所有 SQL 聯結類型中最不為人所知的。也許是因為與其他聯結類型相比,外部聯結的需求較少。無論如何,外部聯結本身並沒有什麼奇特的。正如我們將在這篇文章中看到的幾個外部聯結的範例,應該足以消除你對它們的任何誤解和困惑。

本文將首先講述 Outer Join 陳述式的語法和用途,然後會有一些例子說明。

OUTER JOIN 語法

當左邊(資料表 A)或右邊(資料表 B)資料表記錄有相符項目時,OUTER JOIN(或 FULL OUTER JOIN)關鍵字會傳回兩個聯結資料表的所有記錄。下面的 VEN 圖描述了潛在的相符項目和 OUTER JOIN 語法:

outer_join_diagram (12K)

因此,FULL OUTER JOIN 會傳回兩個資料表中不相符的列,以及兩個資料表中相符的列。換句話說,無論兩個資料表的聯結欄位(Clave)值是否相符,查詢都會傳回列。

還是很困惑?不要擔心,我們將在下一節中看看一些範例,就能一清二楚。

OUTER JOIN 的實踐

在本教學中,我們將使用熟知的 Northwind 範例資料庫

以下的 SQL 陳述式選取所有客戶和所有訂單:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

由 OUTER JOIN 查詢產生的結果集的特徵之一是,你可能會在任何一個聯結欄中看到 Null 值,因為聯結欄可能出現在一個資料表中,但不會出現在另一個資料表中。在下面的螢幕擷取畫面中,我們可以看到在 Navicat Premium 16 中的上述查詢及其結果:

outer_join_query1 (74K)

當然,你不會在兩個資料表欄中看到 Null,因為值必須至少出現在一個資料表中。值得注意的是,在 ContactName 欄中出現 Null 是有問題的,因為這意味著訂單與現有客戶沒有關聯。這指出了資料庫設計存在缺陷,很可能是缺少外部索引鍵條件約束。

我們的第二個範例是從專案管理資料庫中取得資料(專案經理和專案)。以下是 SQL 陳述式:

SELECT 
    m.name member, 
    p.title project
FROM 
    pm.members m
    FULL OUTER JOIN pm.projects p 
        ON p.id = m.project_id;

同樣,我們可以看到 Null 值(至少一個 Null 值)

outer_join_query2 (30K)

在這種情況下,結果表明 Jack Daniel 目前沒有專案。這是否構成問題將取決於該組織的具體業務。專案經理在何特定時間裡沒有負責專案,或者沒有指派專案,這可能是完全合理的。

總結

希望今天的文章能夠幫助你了解外部聯結在查詢中用途和用法。最後一件要注意的事:外部聯結可能會產生非常大的結果集,因此要謹慎使用它們,並加入篩選子句(例如 WHERE)以盡量減少傳回的列數。

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