前言
我们在学习数学的时候,接触过集合的概念,数学中集合的运算有交集、并集、差集。同样的,在SQL中这个概念也是适用的,值得注意的是,MySQL中只支持并集union、union all,对于交集和差集并不能很好的支持,但是可以采用其他的操作来实现,只是比较麻烦一点,这里就不做介绍了。而oracle能直接提供语法来支持并集、交集、差集操作,使用起来比较方便,下面将逐一介绍。
集合运算图
在介绍之前,我们先看一下并集、交集、差集的运算图,概念就不说了。
并集
并集有重叠的部分,运算时会去除掉重复的部分。
交集
交集显示共有的部分。
差集
需要注意的是,这里只画出了左边圆的差集,右半部分的圆其实也有差集,这里没画出来,注意一下即可。
oracle中的集合运算
准备两张数据表emp和emp2。emp表如下:
一共有15条数据。
emp2表如下:
一共有4条数据。
注意:进行集合查询的前提条件是两个数据源或结果集必须有相同数量的列,相互合并的字段数据类型必须相同,列名可以不同。
1、并集
求以上emp表和emp2表的并集,可以使用union和union all来连接。
a、union
union是将多个查询结果组合到一个查询结果中,并且去掉重复值,相当于做了一次group by分组操作。SQL如下:
select id,name,sex,address,depid from emp
union
select id,name,sex,address,depid from emp2;
查询结果如下:
结果一共有15条记录,可以看到是emp表和emp2表并起来的结果,并且没有重复的记录。
b、union all
union all是将多个查询结果组合到一个查询结果中,不会去掉重复值,也就是说重复的数据也会显示出来。SQL如下:
select id,name,sex,address,depid from emp
union all
select id,name,sex,address,depid from emp2;
查询结果如下:
一共有19条记录,刚好是emp中的15条记录加上emp2表中的4条记录,可以发现其中id为emp1003、emp1004、emp1004、emp1006的记录是重复的,这就是union和union all的区别,两种都是并集操作,但是区别在于是否去重。
2、交集
求以上emp表和emp2表的交集,可以使用intersect来连接。返回多个查询结果中重叠的部分。SQL如下:
select id,name,sex,address,depid from emp
intersect
select id,name,sex,address,depid from emp2;
查询结果如下:
可以发现,查询结果只有4条记录,刚好是emp表和emp2表中都有的记录。
3、差集
求以上emp表和emp2表的差集,可以使用minus来连接。返回emp表或emp2表的差集,这取决于查询的先后顺序。SQL如下:
select id,name,sex,address,depid from emp
minus
select id,name,sex,address,depid from emp2;
该SQL查询emp表中有而emp2表中没有的记录,也就是emp表中的记录剔除掉emp表和emp2表交集的部分,查询结果如下:
查询结果一共11条记录。刚好是emp表的15条记录除去两表重叠的4条记录。
如果SQL的顺序稍微调整一下,如下:
select id,name,sex,address,depid from emp2
minus
select id,name,sex,address,depid from emp;
查询结果如下:
可以看到结果是null的,0条记录。刚好是emp2表的4条记录除去重叠的4条记录。
以上就是在oracle数据库中提供的并集、交集、差集的查询用法,需要注意的地方是进行集合查询的前提条件。
一起学习,一起进步,每天只要进步一点点,时间久了,就是质的飞跃。