SQL Left Join子句


在本教學中,我們將介紹另一種稱為SQL LEFT JOIN的連線,它用於從多個表中檢索資料。

1. SQL LEFT JOIN子句簡介

在上一個教學中我們知道,如果兩個表中至少有一行與連線條件匹配,則返回行記錄的內聯接。 內連線子句消除了與另一個表的行不匹配的行。

但是,左連線將返回左表中的所有行,而不管右表中是否存在匹配的行。

假設有兩個表AB。表A有四行:1,2,34。表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;

LEFT JOIN子句出現在FROM子句之後。 ON關鍵字後面的條件稱為連線條件B.n = A.n

2. SQL LEFT JOIN範例

2.1. SQL LEFT JOIN兩個表的例子

我們來看看以下兩個表:countrieslocations表的結構和關係。

每個地點屬於一個且僅一個國家/地區,而每個國家/地區可以具有零個或多個地點。countrieslocations表之間的關係是一對多的。

locations表中的country_id列是連結到countries表中country_id列的外來鍵。

要查詢美國,英國和中國的國家/地區名稱,請使用以下語句。

···

SELECT
    country_id,
    country_name
FROM
    countries
WHERE
    country_id IN ('US', 'UK', 'CN');

執行上面查詢語句,得到以下結果 -

+------------+--------------+
| country_id | country_name |
+------------+--------------+
| CN         | 中國         |
| UK         | 英國         |
| US         | 美國         |
+------------+--------------+
3 rows in set

以下查詢檢索位於美國,英國和中國的地點:

SELECT
    country_id,
    street_address,
    city
FROM
    locations
WHERE
    country_id IN ('US', 'UK', 'CN');

執行上面查詢語句,得到以下結果 -

+------------+------------------------------------------+---------------------+
| country_id | street_address                           | city                |
+------------+------------------------------------------+---------------------+
| US         | 2014 Jabberwocky Rd                      | Southlake           |
| US         | 2011 Interiors Blvd                      | South San Francisco |
| US         | 2004 Charade Rd                          | Seattle             |
| UK         | 8204 Arthur St                           | London              |
| UK         | Magdalen Centre, The Oxford Science Park | Oxford              |
+------------+------------------------------------------+---------------------+
5 rows in set

現在,使用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')

執行上面查詢語句,得到以下結果 -

應用WHERE子句中的條件,指示僅檢索來自:USUKChina行的資料。

因為使用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;

執行以下查詢語句,得到以下結果 -

+--------------+
| country_name |
+--------------+
| 中國         |
| 丹麥         |
| 以色列       |
| 印度         |
| 埃及         |
| 墨西哥       |
| 尼日利亞     |
.....
| 荷蘭         |
| 贊比亞       |
| 阿根廷       |
| 香港         |
+--------------+
21 rows in set

2.2. SQL LEFT JOIN 3個表的範例

請參閱下表:regions, countrieslocations的結構和關係。

一個地區可能有零個或多個國家,而每個國家都位於一個地區。 countriesregions表之間的關係是一對多的。 countries表中的region_id列是國家和地區表之間的連結。

以下語句演示了如何連線3個表:regions, countrieslocations

通過上面的學習,現在您應該很好地理解SQL LEFT JOIN子句的工作原理,並知道如何應用LEFT JOIN子句來查詢來自多個表的資料。