mysql 集合操作UNION DISTINCT和UNION ALL

本文详细介绍了MySQL中UNION与UNION ALL的区别及用法。通过具体示例展示了如何利用这两种方法来合并多个SELECT语句的结果集,并强调了在不同场景下选择合适方法的重要性。

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

### MySQLUNION UNION ALL 的区别及用法 #### 1. 定义与功能 UNION UNION ALL 都用于将两个或多个 SELECT 查询的结果集合并成一个单一的结果集。然而,它们的主要区别在于如何处理重复的记录。 - **UNION**: 将结果集合并并自动去重,即会执行 DISTINCT 操作来移除重复的行[^3]。 - **UNION ALL**: 直接将所有结果集简单拼接在一起,不会进行任何额外的操作,因此可能会保留重复的行[^4]。 #### 2. 使用条件 为了能够正确使用 UNIONUNION ALL,需满足以下条件: - 所有 SELECT 子句中的列数必须一致。 - 列的数据类型应兼容或可隐式转换。 - 各子查询中列的顺序应当保持一致[^2]。 #### 3. 性能比较 由于 UNION 进行了去重操作,其性能通常低于 UNION ALL。如果可以确定结果集中不存在重复项或者无需考虑重复数据的情况,推荐优先使用 UNION ALL 来提高查询效率[^4]。 #### 4. 结果排序 当使用 UNION 时,默认会对最终结果按照字段顺序进行排序;而 UNION ALL 不会对结果做任何排序处理,仅按原始顺序返回数据[^4]。 以下是具体的 SQL 示例: ```sql -- 创建测试表 Chinese Math CREATE TABLE Chinese ( name VARCHAR(50), score INT ); INSERT INTO Chinese VALUES ('xiaoming', 80), ('xiaohong', 78), ('xiaowen', 92); CREATE TABLE Math ( name VARCHAR(50), score INT ); INSERT INTO Math VALUES ('xiaoming', 90), ('xiaohong', 85), ('xiaoliu', 88); ``` ##### 使用 UNION 去重 ```sql SELECT name, 'Chinese' AS subject, score FROM Chinese UNION SELECT name, 'Math' AS subject, score FROM Math; ``` 此查询会先合并两部分数据再通过 DISTINCT 移除可能存在的重复姓名及其对应成绩组合[^3]。 ##### 使用 UNION ALL 不去重 ```sql SELECT name, 'Chinese' AS subject, score FROM Chinese UNION ALL SELECT name, 'Math' AS subject, score FROM Math; ``` 该命令直接叠加两条独立查询所得的所有记录,即使存在完全相同的行也不会被剔除。 #### 5. 特殊注意事项 如果在联合查询过程中涉及别名定义,则 ORDER BY 子句需要引用这些已声明好的别名才能正常工作[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值