摘要:在本教學中,我們將介紹另一種稱為 SQL LEFT JOIN 的聯結方式,它允許您從多個資料表中檢索資料。
SQL LEFT JOIN 子句簡介
在之前的教學中,您學習了 inner join,它會在至少兩個資料表中存在符合聯結條件的列時,傳回列。inner join 子句會排除不符合另一個資料表列的列。
但是,left join 會傳回左側資料表中的所有列,無論右側資料表中是否有符合的列。
假設我們有兩個資料表 A 和 B。資料表 A 有四列 1、2、3 和 4。資料表 B 也有四列 3、4、5、6。
當我們將資料表 A 與資料表 B 聯結時,資料表 A(左側資料表)中的所有列都會包含在結果集中,無論資料表 B 中是否有符合的列。

在 SQL 中,我們使用以下語法將資料表 A 與資料表 B 聯結。
SELECT
A.n
FROM
A
LEFT JOIN B ON B.n = A.n;
Code language: SQL (Structured Query Language) (sql)
LEFT JOIN 子句出現在 FROM 子句之後。ON 關鍵字之後的條件稱為聯結條件 B.n = A.n
SQL LEFT JOIN 範例
SQL LEFT JOIN 兩個資料表範例
讓我們看看 countries
和 locations
資料表。

每個位置都屬於一個且僅屬於一個國家,而每個國家可以有零個或多個位置。countries 和 locations 資料表之間的關係是一對多。
locations 資料表中的 country_id 欄位是連結到 countries 資料表中 country_id 欄位的外鍵。
要查詢美國、英國和中國的國家名稱,您可以使用以下陳述式。
SELECT
country_id,
country_name
FROM
countries
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

以下查詢會檢索位於美國、英國和中國的位置
SELECT
country_id,
street_address,
city
FROM
locations
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)
現在,我們使用 LEFT JOIN 子句將 countries 資料表與 locations 資料表聯結,如下列查詢所示
SELECT
c.country_name,
c.country_id,
l.country_id,
l.street_address,
l.city
FROM
countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
c.country_id IN ('US', 'UK', 'CN')
Code language: SQL (Structured Query Language) (sql)

會套用 WHERE 子句中的條件,以便陳述式僅從美國、英國和中國的列中檢索資料。
由於我們使用 LEFT JOIN 子句,因此在 countries 資料表的 WHERE 子句中符合條件的所有列都會包含在結果集中。
對於 countries 資料表中的每一列,LEFT JOIN 子句都會在 locations 資料表中尋找符合的列。
如果找到至少一個符合的列,資料庫引擎會結合來自兩個資料表中符合的列的資料。
如果沒有找到符合的列,例如 country_id 為 CN 的情況,則 countries 資料表中的列會包含在結果集中,而 locations 資料表中的列會填入 NULL 值。
由於右側資料表中不符合的列會填入 NULL 值,因此您可以套用 LEFT JOIN 子句來處理資料表之間不符合的列。
例如,要尋找 locations 資料表中沒有任何位置的國家,您可以使用以下查詢
SELECT
country_name
FROM
countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
l.location_id IS NULL
ORDER BY
country_name;
Code language: SQL (Structured Query Language) (sql)

SQL LEFT JOIN 3 個資料表範例
請參閱以下資料表:regions、countries 和 locations。

一個區域可能有零個或多個國家,而每個國家都位於一個區域中。countries 和 regions 資料表之間的關係是一對多。countries 資料表中的 region_id 欄位是 countries 和 regions 資料表之間的連結。
以下陳述式示範如何聯結 3 個資料表:regions、countries 和 locations
SELECT
r.region_name,
c.country_name,
l.street_address,
l.city
FROM
regions r
LEFT JOIN countries c ON c.region_id = r.region_id
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
c.country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

現在,您應該對 SQL LEFT JOIN 子句的工作方式有很好的了解,並知道如何套用 LEFT JOIN 子句來從多個資料表查詢資料。