摘要:在本教程中,我们将向你介绍另一种联合(join),称为 SQL LEFT JOIN,此联合允许你从多个表中检索数据。
SQL LEFT JOIN 子句简介
在之前的教程中,你了解了 内连接(inner 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;
Code language: SQL (Structured Query Language) (sql)
LEFT JOIN 子句出现在 FROM 子句之后。ON 关键字后面的条件称为连接条件 B.n = A.n
SQL LEFT JOIN 示例
SQL LEFT JOIN 两个表的示例
让我们看一下 countries
和 locations
表。

每个位置只属于一个国家,而每个国家可以拥有零个或多个位置。国家和位置表之间的关系是一对多。
locations 表中的 country_id 列是链接到 countries 表中 country_id 列的外键。
若要查询美国、英国和中国的国家名称,请使用以下语句。
SELECT
country_id,
country_name
FROM
countries
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

以下查询检索位于美国、英国和中国的地区
SELECT
country_id,
street_address,
city
FROM
locations
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)
现在,我们使用 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')
Code language: SQL (Structured Query Language) (sql)

应用 WHERE 子句中的条件,以便此语句仅检索美国、英国和中国行中的数据。
由于我们使用了 LEFT JOIN 子句,因此所有满足 countries 表 WHERE 子句中的条件的行都包含在结果集中。
对于 countries 表中的每一行,LEFT JOIN 子句都会在 locations 表中查找匹配的行。
如果找到至少一个匹配的行,数据库引擎会合并两个表中匹配行列中的数据。
例如,未在 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;
Code language: SQL (Structured Query Language) (sql)

SQL LEFT JOIN 3 表的示例
查看以下表:regions、countries 和 locations。

一个区域可以包含零个或多个国家,而每个国家都位于一个区域。国家和区域表之间的关系是一对多。countries 表中的 region_id 列是国家和区域表之间的链接。
以下语句演示了如何连接 3 个表:regions、countries 和 locations
SELECT
r.region_name,
c.country_name,
l.street_address,
l.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
WHERE
c.country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

现在你应该已经很好地理解了 SQL LEFT JOIN 子句如何工作以及如何应用 LEFT JOIN 子句来从多个表中查询数据。