概述

MySQL数据库支撑两种调集操作:UNION DISTINCT和UNION ALL。 UNION DISTINCT组合两个输入,并运用DISTINCT过滤重复项,一般能够直接省掉DISTINCT关键字,直接运用UNION。 在多个SELECT句子中,对应的列应该具有相同的字段特点,且第一个SELECT句子中被运用的字段称号也被用于成果的字段称号。


建表数据

为了更好的了解,造了下面mysql的两张表和一些数据。两张表中的数据其实是相同的(比较懒了,^_^),表及表字段略加改动。

create table name(
id int(4) not null auto_increment comment 'key',
name varchar(16) not null comment 'Name',
agend int(1) comment 'agend',
PRIMARY key(id)
)ENGINE=INNODB DEFAULT charset='utf8' comment 'name';
insert into name(name,agend) values('ck1','1');
insert into name(name,agend) values('ck2','0');
insert into name(name,agend) values('ck3','1');
insert into name(name,agend) values('ck4','0');
insert into name(name,agend) values('ck1','1');
create table name2(
id2 int(4) not null auto_increment comment 'key',
name2 varchar(16) not null comment 'Name',
agend2 int(1) comment 'agend',
PRIMARY key(id2)
)ENGINE=INNODB DEFAULT charset='utf8' comment 'name2';
insert into name2(name2,agend2) values('ck1','1');
insert into name2(name2,agend2) values('ck2','0');
insert into name2(name2,agend2) values('ck3','1');
insert into name2(name2,agend2) values('ck4','0');
insert into name2(name2,agend2) values('ck1','1');

union distinct

其实union 相当于 union distinct,个人觉得写全比较好,不要偷闲。

当A查询中有数据a,B查询中有数据a,对两个查询运用union distinct方法,那么查询成果只要一条数据a记载。

举例如下:

(select * from name where name = 'ck1' AND agend = '1') UNION DISTINCT (SELECT * from name2 where agend2 = '1');
union distinct


union all

当A查询中有数据a,B查询中有数据a,对两个查询运用union all方法,那么查询成果会呈现两条数据a。

举例如下:

(SELECT * from name2 where agend2 = '1') UNION ALL (select * from name where name = 'ck1' AND agend = '1');

阐明:

1、当A查询中有数据a,B查询中有数据a,不论对两个查询运用union all/distinct方法,查询成果的字段展现是依据union all/distinct前的查询成果字段展现的。例如前面union all,查询句子为:

(SELECT * from name2 where agend2 = '1') UNION ALL (select * from name where name = 'ck1' AND agend = '1');

那么展现的字段是 name2 表中的字段。

2、union all 在运用UNION DISTINCT的时分,因为向暂时表中添加了仅有索引,刺进的速度显然会因此而受到影响。假如承认进行UNION操作的两个调集中没有重复的选项,最有用的方法应该是运用UNION ALL。


union会主动紧缩多个成果调集中的重复成果,而union all则将一切的成果悉数显示出来,不论是不是重复。

Union:对两个成果集进行并集操作,不包含重复行,一起进行默许规矩的排序。

Union在进行表链接后会挑选掉重复的记载,所以在表链接后会对所发生的成果集进行排序运算,删去重复的记载再回来成果。实践大部分运用中是不会发生重复的记载,最常见的是进程表与前史表Union。

Union All:对两个成果集进行并集操作,包含重复行,不进行排序。

后边会共享更多devops和DBA方面的内容,感兴趣的朋友能够重视一下~

推荐阅读