Oracle集合运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sl1992/article/details/84558349

集合运算就是将两个或者多个结果集组合成为一个结果集。包含集合运算的查询称为复合查询。
集合运算的类型:并集、交集、差集。

1.并集

1.1并集(Union)

并集UNION

UNION运算符返回两个集合去掉重复元素后的所有记录,不包括重复行,同时进行默认规则的排序(升序)。

例:查询属于部门10与部门20的所有员工信息。

select * from emp where deptno=10
union
select * from emp where deptno=20

Union联合运算后结果

例:查询工资在500~1500或在1000~2000范围的员工信息(这是两个工资级别)。

select * from emp where sal between 500 and 1500
union 
select * from emp where sal between 1000 and 2000

并集Union去重

1.2并集(Union All)

并集Union All

UNION ALL返回两个集合的所有记录,包括重复的记录,不进行排序

例:查询工资在500~1500或在1000~2000范围的员工信息(这是两个工资级别)。

select * from emp where sal between 500 and 1500
union all 
select * from emp where sal between 1000 and 2000

UnionAll并集结果重复

注意:使用union all会比union的速度快,因为省去了去掉重复记录的时间且不进行排序。

2.交集(Intersect)

交集Intersect

INTERSECT运算符返回同时属于两个集合的记录。既属于集合A又属于集合B的记录,不包括重复行,同时进行默认规则的排序(升序)。

例:查询工资在500~1500又在1000~2000范围的员工信息(这是两个工资级别)。

select * from emp where sal between 500 and 1500
intersect
select * from emp where sal between 1000 and 2000

交集默认排序

没有必要在每一个select结果集中使用order by子句来进行排序,可以在最后使用一条order by来对整个结果进行排序。

select empno, ename, sal from emp where sal between 500 and 1500
intersect
select empno, ename, sal from emp where sal between 1000 and 2000
order by sal

集合运算排序只能写在最后

3.差集(Minus)

差集MINUS

MINUS返回属于第一个集合,但不属于第二个集合的记录。集合A-B的结果,即从A中去除所有属于集合B的元素,注意A-B与B-A的结果是不一样的。不包括重复行,同时进行默认规则的排序(升序)。

例:查询属于500~1500但不属于1000~2000范围的员工信息。

select empno, ename, sal from emp where sal between 500 and 1500
minus
select empno, ename, sal from emp where sal between 1000 and 2000

差集A-B

select empno, ename, sal from emp where sal between 1000 and 2000
minus
select empno, ename, sal from emp where sal between 500 and 1500

差集B-A

4.注意事项

①两个select语句中参数类型和个数要一致。

如果不一致,需要补齐。
例,如果要补个字符串,不能写个’a’、'b’等,要不影响结果,应补一个null,还要指定类型。
如果是字符串,可以写to_char(null);
如果要补数字类型,则写to_number(null)。

select empno,ename,sal from emp where sal between 500 and 1500
union
select deptno,dname,to_number(null) from dept

SELECT对齐补NULL

②可以使用括号改变集合执行的顺序。

③如果有order by子句,必须放到复合查询语句的最后。

④集合运算使用第一个SELECT语句的表头作为表头
使用union和union all必须保证各个select集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。

select empno,ename,sal 薪水 from emp where sal between 500 and 1500
union
select empno,ename,sal 工资 from emp where sal between 1000 and 2000
order by 1

第一个SELECT语句的列名薪水作为结果集的表头。
第一个语句的列名作为表头

猜你喜欢

转载自blog.csdn.net/sl1992/article/details/84558349
今日推荐