PostgreSQL 连接类型:内连接、外连接、左连接、右连接

⚡ 智能摘要

PostgreSQL 连接操作使用共享键从两个或多个表中检索和合并行,包括 theta、EQUI 和 natural 等内连接,以及涵盖左、右和完整结果的外连接。

  • 🔗 结合: 连接操作会根据公共键合并多个表中的列。
  • 🎯 内部联接: 内连接仅返回满足连接条件的行。
  • ⬅️ 左联接: LEFT OUTER JOIN 保留左表中的每一行,对于不匹配的右表行,添加 NULL 值。
  • ➡️ 正确加入: 右外连接保留右表中的每一行,并将不匹配的左行替换为 NULL。
  • ???? 完全加入: FULL OUTER JOIN 返回两个表中所有行,如果不存在匹配项,则返回 NULL 值。
  • 🤖 人工智能帮助: AI助手选择正确的连接类型并写入ON条件。

PostgreSQL 连接类型

什么是 Join PostgreSQL?

PostgreSQL 加入 用于从多个表中检索数据。通过连接(JOIN),我们可以将 SELECT 和 JOIN 语句合并成一个语句。在语句中添加 JOIN 条件,并返回所有满足条件的行。来自不同表的值基于公共列进行合并。公共列通常是第一个表的主键和第二个表的外键。

PostgreSQL 连接类型

有两种类型的连接 PostgreSQL:

  • 内连接
  • 外连接

PostgreSQL 内部联接

内连接有 3 种类型 PostgreSQL:

  • Theta 加入
  • 自然连接
  • 加入EQUI

Theta 加入

西塔连接允许根据西塔表示的条件连接两个表。西塔连接可以与所有比较运算符一起使用。在大多数情况下,西塔连接称为内连接。

θ 连接是最基本的 JOIN 类型。它将返回满足 JOIN 条件的表中的所有行。

语法:

SELECT columns
FROM table-1
INNER JOIN table-2
ON table-1.column = table-2.column;

考虑以下 Demo 数据库的表:

书:

PostgreSQL Theta 加入

价格:

PostgreSQL Theta 加入

我们想要查看每本书的名称以及对应的价格。我们可以运行以下命令:

SELECT Book.name, Price.price
FROM Book
INNER JOIN Price
ON Book.id = Price.id;

这将返回以下内容:

PostgreSQL Theta 加入

只有 3 行满足连接条件。

加入EQUI

EQUI 连接为我们提供了一种基于主键/外键关系连接两个表的方法。例如:

SELECT *
FROM Book
JOIN Price ON Book.id = Price.id;

这将返回以下内容:

PostgreSQL 加入EQUI

根据公共列(即 id 列),两个表都返回了记录。

自然加入

这种类型的连接为我们提供了编写 EQUI 连接的另一种方法。我们可以通过添加 NATURAL 关键字来改进前面的示例,如下所示:

SELECT *
FROM Book
NATURAL JOIN Price;

这将返回以下内容:

PostgreSQL 自然加入

仅返回了一个 id 列。NATURAL JOIN 能够注意到 id 列在两个表中是共同的。仅返回了一个。

PostgreSQL 外连接

外连接有 3 种类型 PostgreSQL:

  • 左外连接
  • 右外连接
  • 完全外部加入

PostgreSQL 左外连接

LEFT OUTER JOIN 将返回左侧表中的所有行,并且仅返回右侧表中满足连接条件的行。

语法:

SELECT columns
FROM table-1
LEFT OUTER JOIN table-2
ON table-1.column = table-2.column;

我们需要查看每本书的名字以及对应的价格,可以运行以下命令:

SELECT Book.name, Price.price
FROM Book
LEFT JOIN Price
ON Book.id = Price.id;

这将返回以下内容:

PostgreSQL 左外连接

Book 表中的所有 4 行都已返回。Price 表中只有 3 行满足连接条件。因此返回了它们。最后一本书没有相应的价格值。

PostgreSQL 右外连接

RIGHT OUTER JOIN 返回右侧表中的所有行以及左侧表中满足连接条件的行。

语法:

SELECT columns
FROM table-1
RIGHT OUTER JOIN table-2
ON table-1.column = table-2.column;

例如:

SELECT Book.name, Price.price
FROM Book
RIGHT JOIN Price
ON Book.id = Price.id;

这将返回以下内容:

PostgreSQL 右外连接

Price 表中的所有行都已返回。Book 表中仅返回了满足连接条件的行。由于未找到匹配项,因此第 3 行的 name 字段没有值。

全外连接 PostgreSQL

这种类型的 JOIN 将返回左侧表中的所有行以及右侧表中的所有不满足连接条件的为空的行。

语法:

SELECT columns
FROM table-1
FULL OUTER JOIN table-2
ON table-1.column = table-2.column;

例如:

