union distinct_当面试官问你UNION 和UNION ALL之间的区别时该怎么答?

概述

MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。 UNION DISTINCT组合两个输入,并应用DISTINCT过滤重复项,一般可以直接省略DISTINCT关键字,直接使用UNION。 在多个SELECT语句中,对应的列应该具有相同的字段属性,且第一个SELECT语句中被使用的字段名称也被用于结果的字段名称。

64b77edf5dcb44c285f5442bcfa3a114

建表数据

为了更好的理解,造了下面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
7bca99adf4cf49e5b92135fa73283e2b

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');
dc1a43071a4c478c81423e41d2f4e884

说明:

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。


42c42a4c75954e3793b0a12609b40348

union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。

Union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表Union。

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

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

b5dd1921380f43d49e36b0d8da1220fb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值