UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

sql语法:

select id,`name` FROM stu
union
select id,`name` from stu2

在此建了两张表来比较union和union all的区别:

stu

union和union all的区别,union 和 union all + group by 去重效果

stu2

union和union all的区别,union 和 union all + group by 去重效果

建表语句:

CREATE TABLE stu(
id INT PRIMARY KEY,
`name` VARCHAR(20),
age INT,
`work` VARCHAR(20)
);

INSERT INTO stu (id,`name`,age,`work`) VALUES
(1,'张三',18,'学生'),
(2,'李四',30,'程序员'),
(3,'王五',26,'医生'),
(4,'赵六',36,'教师'),
(5,'赵四',38,'农民');

我们先看一下union操作的结果:

union和union all的区别,union 和 union all + group by 去重效果

再看一下union all

union和union all的区别,union 和 union all + group by 去重效果

可以看出来union把两个结果集进行了去重,而union把两个表的结果都展示出来

咱们再看看union all + group by的去重效果:

union和union all的区别,union 和 union all + group by 去重效果

他和union去重效果是一样,那么咱们就看一下他们两个谁的执行效率更高一点呢,我们可以看他的执行计划 EXPLAIN

推荐一个博客讲解很细:https://blog.csdn.net/wuseyukui/article/details/71512793

咱们这里就看一下执行时间对比一下

①show profiles; 
②how variables;查看profiling 是否是on状态; 
③ 如果是off,则 set profiling = 1; 
④执行自己的sql语句; 
⑤ show profiles;就可以查到sql语句的执行时间;

一般情况下咱们的profiling是1,在执行的时候他也会自己set成1

这个是union的执行时间

union和union all的区别,union 和 union all + group by 去重效果

然后我们看一下union all+group by 的执行时间:

union和union all的区别,union 和 union all + group by 去重效果

很显然union的执行时间更短,效率也比union all+group by更高(还是要分不同的场景来使用)

相关文章: