若无特殊说明,oracle与mysql均适用
-
使用场景
union、union all关键字用户将两个select查询结果集合并成一个结果集,例如:一个旧系统使用a表,同样的信息但是新系统使用了b表,这时候可以使用union或者union all关键字将旧系统和新系统的数据合并显示。
-
union和union all的相同点和不同点
- 相同点:都是对两个查询结果集进行并集操作。
- 不同点:union会合并重复的行,而union all则不会,所谓重复行即两行数据所有的查询字段都相同。
- union all先跟左边的查询结果,然后再跟右边的查询结果。在oracle中union是全量排序,所谓全量排序即先按照第一个字段排序,然后按照第二个字段排序,依次类推。而在mysql中union先跟左边的查询结果,然后再跟右边的查询结果
-
使用需要注意点
- 如果不想使用默认的全量排序,可以在sql语句末尾使用order by+数字(排序字段的位置),mysql还可以使用order by+字段的方式
- 关键字两边查询的字段要完全一样
-
扩展补充(mysql不支持)
- Intersect:取两个结果集的交集,和并重复行。
- Minus:取两个结果集的差集,即在第一个查询结果中包含,并且在第二个查询结果中不包含的数据,合并重复行。
-
DEMO
create table student_a(
id number,
name varchar2(100));create table student_b(
id number,
name varchar2(100));insert into STUDENT_A (id, name)
values (1, '张三');
insert into STUDENT_A (id, name)
values (2, '李四');
insert into STUDENT_A (id, name)
values (1, '张三');
commit;insert into STUDENT_B (id, name)
values (2, '李四');
insert into STUDENT_B (id, name)
values (3, '赵六');
commit;select id,name from student_a
union
select id,name from student_b ;select id,name from student_a
union all
select id,name from student_b ;select id,name from student_a
Intersect
select id,name from student_b ;select id,name from student_a
Minus
select id,name from student_b ;select id,name from student_a
union all
select id,name from student_b order by 1;