SQL Left Join子句
在本教程中,我們將介紹另一種稱爲SQL LEFT JOIN的連接,它用於從多個表中檢索數據。
1. 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。
2. SQL LEFT JOIN示例
2.1. 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');
執行上面查詢語句,得到以下結果 -
+------------+--------------+
| 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
2.2. SQL LEFT JOIN 3個表的示例
請參閱下表:regions, countries和locations的結構和關係。
一個地區可能有零個或多個國家,而每個國家都位於一個地區。 countries和regions表之間的關係是一對多的。 countries表中的region_id列是國家和地區表之間的鏈接。
以下語句演示瞭如何連接3個表:regions, countries和locations:
通過上面的學習,現在您應該很好地理解SQL LEFT JOIN子句的工作原理,並知道如何應用LEFT JOIN子句來查詢來自多個表的數據。