PostgreSQL Union、Union ALL 示例

⚡ 智能摘要

PostgreSQL UNION 将两个或多个 SELECT 语句的结果合并到一个结果集中,并删除重复的行,而 UNION ALL 保留每一行,当重复项无关紧要时,这是一个更快的选择。

  • 🔗 结合: UNION 将多个 SELECT 语句中的行合并到一个结果集中。
  • 🧹 Duplicates: UNION 删除重复行,而 UNION ALL 保留所有匹配的行。
  • 📐 规则: 每个 SELECT 语句必须返回相同数量的列,且列的数据类型必须兼容。
  • ↕️ 订购者: 最后使用一个 ORDER BY 子句即可对合并后的结果集进行排序。
  • 性能: UNION ALL 运行速度更快,因为它跳过了删除重复项的步骤。
  • 🤖 人工智能帮助: AI 助手对齐列,并在 UNION 和 UNION ALL 之间进行选择。

PostgreSQL UNION 和 UNION ALL

什么是 PostgreSQL 联盟?

此 PostgreSQL UNION 运算符用于将来自多个 SELECT 语句的结果集合并为一个结果集。SELECT 语句结果中的任何重复行都将被删除。UNION 运算符在两种条件下起作用:

  • SELECT 查询必须返回相同数量的列。
  • 所有对应列的数据类型必须兼容。

UNION 运算符通常用于合并尚未完全规范化的相关表中的数据。

句法

SELECT expression_1, expression_2, ... expression_n
FROM tables
[WHERE condition(s)]
UNION
SELECT expression_1, expression_2, ... expression_n
FROM tables
[WHERE condition(s)];

下面对上述参数做一下解释:

expression_1、expression_2、…expression_n 是您需要检索的计算或列。

这些表是您需要从中检索记录的表。

WHERE 条件是检索记录必须满足的条件。

注意: 由于 UNION 运算符不会返回重复项,因此使用 UNION DISTINCT 对结果不会产生任何影响。

PostgreSQL 工会

UNION 运算符会删除重复项,其方式与以下方式相同: 选择DISTINCT 确实如此。让我们来演示一下。我们有一个名为 Demo 的数据库,其中包含以下表格:

书:

PostgreSQL 工会

价格:

PostgreSQL 工会

让我们运行以下命令:

SELECT id
FROM Book
UNION
SELECT id
FROM Price;

该命令将返回以下内容:

PostgreSQL 工会

id 列出现在 Book 和 Price 表中。但是,它在结果中只出现一次。原因是 PostgreSQL UNION 运算符不会返回重复项。

PostgreSQL 联合所有

此运算符组合来自多个 SELECT 语句的结果集而不删除重复项。该运算符要求每个 SELECT 语句在相似数据类型的结果集中具有相似数量的字段。

语法:

SELECT expression_1, expression_2, ... expression_n
FROM tables
[WHERE condition(s)]
UNION ALL
SELECT expression_1, expression_2, ... expression_n
FROM tables
[WHERE condition(s)];

下面对上述参数做一下解释:

expression_1、expression_2、…expression_n 是您需要检索的计算或列。

这些表是您需要从中检索记录的表。

WHERE 条件是检索记录必须满足的条件。

注意: 两个 SELECT 语句必须包含相同数量的表达式。

我们将使用下表:

书:

PostgreSQL 联合所有

价格:

PostgreSQL 联合所有

运行以下命令:

SELECT id
FROM Book
UNION ALL
SELECT id
FROM price;

它应该返回以下内容:

PostgreSQL 联合所有

重复项尚未被删除。

ORDER BY

此 PostgreSQL UNION 运算符可以与 ORDER BY 子句一起使用来对查询结果进行排序。为了演示这一点,我们将使用下表:

价格:

ORDER BY

价格2:

ORDER BY

以下命令演示如何将 UNION 运算符与 ORDER BY 子句一起使用:

SELECT *
FROM Price
UNION
SELECT *
FROM Price2
ORDER BY price;

该命令将返回以下内容:

