0

0

mysql如何使用union合并查询_mysql联合查询技巧

P粉602998670

P粉602998670

发布时间:2026-03-11 12:21:11

|

393人浏览过

|

来源于php中文网

原创

union 默认去重并隐式排序,需用 union all 保留重复行且提升性能;列数、类型须严格一致,排序和 limit 只能作用于最终结果。

mysql如何使用union合并查询_mysql联合查询技巧

UNION 会自动去重,要保留重复行得用 UNION ALL

很多人写 UNION 是为了拼接两个结果集,但发现最终行数变少了——这是因为 UNION 默认执行去重(等价于 UNION DISTINCT)。如果两个查询里有相同结构的重复记录,它们会被合并成一条。

真正需要“叠加”数据时(比如日志表分月归档、多租户数据汇总),必须显式写成 UNION ALL。它不比较重复、不排序、不建临时表,性能也明显更好。

  • UNION:隐式加 DISTINCT + 隐式 ORDER BY(按第一列升序),实际执行会建临时表并排序
  • UNION ALL:纯追加,零额外开销,适合大数据量拼接
  • MySQL 8.0+ 对 UNION 的去重逻辑更严格,遇到 NULL 或浮点精度差异也可能被判定为“不同”,但行为仍不如 UNION ALL 可控

列数、类型和顺序必须严格一致,否则报错 1222

执行 UNION 时 MySQL 不看字段名,只校验「列数」和「对应位置的表达式类型兼容性」。常见报错 ERROR 1222 (21S01): The used SELECT statements have a different number of columns 就是列数不匹配。

类型不兼容也会出问题:比如左边是 INT,右边是 VARCHAR,MySQL 会尝试隐式转换,但若转换失败(如 'abc'INT)或精度丢失(如 DECIMAL(10,2)DECIMAL(5,0) 拼接),可能返回截断值或警告。

  • 所有 SELECT 子句必须有相同数量的列,不能靠 SELECT * 蒙混——表结构稍有变动就崩
  • 建议显式写出字段,用 CAST()CONVERT() 统一类型,例如:CAST(create_time AS DATE)
  • 列别名以第一个 SELECT 的为准,后续子句的别名会被忽略

排序和限制只能加在最后,不能每个子句单独加 ORDER BY / LIMIT

UNION 是集合操作,整个结果是一个新结果集。你不能在每个 SELECT 后面加 ORDER BYLIMIT,MySQL 会直接报语法错误(除非用括号包成派生表)。

白月生产企业订单管理系统GBK2.0  Build 080807
白月生产企业订单管理系统GBK2.0 Build 080807

请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在

下载

如果真要对某一部分先取 top N 再合并,得用子查询包装:(SELECT ... ORDER BY x LIMIT 10) UNION ALL (SELECT ... ORDER BY y LIMIT 10)。但注意:子查询里的 ORDER BY 在没有 LIMIT 时无效,MySQL 5.7+ 会警告;有 LIMIT 才真正生效。

  • 全局排序必须放在整个 UNION 语句末尾,例如:... UNION ALL ... ORDER BY id DESC
  • 想按不同逻辑分别排序再合并?不行。得用应用层处理,或改用 JOIN + 条件标记
  • LIMIT 放在末尾只限制最终结果行数,不是每个分支的限制

性能差?检查是否误用了 UNION 而非 JOIN,或没加索引

UNION 本身不慢,慢往往是因为:① 用了 UNION 去替代本该用 JOIN 的关联场景;② 每个子查询都没走索引,导致全表扫描多次;③ UNION 后还要 ORDER BY + LIMIT,触发文件排序(Using filesort)甚至磁盘临时表。

EXPLAIN 看执行计划时,每个 SELECT 都会单独出现一行,type 为 ALL 就说明没走索引;Extra 出现 Using temporary; Using filesort 就是性能瓶颈信号。

  • 两个表有主外键关系?优先考虑 LEFT JOIN,不是 UNION
  • 子查询涉及大表,确保 WHERE 条件字段上有索引,尤其注意函数索引失效问题(如 YEAR(create_time) = 2024
  • MySQL 8.0+ 支持 CTE,复杂拼接可先用 WITH 定义中间结果,提升可读性和优化器判断能力

UNION 的边界很清晰:它只负责横向拼接,不关联、不过滤、不计算关系。一旦开始纠结“怎么让左边排好序再和右边拼”“为什么 LIMIT 不生效”,基本说明用错了场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

666

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 846人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号