八月 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
子句从多个表中查询数据。