📚 目录

  1. 概述
  2. 基本语法
  3. 使用 UNION 操作符
  4. UNION ALL 操作符
  5. UNIONDISTINCT
  6. 排序与限制
  7. 性能注意事项
  8. 参考资料

🛠️ 概述

在 PostgreSQL 中,UNION 操作符用于将两个或多个 SELECT 查询的结果合并为一个结果集。通过 UNION,你可以将来自多个查询的数据组合在一起。每个查询必须返回相同数量的列,并且这些列的数据类型应当兼容。默认情况下,UNION 会去除重复的行。


📝 基本语法

UNION 的基本语法如下:

SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;

  • column1, column2, ...:两个查询返回的列应该具有相同的顺序和数据类型。
  • table1table2:不同的表,或者同一个表的不同查询。

🔢 使用 UNION 操作符

UNION 合并两个 SELECT 查询的结果,并自动去除重复记录。这对于合并相似数据但不想重复出现的场景非常有用。

示例(合并两个不同部门的员工):

SELECT name, department
FROM employees WHERE department = 'Sales'
UNION
SELECT name, department
FROM employees WHERE department = 'Marketing';

该查询将返回在 SalesMarketing 部门工作的员工的姓名,并且去除重复的记录(如果有相同姓名的员工在两个部门工作,只会显示一次)。


🔢 UNION ALL 操作符

UNION ALLUNION 的变体,它不会去除重复记录,而是返回所有查询的所有结果,包括重复的行。

示例(返回所有员工,不去除重复):

SELECT name, department
FROM employees WHERE department = 'Sales'
UNION ALL
SELECT name, department
FROM employees WHERE department = 'Marketing';

该查询将返回两个部门所有员工的姓名,包括重复的记录。


🔢 UNIONDISTINCT

由于 UNION 会自动去除重复行,因此它实际上相当于在执行查询时应用了 DISTINCT。如果你希望返回结果中包含重复行,则可以使用 UNION ALL

  • UNION:会去除重复行。
  • UNION ALL:不会去除重复行。

🔢 排序与限制

如果你希望对合并后的结果进行排序或限制,可以使用 ORDER BYLIMIT

示例(按姓名排序并限制返回的行数):

SELECT name, department
FROM employees WHERE department = 'Sales'
UNION
SELECT name, department
FROM employees WHERE department = 'Marketing'
ORDER BY name
LIMIT 10;

该查询将合并两个部门的员工名单,按姓名排序,并限制返回前 10 条记录。


🧑‍💻 性能注意事项

  • 重复记录去除UNION 在去除重复记录时可能会带来性能开销,因为它需要对结果集进行排序和去重。如果你不关心重复记录,使用 UNION ALL 可能更高效。
  • 使用索引:对于涉及大量数据的查询,确保相关列上有索引,以提高性能,特别是在涉及 JOINWHEREORDER BY 操作时。
  • 避免不必要的排序UNION 会在去重时自动进行排序,因此在不需要去除重复项的情况下使用 UNION ALL 可以避免额外的排序开销。

📘 参考资料