MySQL UNION – 完整教程
⚡ 智能摘要
MySQL UNION 函数将两个或多个 SELECT 查询的结果合并成一个统一的结果集。本文将解释 UNION 函数有效的列规则、UNION DISTINCT 和 UNION ALL 之间的区别,以及针对 myflixdb 数据库运行的示例。

什么是工会? MySQL?
UNION 是一个意念波· MySQL 该运算符将多个 SELECT 查询的结果合并到一个统一的结果集中。第二个查询返回的行位于第一个查询返回的行下方,从而生成一个垂直列表,而不是两个独立的列表。
要实现这一点,唯一的要求是所有需要合并的 SELECT 查询的列数必须相同。
假设我们有两个表格,如下所示。
这两个表都包含两个相同类型的列,因此它们符合合并的条件。以下示例正是将这两个表合并在一起。
为什么要使用 UNION?
假设你的数据库设计存在缺陷,并且你使用了两个用途相同的表。你想将这两个表合并成一个表,同时删除重复记录。ping 将结果导入新表中。在这种情况下,您可以使用 UNION 运算符。
该运算符在日常报告工作中也很有用:
- Archived 和实时数据: 当前表和存档表如果共享相同的列,则可以一起生成报表,而无需将它们物理合并。
- 多方消息,同一份报告: 会员和电影,或者来自两个地区的销售情况,都可以列在一份输出文件中,以便快速审核。
- 迁移检查: 可以在删除旧表之前,将旧表和新表中的行堆叠起来进行比较。
联合操作不能替代连接操作。联合操作是在行的下方添加行,而连接操作是在列的旁边添加列,这种区别决定了任务需要使用哪个运算符。
MySQL UNION 语法和规则
既然目的已经明确,那就来看看语句的结构以及数据库强制执行的规则。
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
所有工会都遵循三条规则:
- 列数相等。 每 选择语句 必须返回相同数量的列,否则 MySQL 引发错误 1222。
- 兼容的数据类型,顺序相同。 第一个查询的第一列与第二个查询的第一列匹配,所以数字应该与数字匹配,文本应该与文本匹配。
- 名称来自第一次查询。 结果集的标题取自第一个 SELECT 语句,因此任何别名都应位于此处。
An ORDER BY 或者 LIMIT 放在末尾的子句适用于合并后的结果,而不是其中的一个分支,并且必须引用第一个 SELECT 语句生成的列名。
独立联盟 vs 全部联盟
规则制定完毕,剩下的决定就是重复行是否应该保留。
使用 DISTINCT 合并表
现在让我们创建一个 UNION 查询,使用 DISTINCT 将两个表合并起来。
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
这里删除了重复的行并仅返回唯一的行。
注意: MySQL 如果未指定任何内容,则执行 UNION 查询时默认使用 DISTINCT 子句。
使用 ALL 合并表格
现在让我们创建一个 UNION 查询,使用 ALL 将两个表合并起来。
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
由于我们使用 ALL,因此这里包含了重复的行。
这两张图片可以很容易地看出区别,下表对此进行了总结。
| 比较点 | 联合不同 | UNION ALL |
|---|---|---|
| 重复行 | 从结果中移除 | 保留在结果中 |
| 默认行为 | 是的,当未作任何指定时适用。 | 不,必须写出关键词 ALL。 |
| 速度 | 速度较慢,需要进行一次去重处理。 | 速度更快,读取行时立即返回。 |
| 最佳使用时机 | 合并后的列表必须包含唯一行。 | 每一行都很重要,否则不会出现重复项。 |
💡提示: 如果两个分支不会产生重复行,请选择 UNION ALL。这样数据库就会跳过 DISTINCT 所需的排序和比较工作,这对于大型表来说可以显著节省资源。
实际应用示例 MySQL 工作台
到目前为止,示例都使用了示例表。现在,同样的查询将针对真实的 myflixdb 数据库运行,这两个表包含的记录截然不同。
在我们的 myFlixDB 中,让我们合并 membership_number 和 full_names 来自成员表的列 movie_id 和 title 来自 movies 表的列。两个查询都返回两列,因此联合查询有效。
我们可以使用以下查询。
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
在以下位置执行上述脚本 MySQL 工作台 对 myflixdb 数据库进行查询,得到如下所示的结果。请注意,标题来自第一个 SELECT 语句,即使下面的行是电影记录。
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |




