mysql中union关键字的实现示例

 更新时间:2026年02月04日 10:02:27   作者:哈里谢顿  
本文主要介绍了mysql中的union关键字详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MySQL 的 UNION 用于合并两个或多个 SELECT 语句的结果集,并自动去除重复行(相当于对结果集执行 DISTINCT)。

1. 基本语法与核心规则

SELECT column1, column2 FROM table1
UNION [ALL | DISTINCT]
SELECT column1, column2 FROM table2;

强制性规则

  • 列数必须相同:两个 SELECT 返回的列数必须一致
  • 数据类型兼容:对应位置的列类型不必完全相同,但必须可隐式转换(如 INT 和 DECIMAL)
  • 列名继承:结果集的列名取自第一个 SELECT 语句
  • ORDER BY 位置:只能放在最后一个 SELECT 之后,且排序依据必须是第一个 SELECT 的列名或别名

2. UNION vs UNION ALL

特性UNION (DISTINCT)UNION ALL
去重自动去重,行唯一保留所有行,包括重复
性能需要临时表+哈希排序去重,较慢直接追加结果,极快
使用场景必须确保唯一性时确定无重复或需要保留重复时

性能建议:除非业务需要去重,否则优先使用 UNION ALL。去重操作需要创建临时表、哈希比较和额外排序,大数据量时性能差距巨大。

3. 实际应用场景

场景 A:合并相似结构表(如分表)

-- 查询 2023 和 2024 年的订单(假设按年分表)
SELECT order_id, amount, created_at FROM orders_2023
UNION ALL
SELECT order_id, amount, created_at FROM orders_2024
ORDER BY created_at DESC
LIMIT 20;

场景 B:多维度统计报表

SELECT 'VIP用户' as user_type, COUNT(*) as cnt FROM users WHERE level >= 8
UNION ALL
SELECT '普通用户', COUNT(*) FROM users WHERE level BETWEEN 1 AND 7
UNION ALL
SELECT '访客', COUNT(*) FROM users WHERE level = 0;

场景 C:数据补全与兜底查询

-- 先查缓存表,若无结果再查主表(常见于配置表)
SELECT config_value FROM config_cache WHERE config_key = 'site_name'
UNION ALL
SELECT config_value FROM config WHERE config_key = 'site_name'
LIMIT 1;

4. 进阶用法

带排序和分页

(SELECT id, name FROM products WHERE category = 'A' ORDER BY price DESC LIMIT 10)
UNION ALL
(SELECT id, name FROM products WHERE category = 'B' ORDER BY price DESC LIMIT 10)
ORDER BY price DESC LIMIT 10;

注意:子查询中的 ORDER BY 必须配合 LIMIT 才生效,否则会被优化器忽略。

混合聚合与明细

SELECT city, sales_amount, NULL as detail FROM sales_summary
UNION ALL
SELECT city, amount, CONCAT(product_name, ':', quantity) FROM sales_detail;

5. 性能优化要点

  1. 索引利用:每个 SELECT 独立使用索引,UNION 本身不走索引
  2. 减少数据集:在子查询中先 WHERE 过滤,避免传递大量数据到 UNION 层
  3. 避免临时表写入UNION DISTINCT 会创建内存临时表(或磁盘临时表,若过大),可通过 SET tmp_table_size 调优
  4. 并行执行:MySQL 8.0.19+ 对非相关子查询的 UNION 可能启用并行查询

6. 常见陷阱

-- ❌ 错误:列数不匹配
SELECT id, name FROM t1
UNION
SELECT id FROM t2;  -- ERROR 1222

-- ❌ 错误:ORDER BY 位置错误
SELECT * FROM t1 ORDER BY id
UNION
SELECT * FROM t2;  -- ERROR 1221

-- ✅ 正确写法
SELECT * FROM t1
UNION
SELECT * FROM t2
ORDER BY id;  -- 使用第一个 SELECT 的列名排序

7. Django ORM 中的 UNION

如果你在使用 Django(看你之前关注过 Django 源码),可以这样使用:

from django.db.models import Q

# QuerySet.union() 默认使用 UNION ALL
qs1 = User.objects.filter(status='active').values('name', 'email')
qs2 = User.objects.filter(is_staff=True).values('name', 'email')

# UNION ALL
combined = qs1.union(qs2, all=True)

# UNION (去重)
combined_distinct = qs1.union(qs2)  # 或 all=False

注意:Django 的 union() 会强制转换为 SQL 的 UNION,且 QuerySet 被求值后返回的是列表而非 QuerySet,无法继续链式过滤。

总结UNION ALL 是合并结果集的高性能首选,UNION (DISTINCT) 仅在需要去重时使用。始终确保子查询列数一致,并在应用层处理复杂的排序逻辑。

到此这篇关于mysql中union关键字的实现示例的文章就介绍到这了,更多相关mysql union关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql 5.7从节点配置多线程主从复制的方法详解

    Mysql 5.7从节点配置多线程主从复制的方法详解

    这篇文章主要介绍了Mysql 5.7从节点配置多线程主从复制的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 解析MySQL中INSERT INTO SELECT的使用

    解析MySQL中INSERT INTO SELECT的使用

    本篇文章是对MySQL中INSERT INTO SELECT的使用进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • mysql中的int(10)int(20)分别代表什么意思

    mysql中的int(10)int(20)分别代表什么意思

    这篇文章主要介绍了mysql中的int(10)int(20)分别代表什么意思,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • mysql实用操作之日期格式化例子

    mysql实用操作之日期格式化例子

    这篇文章主要给大家介绍了关于mysql实用操作之日期格式化的相关资料,DATE_FORMAT()函数用于格式化MySQL中的日期和时间字段,支持多种格式化选项,需要的朋友可以参考下
    2024-11-11
  • phpmyadmin出现#2003服务器无响应解决方法小结

    phpmyadmin出现#2003服务器无响应解决方法小结

    出现登陆phpmyadmin出现 #2003 - 服务器没有响应最先想到的是你的mysql服务器是不是停止了检查一下,如果是mysql服务器停止服务了重启就可以解决问题了
    2012-04-04
  • MySQL和PolarDB的相同点及不同点解读

    MySQL和PolarDB的相同点及不同点解读

    这篇文章主要介绍了MySQL和PolarDB的相同点及不同点,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • mysql下mysql-udf-http效率测试小记

    mysql下mysql-udf-http效率测试小记

    看到张宴的博客上关于"http/rest客户端的文章",怎样安装啥的直接都跳过,下面直接进入测试阶段。
    2011-08-08
  • VSCODE连接MySQL数据库服务图文教程

    VSCODE连接MySQL数据库服务图文教程

    最近做网页碰到连接数据库的问题,上网查了挺久终于搞明白了,下面这篇文章主要给大家介绍了关于VSCODE连接MySQL数据库服务的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySL实现如等级成色等特殊顺序的排序详解

    MySL实现如等级成色等特殊顺序的排序详解

    这篇文章主要为大家介绍了MySL实现如等级成色等特殊顺序的排序详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • MySQL远程无法连接的一些常见原因总结

    MySQL远程无法连接的一些常见原因总结

    有的小伙伴发现自己的mysql无法正常连接远程服务器,下面这篇文章主要给大家介绍了关于MySQL远程无法连接的一些常见原因,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论