PostgreSQL 教程: LEFT JOIN 左连接

九月 1, 2023

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

PostgreSQL LEFT JOIN 子句简介

假设您有两个表:AB

A and B tables

A中的每一行在表B中可能有零个或多个对应的行,而表B中的每一行在表A中只有一个对应的行。

要从表A中查询在表B中可能有也可能没有对应行的数据,可以使用LEFT JOIN子句。

以下语句说明了连接表A与表BLEFT 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子句的工作原理:

PostgreSQL Join - Left Join

请注意,LEFT JOIN也称为LEFT OUTER JOIN

PostgreSQL LEFT JOIN 示例

让我们看看来自示例数据库中的filminventory表。

Film and Inventory tables

film表中的每一行在inventory表中可能有零行或多行。inventory表中的每一行在film表中有且仅有一行。

film_id列建立了filminventory表之间的链接。

以下语句使用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;

PostgreSQL LEFT JOIN example

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;

PostgreSQL LEFT JOIN with a WHERE clause example

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