union合并多个select结果并自动去重,要求列数相同、类型兼容,ORDER BY/LIMIT仅限最后;UNION ALL不去重、性能更高;列数不同时可用NULL或别名对齐。

在 mysql 中,UNION 是合并多个 SELECT 查询结果的常用方式,它会自动去重并返回一个结果集。如果允许重复行,可用 UNION ALL,性能更高。
UNION 的基本用法和规则
使用 UNION 时,几个 SELECT 必须满足以下条件:
- 列数必须相同
- 对应列的数据类型应兼容(如数字对数字、字符串对字符串)
- 列名以第一个 SELECT 的字段名为准
- ORDER BY 和 LIMIT 只能出现在最后一条 SELECT 后(作用于整个结果)
UNION 和 UNION ALL 的区别
UNION 会对结果自动去重,内部会执行排序和比较操作,开销略大;UNION ALL 直接拼接所有行,不检查重复,速度更快,适合明确不需要去重的场景。
例如:
SELECT name FROM users WHERE status = 1 UNION ALL SELECT name FROM admins WHERE level > 5;
给合并结果统一排序和限制行数
ORDER BY 和 LIMIT 必须写在最后一条 SELECT 之后,且只能出现一次。可配合括号或子查询增强可读性:
(SELECT id, name FROM users) UNION (SELECT id, name FROM guests) ORDER BY name LIMIT 10;
注意:若需按不同字段排序,建议在每个 SELECT 中用别名统一列名,再对外层排序。
处理列数不一致或类型不匹配的情况
如果两个表字段数不同,可通过补 NULL 或常量对齐:
SELECT id, name, email FROM users UNION SELECT id, username AS name, NULL AS email FROM old_users;
MySQL 会尝试隐式转换(如 ‘123’ 转为数字),但强烈建议显式转换或确保类型一致,避免意外截断或报错。