PostgreSQL 教程: INNER JOIN 内连接

八月 31, 2023

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

PostgreSQL INNER JOIN 子句简介

在关系数据库中,数据通常分布在多个表中。为了查询完整的数据,经常需要从多个表中查询数据。

在本教程中,我们重点关注如何使用INNER JOIN子句组合多个表中的数据。

假设有两个表 A 和 B。表 A 有一个列pka,其值与表 B 的fka列中的值匹配。

A and B tables

要从两个表中查询数据,请在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子句的工作原理。

PostgreSQL Join - Inner Join

大多数时候,您想要连接的表将具有相同名称的列,例如,像customer_id这样的id列。

如果在查询中引用不同表中具有相同名称的列,则会出现错误。为了避免该错误,您需要使用以下语法完全限定这些列:

table_name.column_name

在实践中,您将使用表别名来分配连接表的短名称,以使查询更具可读性。

PostgreSQL INNER JOIN 示例

让我们看一些使用INNER JOIN子句的例子。

1) 使用 INNER JOIN 连接两个表

我们来看看示例数据库中的customerpayment表。

customer and payment tables

在这些表中,每当客户付款时,就会在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;

img

以下查询返回相同的结果。但是,它使用了表别名:

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 连接三个表

下图说明了三个表之间的关系:staffpaymentcustomer

  • 每个员工处理零笔或多笔付款。每笔付款均由一名且只有一名工作人员处理。
  • 每个客户进行零次或多次付款。每笔付款均由一位客户进行。

customer, payment and staff tables

要连接三个表,请将第二个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;

img

要连接三个以上的表,您可以应用相同的技术。

在本教程中,您学习了如何使用 PostgreSQL 的INNER JOIN子句从多个表中查询数据。