通常,查询规范化数据库需要将表的一个或多个通用字段联接。否则,可能会产生笛卡尔积。这是一个行数等于第一个表行数乘以第二个表行数的结果集。因此,如果输入包含 1000 人和 1000 个电话号码,则结果會有 1,000,000 个组合!这种做法并不好。话虽如此,如果你想聚合不直接相关但相似的表的数据,则可以使用 UNION 运算符进行操作。在今天的文1中,我们将学习一些有关使用 UNION 及其相类似的 UNION ALL 的要点。
UNION 与 UNION ALL
有人认为 UNION 和 UNION ALL 是可以互换的。但事实是他们不能互换。它们的不同之处在于,UNION 会移除重复的行或记录,而 UNION ALL 则不会移除;相反,UNION ALL 只是从表中选择满足查询的 WHERE 条件的所有行,并将它们合并为一个结果集。
将结果与 UNION 合并
以下的查询使用 Sakila 示例数据库。它是一个合并了两个 SELECT 查询结果的查询:
假设你要查找所有名字与 ID 为 8 的演员的名字相同的所有演员和客户的名称,但不返回演员 8 的详细信息。尽管有多种方法可以达成此目的,其中一种解决方案是采用 UNION ALL(如果每个结果集之间没有重复行,也可以使用 UNION)。以下是在 Navicat Premium 数据库开发和管理客户端中执行此工作的查询以及其结果:
在以上的查询中,上面的 SELECT 提取名字与 actor_id 为 8 的演员名字匹配的客户,而下面的查询则提取与 ID 8 的演员有相同名字的其他演员。
如果你是 Navicat 的用户,你应该已经知道它的编辑器是最好的编辑器之一。它提供语法高亮显示、可重复使用的代码段以及代码补全功能。当您开始键入单词时,会出现一个弹出列表,其中包含有关模式、表或视图、列以及存储过程和函数的所有内容的建议。以下是 UNION 运算符:
让我就 UNION 和 UNION ALL 说最后几句话。所有查询返回相同数量的列至关重要,否则你会收得到类似以下的错误:
就是说,列类型不必在所有 SELECT 语句中都匹配。
最后,请记住,在使用 UNION 或 UNION ALL 时,结果集的列名称取决于第一个 SELECT。
总结
UNION 和 UNION ALL 运算符是用于聚合不直接相关但相似的表中的数据的理想工具。
如果你想尝试 Navicat Premium,可以免费试用 14 天,以进行评估!