MySQL UNION – 完整教程

⚡ 智能摘要

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

  • 🔗 核心宗旨: UNION 将多个 SELECT 查询返回的行堆叠到一个结果集中,一个查询在另一个查询之下。
  • 📐 列规则: 每个 SELECT 语句都必须返回相同数量的列,顺序相同,数据类型兼容。
  • 🧹 联合区别: 重复行将被删除,只返回唯一行,这就是预期行为。 MySQL 默认生效。
  • 📚 团结所有人: 返回每一行数据,包括重复行,这样速度更快,因为不需要去重处理。
  • 🏷️ 列名: 结果集的列名取自第一个 SELECT 语句,因此别名应该在该查询中设置。
  • 🛠️ 典型用途: 合并两个包含相同类型记录的表,合并后的输出结果中不允许出现重复行。

MySQL UNION Opera器

什么是工会? MySQL?

UNION 是一个意念波· MySQL 该运算符将多个 SELECT 查询的结果合并到一个统一的结果集中。第二个查询返回的行位于第一个查询返回的行下方,从而生成一个垂直列表,而不是两个独立的列表。

要实现这一点,唯一的要求是所有需要合并的 SELECT 查询的列数必须相同。

假设我们有两个表格,如下所示。

MySQL UNIONMySQL UNION

这两个表都包含两个相同类型的列,因此它们符合合并的条件。以下示例正是将这两个表合并在一起。

为什么要使用 UNION?

假设你的数据库设计存在缺陷,并且你使用了两个用途相同的表。你想将这两个表合并成一个表,同时删除重复记录。ping 将结果导入新表中。在这种情况下,您可以使用 UNION 运算符。

该运算符在日常报告工作中也很有用:

  • Archived 和实时数据: 当前表和存档表如果共享相同的列,则可以一起生成报表,而无需将它们物理合并。
  • 多方消息,同一份报告: 会员和电影,或者来自两个地区的销售情况,都可以列在一份输出文件中,以便快速审核。
  • 迁移检查: 可以在删除旧表之前,将旧表和新表中的行堆叠起来进行比较。

联合操作不能替代连接操作。联合操作是在行的下方添加行,而连接操作是在列的旁边添加列,这种区别决定了任务需要使用哪个运算符。

MySQL UNION 语法和规则

既然目的已经明确,那就来看看语句的结构以及数据库强制执行的规则。

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

所有工会都遵循三条规则:

  1. 列数相等。 每 选择语句 必须返回相同数量的列,否则 MySQL 引发错误 1222。
  2. 兼容的数据类型,顺序相同。 第一个查询的第一列与第二个查询的第一列匹配,所以数字应该与数字匹配,文本应该与文本匹配。
  3. 名称来自第一次查询。 结果集的标题取自第一个 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

常见问题

UNION 操作会将一个查询的结果行堆叠在另一个查询的结果行之下,因此结果会变得更高。 注册 匹配相关的行并将它们的列并排排列,因此结果会变得更宽。使用 UNION 连接相似的行,使用 JOIN 连接相关的表。

放置一个 ORDER BY 在最后一个 SELECT 语句之后添加 LIMIT 子句。它会对合并后的结果进行排序,并且必须使用第一个 SELECT 语句生成的列名。放在那里的 LIMIT 子句的作用相同。

当 SELECT 语句的两个分支返回的列数不一致时,会出现错误 1222。请统计每个分支中的列数,并在较短的分支中添加一个字面值或 NULL 占位符,以使两侧的列数顺序一致。

是的。文本转 SQL 助手,包括内置的助手。 MySQL 工作台从普通请求生成 UNION 语句。请自行检查列顺序,因为模型可能会将看起来相似的列对齐。

当不可能存在重复项时,助手可以建议使用 UNION ALL,这通常可以提高速度。但最终决定仍然取决于数据,因此在移除去重步骤之前,请务必确认分支确实不会重叠。

总结一下这篇文章: