Skip to content

联合查询


联合查询(UNION / UNION ALL) 用于将多个查询结果纵向合并成一个结果集。
不同于 JOIN(横向拼接字段),UNION纵向拼接行,常用于查询结构相同但数据来源不同的表。

SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;

两个查询的字段数、字段类型、顺序必须一致

关键字功能是否去重性能
UNION合并结果集✅ 去重较慢
UNION ALL合并结果集❌ 不去重较快

示例:

SELECT name, city FROM user_a
UNION
SELECT name, city FROM user_b;

UNION 会自动去掉重复行。

SELECT name, city FROM user_a
UNION ALL
SELECT name, city FROM user_b;

UNION ALL 会保留重复行,更适合大数据量。

假设公司有两张员工表(来自不同系统):

表名字段说明
emp_2023name, dept旧系统
emp_2024name, dept新系统

我们希望合并所有员工数据:

SELECT name, dept FROM emp_2023
UNION ALL
SELECT name, dept FROM emp_2024;

结果:

namedept
张三技术部
李四行政部
王五技术部
张三技术部

若希望去重,可改为 UNION

  • 多表结构一致时的数据整合;
  • 多分区或多时间段表的合并(如 log_2024_01, log_2024_02);
  • 数据迁移或备份前的合并统计;
  • 模拟 FULL OUTER JOIN(MySQL 无原生支持):
SELECT * FROM 表1
LEFT JOIN 表2 ON 表1.id = 表2.id
UNION
SELECT * FROM 表1
RIGHT JOIN 表2 ON 表1.id = 表2.id;
  • 各子查询的列名、类型、数量必须一致;
  • ORDER BY 只能出现在最后一个查询之后;
  • 若需为列起别名,应放在第一个查询中;
  • UNION 默认去重,性能略低,可根据需求使用 UNION ALL