在本教學中,我們將介紹另一種稱為SQL 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;
LEFT JOIN
子句出現在FROM
子句之後。 ON
關鍵字後面的條件稱為連線條件B.n = A.n
。
我們來看看以下兩個表:countries
和locations
表的結構和關係。
每個地點屬於一個且僅一個國家/地區,而每個國家/地區可以具有零個或多個地點。countries
和locations
表之間的關係是一對多的。
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
子句中的條件,指示僅檢索來自:US
,UK
和China
行的資料。
因為使用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
請參閱下表:regions
, countries
和locations
的結構和關係。
一個地區可能有零個或多個國家,而每個國家都位於一個地區。 countries
和regions
表之間的關係是一對多的。 countries
表中的region_id
列是國家和地區表之間的連結。
以下語句演示了如何連線3個表:regions
, countries
和locations
:
通過上面的學習,現在您應該很好地理解SQL LEFT JOIN子句的工作原理,並知道如何應用LEFT JOIN
子句來查詢來自多個表的資料。