UNION用于合并多个SELECT查询结果,默认去重;UNIONALL保留重复行且性能更优。使用要求各SELECT列数相同、对应列数据类型兼容,结果列名取第一个查询。ORDERBY对整体结果排序,与JOIN的区别在于UNION上下拼接、JOIN左右关联。
数据库查询中,UNION 是一个常用的关键字,其核心功能是将多个 SELECT 查询的结果集合并在一起。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
在实际应用中,一个容易让人混淆的概念是 UNION 与 JOIN 的区别。简单概括:
UNION 将结果上下拼接JOIN 将表数据左右关联接下来,我们将详细解析 UNION 的用法。
UNION 用于合并两个或多个 SELECT 语句的查询结果。基本语法如下:
SELECT 列1, 列2 FROM 表AUNIONSELECT 列1, 列2 FROM 表B;
例如:
SELECT name, phone FROM customersUNIONSELECT name, phone FROM suppliers;
这条 SQL 的含义是:从 customers 表取出 name 和 phone,再从 suppliers 表取出相同字段,然后将两组结果合并返回。
在 MySQL 中,UNION 默认会去除重复的数据行。
例如:
SELECT 1 AS idUNIONSELECT 1 AS id;
查询结果如下:
id--1
虽然两次查询都返回了 1,但最终结果只保留了一行。换句话说,UNION 等同于 UNION DISTINCT,去重是其默认行为。
如果需要保留所有查询结果(包括重复数据),应使用 UNION ALL。
示例:
SELECT 1 AS idUNION ALLSELECT 1 AS id;
查询结果:
id
--
此次两条重复的 1 都会出现。
从实际开发角度看,如果数据本身不会重复,或者业务允许重复,建议优先使用 UNION ALL。因为去重操作需要额外开销,UNION ALL 跳过该步骤,性能通常优于 UNION。
使用 UNION 时,需遵守以下基本规则。
正确写法:
SELECT id, name FROM usersUNIONSELECT id, name FROM admins;
错误写法:
SELECT id, name FROM usersUNIONSELECT id FROM admins;
第一种返回两列,第二种只返回一列,列数不一致会导致 MySQL 拒绝执行。
例如:
SELECT id, name FROM usersUNIONSELECT id, title FROM articles;
语法上可能通过,因为两个查询都返回两列。但从业务语义看,第二列分别为用户名 name 和文章标题 title,含义不同。因此,使用 UNION 时,不仅列数要对齐,对应列的数据含义也应尽量一致。
例如:
SELECT id AS user_id, name AS user_name FROM usersUNIONSELECT id AS admin_id, name AS admin_name FROM admins;
最终返回的列名为:
user_id | user_name
而非:
admin_id | admin_name
即,UNION 结果集的字段名由第一个 SELECT 决定。
如需对合并后的最终结果排序,将 ORDER BY 写在最后即可。
示例:
SELECT id, name FROM usersUNION ALLSELECT id, name FROM adminsORDER BY id DESC;
此处的 ORDER BY id DESC 是对两个查询合并后的整体结果排序。
若需求更复杂,例如每个查询内部先排序或限定行数,需使用括号:
(SELECT id, name FROM users ORDER BY id DESC LIMIT 10)UNION ALL(SELECT id, name FROM admins ORDER BY id DESC LIMIT 10)ORDER BY id DESC;
这条 SQL 的含义为:
users 表取出 id 最大的 10 条数据;admins 表取出 id 最大的 10 条数据;id 倒序整体排序。假设有两张学生表:
students_2024students_2025
需要将两个年份的学生数据合并查询,可以这样写:
SELECT id, name, '2024' AS year FROM students_2024UNION ALLSELECT id, name, '2025' AS year FROM students_2025;
这里添加了固定字段,分别标注 '2024' AS year 和 '2025' AS year,使每行数据的来源年份清晰可辨。
查询结果大致如下:
id | name | year
---|------|------
1 | 张三 | 2024
2 | 李四 | 2024
1 | 王五 | 2025
2 | 赵六 | 2025
这种写法在分表查询、历史数据合并、报表统计中十分常见。
许多初学者容易混淆 UNION 和 JOIN,两者其实很容易区分。
SELECT name FROM customersUNIONSELECT name FROM suppliers;
可以理解为:
customers 查询结果
+
suppliers 查询结果
即将多批结果简单堆叠,生成更多行。
SELECT orders.id, users.nameFROM ordersJOIN users ON orders.user_id = users.id;
可以理解为:
订单信息 + 用户信息
根据关联条件,将多张表的数据拼接到同一行中。
一句话总结:UNION 是垂直拼接,JOIN 是水平关联。
选择并不复杂:
需要去重时使用 UNION:
UNION
不需要去重时使用 UNION ALL:
UNION ALL
在实际项目中,UNION ALL 的使用频率往往更高,因为它跳过去重步骤,性能更佳。只有在系统确实需要过滤重复数据时,才使用 UNION。
本文梳理了 MySQL 中 UNION 的用法,核心要点如下:
UNION 用于合并多个 SELECT 查询结果;UNION 默认去除重复行;UNION ALL 不去重,性能通常更好;SELECT 的列数必须一致;SELECT 决定;ORDER BY 写在最后时,对整体结果排序;UNION 是上下拼接,JOIN 是左右关联。一句话记忆:
UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述