摘要:在本教程中,您將學習如何使用 SQL LEFT JOIN 子句合併兩個表中的行。
SQL LEFT JOIN 子句簡介 #
LEFT JOIN 子句是 SELECT 語句的一個可選子句。LEFT JOIN 子句允許您合併兩個表中的行。
以下是 LEFT JOIN 子句的語法:
SELECT
column1,
column2
FROM
left_table
LEFT JOIN right_table ON condition;Code language: SQL (Structured Query Language) (sql)在此語法中:
- 首先,在
FROM子句中指定左表(left_table)。 - 其次,在
LEFT JOIN子句中提供您想與左表合併行的右表(right_table)。 - 第三,在
ON關鍵字後定義一個用於匹配兩個表之間行的條件。
LEFT JOIN 子句根據條件將左表(left_table)中的每一行與右表(right_table)中的每一行進行匹配。
如果條件為 true,LEFT JOIN 會將兩個表中的行合併為單行。否則,它也會將左表中的行與右表中的行進行組合。
然而,當右表中沒有匹配的行時,LEFT JOIN 會用 NULL 填充右表(right)行中的列,並將其與左表中的行合併。
與 INNER JOIN 子句不同,LEFT JOIN 子句總是包含左表中的所有行。
LEFT JOIN 和 LEFT OUTER JOIN 是相同的,因為 OUTER 關鍵字是可選的。
理解 SQL 左連線 #
假設您有兩個表:
X表有兩個列:id(鍵) 和x。Y表也有兩列:id(鍵)和y。
左連線使用兩個表 X 和 Y 中 id 列的值來匹配行。
左連線包含左表(X)的所有行以及右表(Y)中的匹配行;如果沒有匹配的行,它會為右表(Y)的列使用 null。
下面的維恩圖是說明左連線的另一種方式。
SQL LEFT JOIN 子句示例 #
假設我們有兩個表:employees 和 departments。
employees 表有三列:employee_id、name 和 department_id。
| employee_id | name | department_id |
|---|---|---|
| 1 | Jane | 1 |
| 2 | Bob | 2 |
| 3 | Maria | NULL |
departments 表有兩列:department_id 和 department_name。
| department_id | department_name |
|---|---|
| 1 | Sales |
| 2 | 市場營銷 |
以下查詢使用 LEFT JOIN 子句從 employees 表中檢索 employee_id 和 name,並從 departments 表中檢索 department_name。
SELECT
employee_id,
name,
department_name
FROM
employees
LEFT JOIN departments ON departments.department_id = employees.department_id;Code language: SQL (Structured Query Language) (sql)輸出
employee_id | name | department_name
-------------+-------+-----------------
1 | Jane | Sales
2 | Bob | Marketing
3 | Maria | NULLCode language: plaintext (plaintext)查詢工作原理:
- 第 1 步。
LEFT JOIN子句將employees表中department_id列的值與departments表中department_id的值進行比較。如果它們相等,LEFT JOIN子句將兩個表中的行合併為單行。如果不等,LEFT JOIN會為departments錶行中的列填充NULL,並將其與employees表中的行合併。 - 第 2 步。查詢返回一個包含
SELECT子句中指定列的行。
employees 表中的第 1 行(department_id 為 1)與 departments 表中的第 1 行(department_id 為 1)匹配。LEFT JOIN 子句將兩個表中的行組合成這樣的一行:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
employees 表中的第 2 行(department_id 為 2)與 departments 表中的第 2 行(department_id 為 2)匹配。LEFT JOIN 將兩個表中的行組合成一個單行。
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 2 | Bob | 2 | 2 | 市場營銷 |
employees 表中的第 3 行與 departments 表中的任何行都不匹配。LEFT JOIN 子句為 departments 錶行中的列填充 NULL,並與 employees 表中的行組合以建立以下中間行:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 3 | Maria | NULL | NULL | NULL |
在匹配了兩個表的所有行之後,LEFT JOIN 子句返回以下中間結果集:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
| 2 | Bob | 2 | 2 | 市場營銷 |
| 3 | Maria | NULL | NULL | NULL |
SELECT 子句在最終結果集中包含 employee_id、name 和 department_name。
| employee_id | name | department_name |
|---|---|---|
| 1 | Jane | Sales |
| 2 | Bob | 市場營銷 |
| 3 | Maria | NULL |
使用表別名 #
為了使查詢更簡潔,您可以在連線 employees 和 departments 表時使用表別名。
SELECT
employee_id,
name,
department_name
FROM
employees e
LEFT JOIN departments d ON d.department_id = e.department_id;Code language: SQL (Structured Query Language) (sql)輸出
employee_id | name | department_name
-------------+-------+-----------------
1 | Jane | Sales
2 | Bob | Marketing
3 | Maria | NULLCode language: plaintext (plaintext)在此示例中,我們為 employees 表分配了表別名 e,為 departments 表分配了 d,並使用這些別名引用了兩個表中的 department_id 列。
查詢其他表中不匹配的行 #
除了合併兩個表中的行,您還可以使用 LEFT JOIN 子句來查詢在一個表中沒有對應行的記錄。
例如,以下查詢使用 LEFT JOIN 子句來查詢不屬於任何部門的員工。
SELECT
employee_id,
name,
department_name
FROM
employees e
LEFT JOIN departments d ON d.department_id = e.department_id
WHERE
department_name IS NULL;Code language: SQL (Structured Query Language) (sql)輸出
employee_id | name | department_name
-------------+-------+-----------------
3 | Maria | NULLCode language: plaintext (plaintext)實用的 SQL LEFT JOIN 子句示例 #
讓我們看一下HR 示例資料庫中的 countries 和 locations 表。

countries 表儲存國家資訊,locations 表儲存位置資料。
locations 表有一個 country_id 外部索引鍵列,它引用 countries 表的 country_id 主鍵列。
每個國家可以有零個或多個位置,每個位置只屬於一個國家。
以下查詢使用 LEFT JOIN 子句從 countries 和 locations 表中選擇美國、英國和中國的 street_address、city 和 country name。
SELECT
street_address,
city,
country_name
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)輸出
street_address | city | country_name
------------------------------------------+---------------------+--------------------------
2014 Jabberwocky Rd | Southlake | United States of America
2011 Interiors Blvd | South San Francisco | United States of America
2004 Charade Rd | Seattle | United States of America
8204 Arthur St | London | United Kingdom
Magdalen Centre, The Oxford Science Park | Oxford | United Kingdom
NULL | NULL | ChinaCode language: plaintext (plaintext)輸出表明中國在 locations 表中沒有任何位置。
以下查詢查詢在 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) country_name
--------------
Argentina
Australia
Belgium
Brazil
China
Denmark
Egypt
France
HongKong
India
Israel
Italy
Japan
Kuwait
Mexico
Netherlands
Nigeria
Singapore
Switzerland
Zambia
ZimbabweCode language: plaintext (plaintext)使用 LEFT JOIN 子句連線三個表 #
這是顯示HR 示例資料庫中三個表(regions、countries 和 locations)的資料庫關係圖。

以下查詢使用兩個 LEFT JOIN 子句從三個表中檢索資料。
SELECT
region_name,
country_name,
street_address,
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
ORDER BY
region_name;Code language: SQL (Structured Query Language) (sql)輸出
region_name | country_name | street_address | city
------------------------+--------------------------+------------------------------------------+---------------------
Americas | United States of America | 2011 Interiors Blvd | South San Francisco
Americas | United States of America | 2014 Jabberwocky Rd | Southlake
Americas | Mexico | NULL | NULL
Americas | Canada | 147 Spadina Ave | Toronto
Americas | Brazil | NULL | NULL
Americas | United States of America | 2004 Charade Rd | Seattle
Americas | Argentina | NULL | NULL
Asia | Australia | NULL | NULL
...Code language: plaintext (plaintext)摘要 #
- 使用
LEFT JOIN子句合併兩個表中的行。LEFT JOIN子句總是在結果集中包含第一個表(或左表)的行。 - 使用
LEFT JOIN子句和帶有IS NULL條件的WHERE子句來查詢左表中不匹配的行。
測驗 #
資料庫 #
- PostgreSQL Left Join
- Oracle Left Join
- SQL Server Left Join
- MySQL Left Join
- SQLite Left Join
- Db2 Left Join
- MariaDB Left Join