📚 目录
🛠️ 概述
在 PostgreSQL 中,UNION
操作符用于将两个或多个 SELECT
查询的结果合并为一个结果集。通过 UNION
,你可以将来自多个查询的数据组合在一起。每个查询必须返回相同数量的列,并且这些列的数据类型应当兼容。默认情况下,UNION
会去除重复的行。
📝 基本语法
UNION
的基本语法如下:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
column1, column2, ...
:两个查询返回的列应该具有相同的顺序和数据类型。table1
、table2
:不同的表,或者同一个表的不同查询。
🔢 使用 UNION
操作符
UNION
合并两个 SELECT
查询的结果,并自动去除重复记录。这对于合并相似数据但不想重复出现的场景非常有用。
示例(合并两个不同部门的员工):
SELECT name, department
FROM employees WHERE department = 'Sales'
UNION
SELECT name, department
FROM employees WHERE department = 'Marketing';
该查询将返回在 Sales
和 Marketing
部门工作的员工的姓名,并且去除重复的记录(如果有相同姓名的员工在两个部门工作,只会显示一次)。
🔢 UNION ALL
操作符
UNION ALL
是 UNION
的变体,它不会去除重复记录,而是返回所有查询的所有结果,包括重复的行。
示例(返回所有员工,不去除重复):
SELECT name, department
FROM employees WHERE department = 'Sales'
UNION ALL
SELECT name, department
FROM employees WHERE department = 'Marketing';
该查询将返回两个部门所有员工的姓名,包括重复的记录。
🔢 UNION
与 DISTINCT
由于 UNION
会自动去除重复行,因此它实际上相当于在执行查询时应用了 DISTINCT
。如果你希望返回结果中包含重复行,则可以使用 UNION ALL
。
UNION
:会去除重复行。UNION ALL
:不会去除重复行。
🔢 排序与限制
如果你希望对合并后的结果进行排序或限制,可以使用 ORDER BY
或 LIMIT
。
示例(按姓名排序并限制返回的行数):
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
可能更高效。 - 使用索引:对于涉及大量数据的查询,确保相关列上有索引,以提高性能,特别是在涉及
JOIN
、WHERE
或ORDER BY
操作时。 - 避免不必要的排序:
UNION
会在去重时自动进行排序,因此在不需要去除重复项的情况下使用UNION ALL
可以避免额外的排序开销。
📘 参考资料
- PostgreSQL 官方文档:UNION
- 更多 PostgreSQL 查询技巧整理自:www.52kanjuqing.com
发表回复