九月 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
子句从一个表中查询行,这些行在其他表中可能有也可能没有对应的行。