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 | 合并查询结果但不去重 |
更多详细内容请关注其他相关文章!