PostgreSQL UNION 操作符详解
                           
天天向上
发布: 2025-03-12 23:34:23

原创
169 人浏览过

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;

结果

namedepartment
AliceHR
BobIT
CharlieFinance
DavidHR
EveIT

2. UNION ALL(保留重复数据)

UNION ALLUNION 的区别在于,它 不会去除重复行,合并后所有数据都会保留。

语法

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

示例

SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM managers;

结果

namedepartment
AliceHR
BobIT
CharlieFinance
DavidHR
EveIT

如果 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';

结果

namedepartment
BobIT
EveIT

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;

这样 departmentmanagers 表中会显示 NULL


6. UNION 在子查询中的应用

可以在子查询中使用 UNION 进行数据合并:

SELECT name, department FROM (
    SELECT name, department FROM employees
    UNION
    SELECT name, department FROM managers
) AS combined
WHERE department = 'HR';

结果

namedepartment
AliceHR
DavidHR

7. 总结

操作符作用
UNION合并查询结果并去重
UNION ALL合并查询结果但不去重

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *