提要:在本教程中,您将学习如何使用PostgreSQL 的 LEFT JOIN从两个或多个表中查询数据。

PostgreSQL LEFT JOIN 简介

假设我们有两张表:

A表和B表

B 表通过 fka 字段与 A 表进行关联。 A 表里的每行记录都与 B 表存在零个或多个对应关系。B 表的每行在 A 表中,都有零个或多个对应的行。 如果,要从 A 表里查询出所有在 B 表都有对应的行的数据,需要使用INNER JOIN(内连)。 如果要从 A 表里查询出所有记录,而不关心 B 表中是否存在对应的数据,使用 LEFT JOIN。这种情况下,如果 B 表没有对应的数据,那么 B 里相关的字段值将设置为 NULL

下面的语句是一个 LEFT JOIN 的示例:

SELECT
 A.pka,
 A.c1,
 B.pkb,
 B.c2
FROM
 A
LEFT JOIN B ON A.pka = B.fka;

要将 A 表和 B 表建立左连接,需要:

  • SELECT 中指定想要获取数据的字段
  • 通过 FROM 指定左表,如本例中的 A
  • 通过 LEFT JOIN 指定右表,如本例中的 B。同时,需要通过 ON 来指定连接的条件,本例中的 A.pka = B.fka

无论右表是否存在对应的行,LEFT JOIN 都将返回左表中的所有数据。如果右表不存在对应的行,那么,右表相关的字段将设置为 NULL。之后,会把两个表的数据进行合并,以一个结果集的形式返回。

LEFT JOIN 也称为 LEFT OUTER JOIN

下图展示了 LEFT JOIN 的工作方式:

LEFT JOIN WORKING

PostgreSQL LEFT JOIN 示例

我们以示例数据库中的 filminventory 表来演示 LEFT JOIN 的用法。

film and inventory table

film 表中的每一行在 inventory 表里都有零个或多个对应关系。inventory 表中的每一行在 film 表中都拥有一个且只有一个对应关系。

下面是对 filminventory 使用 LEFT JOIN 的示例:

SELECT
 film.film_id,
 film.title,
 inventory_id
FROM
 film
LEFT JOIN inventory ON inventory.film_id = film.film_id;

film and inventory left join

由于 film 表里有些数据在 inventory 并不存在对应关系,所以这些数据的 inventory.film_id 会显示为 NULL

使用下面的 SQL 语句,可以把所有在 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;

film and inventory left join null

相关主题