MySQL 中 UNION 与 UNION ALL

Posted Fzshuai_Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 中 UNION 与 UNION ALL相关的知识,希望对你有一定的参考价值。

UNION 与 UNION ALL

一、UNION 语法

mysql UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中。

  1. 建两张表,分别插入几条数据:
CREATE TABLE group1(
	name VARCHAR(11) PRIMARY KEY
)

ALTER TABLE group1 ADD COLUMN
age INT(3)

SELECT *
FROM group1

INSERT INTO group1 (name, age) VALUE ("张三", 21)
INSERT INTO group1 (name, age) VALUE ("李四", 22)
INSERT INTO group1 (name, age) VALUE ("王五", 23)

CREATE TABLE group2(
	name VARCHAR(11) PRIMARY KEY,
	age INT(11)
)

SELECT *
FROM group2

INSERT INTO group2 (name, age)
VALUES ("张三", 21), ("李四", 22), "赵六", 23)

这两张表唯一的不同就是数据中,一个是“王五”,一个是“赵六”。

  1. 使用UNION ALL
SELECT name, age FROM group1
UNION ALL
SELECT name, age FROM group2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAJpGTkh-1621611510690)(https://i.loli.net/2021/05/21/c9dfKUpi2Xv6FAB.png)]

可以看出,union all 没有去重,查出了两个“张三”和“李四”;

  1. 使用 UNION
SELECT name, age FROM group1
UNION
SELECT name, age FROM group2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFf8TTjS-1621611510693)(https://i.loli.net/2021/05/21/5Qwhlb7FqG9j1nL.png)]

由此可见,“张三”和“李四”被去重了。

二、UNION 与 UNION 性能

  1. 使用 UNION ALL
EXPLAIN
SELECT name, age FROM group1
UNION ALL
SELECT name, age FROM group2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSvs2pL0-1621611510698)(https://i.loli.net/2021/05/21/EUYjN9JvhQn387t.png)]

  1. 使用 UNION
EXPLAIN
SELECT name, age FROM group1
UNION
SELECT name, age FROM group2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlvioAxv-1621611510701)(https://i.loli.net/2021/05/21/owSxZf46D9Xivnb.png)]

三、结论

通过性能分析可得出,union比union all 多做了操作。由此得结论:

  1. UNION 去重并排序,UNION ALL 直接返回合并的结果,不去重也不排序
  2. UNION ALL 比 UNION 性能好

以上是关于MySQL 中 UNION 与 UNION ALL的主要内容,如果未能解决你的问题,请参考以下文章

mysql中union与union all的区别

mysql中union与union all的区别

MySQL:union all与union区别详解

mysql union all和union的区别

mySql多表连接查询与union与union all用法

union和union all 的写法