mysql 集合操作UNION DISTINCT和UNION ALL

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

union all

提示

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。

参考文章:http://www.3lian.com/edu/2015/05-23/216050.html

<think>嗯,用户问的是MySQLUNIONUNION ALL的区别。首先我得回忆一下这两个操作符的作用。记得它们都是用来合并两个或多个SELECT语句的结果集,但具体区别可能在于是否去重。 首先,UNION会合并结果并去除重复的行,而UNION ALL则是简单合并,包括所有行,不管有没有重复。这点我记得没错吧?需要确认一下文档或者实际例子。比如,如果两个SELECT的结果有重复记录,UNION会只保留一份,而UNION ALL会全部保留。 然后,性能方面,因为UNION需要去重,所以通常会比UNION ALL慢一些。去重操作涉及到排序比较,尤其是当结果集很大的时候,这个开销会更明显。所以如果用户确定结果没有重复或者不介意重复的话,推荐使用UNION ALL,这样效率更高。 用户可能的应用场景是什么呢?比如他们需要合并两个表的数据,但不确定是否有重复,这时候可能会用UNION。或者他们明确知道需要保留所有记录,比如日志合并,这时候用UNION ALL更好。另外,UNION ALL的结果可能更多,所以需要根据需求选择。 还要注意,使用UNION的时候,每个SELECT语句必须有相同数量的列,列的数据类型也要兼容。这点对于UNION ALL也是一样的。所以用户需要注意他们的查询结构是否一致。 有没有例外情况?比如UNION ALL有时候可能会有意保留重复,比如统计不同来源的数据,即使重复也都要。而UNION适合需要唯一性的情况,比如生成不重复的报告数据。 可能用户在使用过程中遇到了性能问题,或者结果集出现了意外的重复,所以想了解两者的区别来优化查询。这时候需要强调根据是否需要去重来选择,同时考虑性能影响。 总结的话,应该分点说明区别,包括去重、性能、使用场景,并给出例子帮助理解。比如举例两个简单的查询,用UNIONUNION ALL的结果差异,以及执行时间的比较(如果有的话)。不过实际例子可能需要具体的数据,但用户可能只需要概念上的理解。 最后,确保回答清晰,结构合理,用中文口语化表达,避免技术术语过多,但又要准确。可能需要检查是否有其他细节遗漏,比如排序或者其他限制条件,但核心区别应该就是去重性能。</think>MySQL中的 `UNION` `UNION ALL` 都是用于合并多个 `SELECT` 查询结果的运算符,但两者有明显区别: --- ### **1. 去重行为** - **UNION** 合并结果后**自动去重**(类似于 `SELECT DISTINCT`),确保最终结果中每一行都是唯一的。 **例子**: ```sql SELECT name FROM table1 UNION SELECT name FROM table2; ``` 如果 `table1` `table2` 都有 `"Alice"`,结果中 `"Alice"` 只会出现一次。 - **UNION ALL** 直接合并结果,**保留所有重复行**。 **例子**: ```sql SELECT name FROM table1 UNION ALL SELECT name FROM table2; ``` 如果 `table1` `table2` 都有 `"Alice"`,结果中会显示两次 `"Alice"`。 --- ### **2. 性能差异** - **UNION** 需要先合并结果,再执行去重操作(通常通过排序实现),因此**效率较低**。 - **UNION ALL** 直接拼接结果,无需去重,因此**速度更快**。 **建议**:如果明确知道查询结果无重复,优先使用 `UNION ALL`。 --- ### **3. 使用场景** - **需要去重时** 例如合并两个用户表并统计唯一用户名,使用 `UNION`。 - **需要保留重复时** 例如合并订单表日志表,允许重复记录存在,使用 `UNION ALL`。 --- ### **4. 其他注意事项** - 所有 `SELECT` 语句的列数必须相同,且对应列的数据类型需兼容。 - 最终结果的列名由第一个 `SELECT` 语句决定。 --- **总结**: - 要效率 → 用 `UNION ALL` - 要唯一性 → 用 `UNION`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值