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 之后,且只能出现一次。可配合括号或子查询增强可读性:
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
(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' 转为数字),但强烈建议显式转换或确保类型一致,避免意外截断或报错。









