MySQL(34)如何使用UNION合并查询结果?

190 阅读3分钟

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。合并后的结果集中将包含所有 SELECT 语句的结果,每行数据只会出现一次(默认去重)。如果希望包含重复行,可以使用 UNION ALL

UNION 基本使用

UNION 操作符的基本语法如下:

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

需要注意的是,所有 SELECT 语句的列数和数据类型必须相同。

示例数据库和表结构

假设我们有两个表:employees_2022employees_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_2022employees_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_2022departments_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_namebudget 列。

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_2022employees_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

小结

UNIONUNION ALL 操作符非常实用,可以合并多个 SELECT 语句的结果集。UNION 默认去重,而 UNION ALL 保留所有结果。通过这些操作符,可以实现数据的横向合并,适用于多种数据分析和报告需求。上述示例展示了如何在不同情况下使用 UNIONUNION ALL,以实现数据的高效合并和展示。