UNION 操作符用于合并两个或多个 SELECT 语句的结果集。合并后的结果集中将包含所有 SELECT 语句的结果,每行数据只会出现一次(默认去重)。如果希望包含重复行,可以使用 UNION ALL。
UNION 基本使用
UNION 操作符的基本语法如下:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
需要注意的是,所有 SELECT 语句的列数和数据类型必须相同。
示例数据库和表结构
假设我们有两个表:employees_2022 和 employees_2023,分别存储2022年和2023年的员工数据。
CREATE DATABASE company_data;
USE company_data;
-- 创建表 employees_2022
CREATE TABLE employees_2022 (
emp_id INT,
emp_name VARCHAR(100),
emp_position VARCHAR(100),
emp_salary DECIMAL(10, 2)
);
-- 创建表 employees_2023
CREATE TABLE employees_2023 (
emp_id INT,
emp_name VARCHAR(100),
emp_position VARCHAR(100),
emp_salary DECIMAL(10, 2)
);
-- 插入示例数据到 employees_2022 表
INSERT INTO employees_2022 (emp_id, emp_name, emp_position, emp_salary)
VALUES
(1, 'John Doe', 'Manager', 75000.00),
(2, 'Jane Smith', 'Developer', 60000.00),
(3, 'Alice Johnson', 'Analyst', 50000.00);
-- 插入示例数据到 employees_2023 表
INSERT INTO employees_2023 (emp_id, emp_name, emp_position, emp_salary)
VALUES
(4, 'Bob Brown', 'Developer', 70000.00),
(5, 'Charlie Brown', 'Tester', 55000.00),
(6, 'Emma White', 'Developer', 60000.00);
1. 使用 UNION 合并结果集
假设我们希望合并 employees_2022 和 employees_2023 表的数据。
SELECT emp_id, emp_name, emp_position, emp_salary
FROM employees_2022
UNION
SELECT emp_id, emp_name, emp_position, emp_salary
FROM employees_2023;
结果:
emp_id | emp_name | emp_position | emp_salary
-------|---------------|--------------|-----------
1 | John Doe | Manager | 75000.00
2 | Jane Smith | Developer | 60000.00
3 | Alice Johnson | Analyst | 50000.00
4 | Bob Brown | Developer | 70000.00
5 | Charlie Brown | Tester | 55000.00
6 | Emma White | Developer | 60000.00
在这里,UNION 默认去除了重复的行(如果有)。
2. 使用 UNION ALL 合并结果集(保留重复)
如果我们希望保留重复的行,可以使用 UNION ALL。
SELECT emp_id, emp_name, emp_position, emp_salary
FROM employees_2022
UNION ALL
SELECT emp_id, emp_name, emp_position, emp_salary
FROM employees_2023;
结果与前一个查询相同,因为在这个例子中没有重复的行。但如果有重复行,UNION ALL 将保留这些行。
3. 使用 UNION 合并不同表的特定列
假设我们有两个表:departments_2022 和 departments_2023,分别存储不同年份的部门信息。
CREATE TABLE departments_2022 (
dept_id INT,
dept_name VARCHAR(100),
budget DECIMAL(10, 2)
);
CREATE TABLE departments_2023 (
dept_id INT,
dept_name VARCHAR(100),
budget DECIMAL(10, 2)
);
-- 插入示例数据到 departments_2022 表
INSERT INTO departments_2022 (dept_id, dept_name, budget)
VALUES
(1, 'HR', 500000.00),
(2, 'Engineering', 1200000.00);
-- 插入示例数据到 departments_2023 表
INSERT INTO departments_2023 (dept_id, dept_name, budget)
VALUES
(3, 'Marketing', 700000.00),
(4, 'Sales', 800000.00);
我们希望合并这两个表的数据,仅包含 dept_name 和 budget 列。
SELECT dept_name, budget
FROM departments_2022
UNION
SELECT dept_name, budget
FROM departments_2023;
结果:
dept_name | budget
------------|---------
HR | 500000.00
Engineering | 1200000.00
Marketing | 700000.00
Sales | 800000.00
4. 使用 UNION 进行复杂查询
假设我们要从 employees_2022 和 employees_2023 表中合并数据,并且希望同时展示每个员工的年度信息。
SELECT emp_id, emp_name, emp_position, emp_salary, '2022' AS year
FROM employees_2022
UNION
SELECT emp_id, emp_name, emp_position, emp_salary, '2023' AS year
FROM employees_2023;
结果:
emp_id | emp_name | emp_position | emp_salary | year
-------|---------------|--------------|------------|------
1 | John Doe | Manager | 75000.00 | 2022
2 | Jane Smith | Developer | 60000.00 | 2022
3 | Alice Johnson | Analyst | 50000.00 | 2022
4 | Bob Brown | Developer | 70000.00 | 2023
5 | Charlie Brown | Tester | 55000.00 | 2023
6 | Emma White | Developer | 60000.00 | 2023
小结
UNION 和 UNION ALL 操作符非常实用,可以合并多个 SELECT 语句的结果集。UNION 默认去重,而 UNION ALL 保留所有结果。通过这些操作符,可以实现数据的横向合并,适用于多种数据分析和报告需求。上述示例展示了如何在不同情况下使用 UNION 和 UNION ALL,以实现数据的高效合并和展示。