PostgreSQL UNION 操作符详解

PostgreSQL UNION
操作符用于合并两个或多个 SELECT
查询的结果集,去除重复行,并返回一个新的结果集。它用于从多个表或查询中整合数据。
1. UNION 的基本用法
语法
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
注意:
UNION
默认会 去除重复数据。- 每个
SELECT
语句的列数和数据类型必须匹配。
示例
假设有两个表:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50)
);
CREATE TABLE managers (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50)
);
插入数据:
INSERT INTO employees (name, department) VALUES
('Alice', 'HR'), ('Bob', 'IT'), ('Charlie', 'Finance');
INSERT INTO managers (name, department) VALUES
('David', 'HR'), ('Eve', 'IT');
执行 UNION
:
SELECT name, department FROM employees
UNION
SELECT name, department FROM managers;
结果:
name | department |
---|---|
Alice | HR |
Bob | IT |
Charlie | Finance |
David | HR |
Eve | IT |
2. UNION ALL(保留重复数据)
UNION ALL
和 UNION
的区别在于,它 不会去除重复行,合并后所有数据都会保留。
语法
SELECT column1, column2, ... FROM table1
UNION ALL
SELECT column1, column2, ... FROM table2;
示例
SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM managers;
结果:
name | department |
---|---|
Alice | HR |
Bob | IT |
Charlie | Finance |
David | HR |
Eve | IT |
如果 employees
表中也有 David
,那么 UNION
会去重,而 UNION ALL
会保留多个 David
。
3. UNION 的排序
可以使用 ORDER BY
对最终合并的数据进行排序:
SELECT name, department FROM employees
UNION
SELECT name, department FROM managers
ORDER BY name ASC;
4. UNION 在 WHERE 过滤条件中的应用
可以使用 WHERE
语句在合并数据前进行筛选:
SELECT name, department FROM employees WHERE department = 'IT'
UNION
SELECT name, department FROM managers WHERE department = 'IT';
结果:
name | department |
---|---|
Bob | IT |
Eve | IT |
5. UNION 与不同数据列数
UNION
操作的 SELECT
语句必须有相同的列数,如果不匹配,则会报错。例如:
SELECT name, department FROM employees
UNION
SELECT name FROM managers; -- 错误:列数不匹配
如果想要合并不同列数的数据,可以使用 NULL
作为占位符:
SELECT name, department FROM employees
UNION
SELECT name, NULL FROM managers;
这样 department
在 managers
表中会显示 NULL
。
6. UNION 在子查询中的应用
可以在子查询中使用 UNION
进行数据合并:
SELECT name, department FROM (
SELECT name, department FROM employees
UNION
SELECT name, department FROM managers
) AS combined
WHERE department = 'HR';
结果:
name | department |
---|---|
Alice | HR |
David | HR |
7. 总结
操作符 | 作用 |
---|---|
UNION | 合并查询结果并去重 |
UNION ALL | 合并查询结果但不去重 |
更多详细内容请关注其他相关文章!