SQL LEFT JOIN

摘要:在本教學中,我們將介紹另一種稱為 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 LEFT JOIN

在 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 兩個資料表範例

讓我們看看 countrieslocations 資料表。

countries_locations_tables

每個位置都屬於一個且僅屬於一個國家,而每個國家可以有零個或多個位置。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)

試試看

SQL LEFT JOIN countries data

以下查詢會檢索位於美國、英國和中國的位置

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)

試試看

SQL LEFT JOIN two tables example

會套用 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 with IS NULL example

SQL LEFT JOIN 3 個資料表範例

請參閱以下資料表:regions、countries 和 locations。

location_tables

一個區域可能有零個或多個國家,而每個國家都位於一個區域中。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 3 tables example

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

此教學對您有幫助嗎?