SELECT Book.name, Price.price
FROM Book
FULL OUTER JOIN Price
ON Book.id = Price.id;

这将返回以下内容:

PostgreSQL 完全外部加入

所有表的所有行都已返回,其中未找到匹配项的位置为空。

使用 pgAdmin

以上任务可在 pgAdmin 中按如下步骤完成。以下各节将逐步介绍每种加入类型。

pgAdmin 内连接

以下步骤展示了如何在 pgAdmin 中运行每个内部连接变体。

如何使用 Theta 加入 PostgreSQL 使用 pgAdmin

以下是使用 Theta Join 的步骤 PostgreSQL 使用 pgAdmin:

步骤 1)登录你的 pgAdmin 账户

打开 pgAdmin 并使用您的凭据登录

步骤2)创建演示数据库

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 内连接

步骤 3)输入查询

在查询编辑器中输入以下查询:

SELECT Book.name, Price.price
FROM Book
INNER JOIN Price
ON Book.id = Price.id;

步骤4)执行查询

单击执行按钮

pgAdmin 内连接

它应该返回以下内容:

pgAdmin 内连接

加入EQUI

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin EQUI 加入

步骤3) 在查询编辑器中输入查询:

SELECT *
FROM Book
JOIN Price ON Book.id = Price.id;

步骤4) 单击执行按钮。

pgAdmin EQUI 加入

它应该返回以下内容:

pgAdmin EQUI 加入

自然加入

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 自然连接

步骤3) 在查询编辑器中输入查询:

SELECT *
FROM Book
NATURAL JOIN Price;

步骤4) 单击执行按钮。

pgAdmin 自然连接

它应该返回以下内容:

pgAdmin 自然连接

pgAdmin 简单内连接

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 简单内连接

步骤3) 在查询编辑器中输入查询:

SELECT Book.name, Price.price
FROM Book
INNER JOIN Price
ON Book.id = Price.id;

步骤4) 单击执行按钮。

pgAdmin 简单内连接

它应该返回以下内容:

pgAdmin 简单内连接

pgAdmin 外连接

接下来,按照以下步骤在 pgAdmin 中运行三个外连接变体。

左外连接

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 左外连接

步骤3) 在查询编辑器中输入查询:

SELECT Book.name, Price.price
FROM Book
LEFT JOIN Price
ON Book.id = Price.id;

步骤4) 单击执行按钮。

pgAdmin 左外连接

它应该返回以下内容:

pgAdmin 左外连接

右外连接

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 右外连接

步骤3) 在查询编辑器中输入查询:

SELECT Book.name, Price.price
FROM Book
RIGHT JOIN Price
ON Book.id = Price.id;

步骤4) 单击执行按钮。

pgAdmin 右外连接

它应该返回以下内容:

pgAdmin 右外连接

完全外部加入

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  • 从左侧导航栏中单击数据库。
  • 单击“演示”。

pgAdmin 完全外连接

步骤3) 在查询编辑器中输入查询:

SELECT Book.name, Price.price
FROM Book
FULL OUTER JOIN Price
ON Book.id = Price.id;

步骤4) 单击执行按钮。

pgAdmin 完全外连接

它应该返回以下内容:

pgAdmin 完全外连接

下载本教程使用的数据库

常见问题

INNER JOIN 只返回两个表中匹配的行。OUTER JOIN 则保留不匹配的行,并将缺失的列填充为 NULL,并且根据保留哪个表,OUTER JOIN 可以是左连接、右连接或全连接。

JOIN 操作使用匹配的键将不同表中的列并排组合,并加宽每一行。UNION 操作将两个结果集的行垂直堆叠,并且需要相同数量的列。

自连接使用两个表别名将一个表与其自身连接起来。它适用于比较同一表中的行,例如将员工与其存储在同一表中的经理进行匹配。

CROSS JOIN 操作返回笛卡尔积,将第一个表中的每一行与第二个表中的每一行配对。它不使用 ON 条件,因此可以快速生成非常大的结果集。

是的。你可以在一个查询中串联多个 JOIN 子句,每个额外的表都使用另一个 JOIN 和 ON 条件。 PostgreSQL 对它们进行评估,以构建一个单一的综合结果集。

GitHub Copilot 等 AI 助手会建议正确的连接类型,从外键写入 ON 条件,并标记会导致意外笛卡尔积的缺失条件,从而减少常见的连接错误。

是的。AI 助手可以读取查询计划,推荐连接列上的索引,并重写连接顺序或条件。但数据库仍然会强制执行正确性,因此在生产环境中运行任何建议之前,请务必进行审核。

没有哪一种连接方式总是最快的;性能取决于索引、行数和筛选条件。对已建立索引的键执行 INNER JOIN 通常效率很高,而对大型未建立索引的表执行 FULL OUTER JOIN 往往成本最高。

总结一下这篇文章: