SQL LEFT JOIN

摘要:在本教程中,您將學習如何使用 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)中的每一行進行匹配。

如果條件trueLEFT JOIN 會將兩個表中的行合併為單行。否則,它也會將左表中的行與右表中的行進行組合。

然而,當右表中沒有匹配的行時,LEFT JOIN 會用 NULL 填充右表(right)行中的列,並將其與左表中的行合併。

INNER JOIN 子句不同,LEFT JOIN 子句總是包含左表中的所有行。

LEFT JOINLEFT OUTER JOIN 是相同的,因為 OUTER 關鍵字是可選的。

理解 SQL 左連線 #

假設您有兩個表:

  • X 表有兩個列:id (鍵) 和 x
  • Y 表也有兩列:id(鍵)和 y

左連線使用兩個表 XYid 列的值來匹配行。

左連線包含左表(X)的所有行以及右表(Y)中的匹配行;如果沒有匹配的行,它會為右表(Y)的列使用 null

sql left join visualization

下面的維恩圖是說明左連線的另一種方式。

sql left join Venn diagram

SQL LEFT JOIN 子句示例 #

假設我們有兩個表:employeesdepartments

employees 表有三列:employee_idnamedepartment_id

employee_idnamedepartment_id
1Jane1
2Bob2
3MariaNULL

departments 表有兩列:department_iddepartment_name

department_iddepartment_name
1Sales
2市場營銷

以下查詢使用 LEFT JOIN 子句從 employees 表中檢索 employee_idname,並從 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_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales

employees 表中的第 2 行(department_id 為 2)與 departments 表中的第 2 行(department_id 為 2)匹配。LEFT JOIN 將兩個表中的行組合成一個單行。

employee_idnamedepartment_iddepartment_iddepartment_name
2Bob22市場營銷

employees 表中的第 3 行與 departments 表中的任何行都不匹配。LEFT JOIN 子句為 departments 錶行中的列填充 NULL,並與 employees 表中的行組合以建立以下中間行:

employee_idnamedepartment_iddepartment_iddepartment_name
3MariaNULLNULLNULL

在匹配了兩個表的所有行之後,LEFT JOIN 子句返回以下中間結果集:

employee_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales
2Bob22市場營銷
3MariaNULLNULLNULL

SELECT 子句在最終結果集中包含 employee_idnamedepartment_name

employee_idnamedepartment_name
1JaneSales
2Bob市場營銷
3MariaNULL

使用表別名 #

為了使查詢更簡潔,您可以在連線 employeesdepartments 表時使用表別名

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 示例資料庫中的 countrieslocations 表。

SQL LEFT JOIN - Joining two tables

countries 表儲存國家資訊,locations 表儲存位置資料。

locations 表有一個 country_id 外部索引鍵列,它引用 countries 表的 country_id 主鍵列。

每個國家可以有零個或多個位置,每個位置只屬於一個國家。

以下查詢使用 LEFT JOIN 子句從 countrieslocations 表中選擇美國、英國和中國的 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 示例資料庫中三個表(regionscountrieslocations)的資料庫關係圖。

SQL LEFT JOIN - Joining three tables

以下查詢使用兩個 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 子句來查詢左表中不匹配的行。

測驗 #

資料庫 #

本教程是否有幫助?
© .