ORDER BY

记录按价格列排序。该子句默认按升序排列记录。要按降序排列,请添加 DESC 子句,如下所示:

SELECT *
FROM Price
UNION
SELECT *
FROM Price2
ORDER BY price DESC;

该命令将返回以下内容:

ORDER BY

记录已根据价格列按降序排列。

何时使用 Union,何时使用 Union All?

当您有多个结构相似但由于某种原因被拆分的表时,可以使用 UNION 运算符。当您需要删除或消除重复记录时,它非常有用。

当您不需要删除或消除重复记录时,请使用 UNION ALL 运算符。

使用 pgAdmin

现在让我们看看如何使用pgAdmin来执行这三个操作。

使用方法 PostgreSQL 使用 pgAdmin 进行合并

以下是使用方法的详细步骤 PostgreSQL 通过 pgAdmin 进行 UNION 操作:

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

步骤2) 从左侧导航栏中,单击“数据库”,然后单击“演示”。

绝大部分储备使用 PostgreSQL 使用 pgAdmin 进行合并

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

SELECT *
FROM Price
UNION
SELECT *
FROM Price2
ORDER BY price DESC;

步骤4) 单击执行按钮。

绝大部分储备使用 PostgreSQL 使用 pgAdmin 进行合并

它应该返回以下内容:

绝大部分储备使用 PostgreSQL 使用 pgAdmin 进行合并

联合所有

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

步骤2) 从左侧导航栏中,单击“数据库”,然后单击“演示”。

绝大部分储备使用 PostgreSQL 使用 pgAdmin 合并所有

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

SELECT id
FROM Book
UNION ALL
SELECT id
FROM price;

步骤4) 单击执行按钮。

绝大部分储备使用 PostgreSQL 使用 pgAdmin 合并所有

它应该返回以下内容:

绝大部分储备使用 PostgreSQL 使用 pgAdmin 合并所有

ORDER BY

UNION ALL 运算符可以与 ORDER BY 子句结合使用,对结果集中的结果进行排序。例如:

SELECT id
FROM Book
UNION ALL
SELECT id
FROM price
ORDER BY id;

该命令将返回以下内容:

绝大部分储备使用 PostgreSQL 使用 pgAdmin 进行排序

结果已排序。

下载本教程使用的数据库

常见问题

UNION ALL 速度更快,因为它只是简单地连接行。而 UNION 必须对合并后的行进行排序或哈希处理以去除重复项,这会增加额外的开销。当重复项无关紧要时,UNION ALL 是更高效的选择。

是的。UNION 中的每个 SELECT 语句必须返回相同数量的列,并且匹配的列必须具有兼容的数据类型和相同的顺序。否则 PostgreSQL 出现错误,查询失败。

是的。列名可以不同,因为 UNION 操作是按位置而不是名称匹配列。数据类型必须兼容,结果集使用第一个 SELECT 语句中的列名。

UNION 操作将两个结果集的行垂直堆叠成一个列列表,并删除重复项。JOIN 操作则基于关联键水平合并不同表中的列,因此它会加宽行而不是追加行。

ORDER BY 会对最终的合并结果进行排序,因此 PostgreSQL 只允许在最后一个 SELECT 语句之后放置一个 ORDER BY 子句。一旦将各个查询的行合并在一起,先对它们进行排序就毫无意义了。

GitHub Copilot 等 AI 助手可以对齐每个 SELECT 语句的列列表,标记不匹配的数据类型,并根据是否应保留重复项来推荐 UNION 或 UNION ALL,从而减少常见的查询错误。

是的。通过检查您的表格和目标,AI 助手可以判断重复行是否可能且有意义,然后在可以接受重复行以提高速度时建议使用 UNION ALL,在必须删除重复行时建议使用 UNION。

UNION 函数返回两个查询中都存在的行。INTERSECT 函数仅返回两个查询中都存在的行,而 EXCEPT 函数仅返回第一个查询中存在的行。这三个函数默认都会删除重复项。

总结一下这篇文章: