首页 > 代码库 > SET操作符(UNION/UNION ALL/INTERSECT/MINUS)

SET操作符(UNION/UNION ALL/INTERSECT/MINUS)



Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All

两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);

如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。

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


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

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

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

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


可以在最后一个结果集中指定Order by子句改变排序方式。

例如:
建两张表:s1,s2
create table s1
(
    id number(10),
    name varchar2(20),
    age number(10)
)

create table s2
(
    id number(10),
    name varchar2(20),
    age number(10)
)

插入数据:
insert into s1 values(1,‘刘备‘,51);
insert into s1 values(1,‘刘德华‘,54);
insert into s1 values(3,‘ 张学友‘,54);
insert into s1 values(4,‘黎明‘,54);
 
insert into s2 values(1,‘刘备‘,51);
insert into s2 values(3,‘ 张飞‘,52);
insert into s2 values(4,‘关羽‘,53);

1、Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
select * from s1
union
select * from s2;

得到结果集:

       ID    NAME    AGE
1      1     刘备        51
2      1     刘德华    54
3      3     张飞        52
4      3     张学友    54
5      4     关羽        53
6      4     黎明        54

2、Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
select * from s1
union all
select * from s2;

得到结果集:
 
        ID    NAME    AGE
1      1      刘备        51
2      1      刘德华    54
3      3      张学友    54
4      4      黎明        54
5      1      刘备        51
6      3      张飞        52
7      4      关羽        53

3、Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
select * from s1
Intersect
select * from s2;

得到结果集:

       ID    NAME    AGE
1      1     刘备        51

4、Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
select * from s1
Minus
select * from s2;

得到结果集:

       ID    NAME    AGE
1    1      刘德华    54
2    3      张学友    54
3    4       黎明     54


SET操作符(UNION/UNION ALL/INTERSECT/MINUS)