八月 31, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的INNER JOIN子句从多个表中查询数据。
目录
PostgreSQL INNER JOIN 子句简介
在关系数据库中,数据通常分布在多个表中。为了查询完整的数据,经常需要从多个表中查询数据。
在本教程中,我们重点关注如何使用INNER JOIN子句组合多个表中的数据。
假设有两个表 A 和 B。表 A 有一个列pka,其值与表 B 的fka列中的值匹配。

要从两个表中查询数据,请在SELECT语句中使用INNER JOIN子句,如下所示:
SELECT
pka,
c1,
pkb,
c2
FROM
A
INNER JOIN B ON pka = fka;
要将表A与表B连接,请按照下列步骤操作:
- 首先,指定要在
SELECT列表子句中查询数据的两个表中的列。 - 其次,在
FROM子句中指定主表,即表A。 - 第三,在
INNER JOIN子句中指定第二个表 (B) ,并在ON关键字后提供连接条件。
INNER JOIN是如何运作的?
对于表A中的每一行,内连接将pka列中的值与表B中每一行的fka列中的值进行比较:
- 如果这些值相等,则内部联接将创建一个包含两个表的所有列的新行,并将其添加到结果集中。
- 如果这些值不相等,内连接将忽略它们并移至下一行。
下面的维恩图说明了INNER JOIN子句的工作原理。

大多数时候,您想要连接的表将具有相同名称的列,例如,像customer_id这样的id列。
如果在查询中引用不同表中具有相同名称的列,则会出现错误。为了避免该错误,您需要使用以下语法完全限定这些列:
table_name.column_name
在实践中,您将使用表别名来分配连接表的短名称,以使查询更具可读性。
PostgreSQL INNER JOIN 示例
让我们看一些使用INNER JOIN子句的例子。
1) 使用 INNER JOIN 连接两个表
我们来看看示例数据库中的customer和payment表。

在这些表中,每当客户付款时,就会在payment表中插入一个新行。
每个客户可能有零次或多次付款。但是,每笔付款只属于一位客户。customer_id列建立了两个表之间的关系。
以下语句使用INNER JOIN子句从两个表中查询数据:
SELECT
customer.customer_id,
first_name,
last_name,
amount,
payment_date
FROM
customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
ORDER BY payment_date;

以下查询返回相同的结果。但是,它使用了表别名:
SELECT
c.customer_id,
first_name,
last_name,
email,
amount,
payment_date
FROM
customer c
INNER JOIN payment p
ON p.customer_id = c.customer_id
WHERE
c.customer_id = 2;
由于两个表具有相同的customer_id列,因此您可以使用USING语法,如下:
SELECT
customer_id,
first_name,
last_name,
amount,
payment_date
FROM
customer
INNER JOIN payment USING(customer_id)
ORDER BY payment_date;
2) 使用 INNER JOIN 连接三个表
下图说明了三个表之间的关系:staff、payment和customer。
- 每个员工处理零笔或多笔付款。每笔付款均由一名且只有一名工作人员处理。
- 每个客户进行零次或多次付款。每笔付款均由一位客户进行。

要连接三个表,请将第二个INNER JOIN子句放置在第一个INNER JOIN子句之后,查询如下:
SELECT
c.customer_id,
c.first_name customer_first_name,
c.last_name customer_last_name,
s.first_name staff_first_name,
s.last_name staff_last_name,
amount,
payment_date
FROM
customer c
INNER JOIN payment p
ON p.customer_id = c.customer_id
INNER JOIN staff s
ON p.staff_id = s.staff_id
ORDER BY payment_date;

要连接三个以上的表,您可以应用相同的技术。
在本教程中,您学习了如何使用 PostgreSQL 的INNER JOIN子句从多个表中查询数据。