九月 1, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的LEFT JOIN子句从多个表中查询数据。
目录
PostgreSQL LEFT JOIN 子句简介
假设您有两个表:A和B。

表A中的每一行在表B中可能有零个或多个对应的行,而表B中的每一行在表A中只有一个对应的行。
要从表A中查询在表B中可能有也可能没有对应行的数据,可以使用LEFT JOIN子句。
以下语句说明了连接表A与表B的LEFT JOIN语法:
SELECT
pka,
c1,
pkb,
c2
FROM
A
LEFT JOIN B ON pka = fka;
要使用左连接将表A与表B连接起来,请执行以下步骤:
- 首先,指定两个表中要在
SELECT列表子句中查询数据的列。 - 其次,在
FROM子句中指定左表(表A)。 - 第三,在
LEFT JOIN子句中指定右表(表B),并在ON关键字后指定连接条件。
LEFT JOIN子句开始从左表中查询数据。对于左表中的每一行,它将pka列中的值与右表中每行中的fka列值进行比较。
如果这些值相等,则左连接子句将创建一个新行,其中包含SELECT列表子句中出现的列,并将该行添加到结果集中。
如果这些值不相等,左连接子句还会创建一个新行,其中包含SELECT列表子句中出现的列。此外,它还用 NULL 填充来自右表的列。
下面的维恩图说明了LEFT JOIN子句的工作原理:

请注意,LEFT JOIN也称为LEFT OUTER JOIN。
PostgreSQL LEFT JOIN 示例
让我们看看来自示例数据库中的film和inventory表。

film表中的每一行在inventory表中可能有零行或多行。inventory表中的每一行在film表中有且仅有一行。
film_id列建立了film和inventory表之间的链接。
以下语句使用LEFT JOIN子句将film表与inventory表连接起来:
SELECT
film.film_id,
title,
inventory_id
FROM
film
LEFT JOIN inventory
ON inventory.film_id = film.film_id
ORDER BY title;

当film表中的某行在inventory表中没有匹配行时,该行的inventory_id列值为NULL。
以下语句添加了一个WHERE子句来查找不在inventory表中的影片:
SELECT
film.film_id,
film.title,
inventory_id
FROM
film
LEFT JOIN inventory
ON inventory.film_id = film.film_id
WHERE inventory.film_id IS NULL
ORDER BY title;
以下语句返回相同的结果。不同之处在于它使用表别名来使查询更加简洁:
SELECT
f.film_id,
title,
inventory_id
FROM
film f
LEFT JOIN inventory i
ON i.film_id = f.film_id
WHERE i.film_id IS NULL
ORDER BY title;

如果两个表在ON子句中使用相同的列名,则可以使用USING语法,如下:
SELECT
f.film_id,
title,
inventory_id
FROM
film f
LEFT JOIN inventory i USING (film_id)
WHERE i.film_id IS NULL
ORDER BY title;
当您想要从一个表中查询在另一表中没有匹配行的行时,此技术非常有用。
在本教程中,您学习了如何使用 PostgreSQL 的LEFT JOIN子句从一个表中查询行,这些行在其他表中可能有也可能没有对应的行。