1 集合操作概述
集合操作是为了将来自两个或多个结果集进行组合,Oracle提供的集合操作符有
union
all、union、minus、intersect
集合操作对结果集是有限制的:
1)结果集返回的列数要一样
2)没列对应的数据类型不要求完全一样,但需要相互兼容。
2 集合操作符的介绍
2.1 union all:
返回两个结果集的合集,如果有重复的保留重复的
例如:
1 select 1
from dual
2 union
all
3* select 1 from
dual
TEST@orcl> /
1
----------
1
1
2.2 union
:返回两个结果集的合集,不允许有重复的。
1 select 1
from dual
2
union
3* select 1 from
dual
TEST@orcl> /
1
----------
1
要去重就要先排序,所以如果你对结果的是否重复不敏感建议用union all 而不是uunion
这个可以提升SQL的执行效率
2.3 interset:返回两个结果集共有的数据。
例如:
1 select level
from dual connect by level<=10
2
intersect
3* select level from dual
connect by level<=5
TEST@orcl> /
LEVEL
----------
1
2
3
4
5
2.4 minus
:差集返回第一个结果集存在,第二个结果集不存在在数据
例如:
1 select level
from dual connect by level<=10
2
minus
3* select level from dual
connect by level<=5
TEST@orcl> /
LEVEL
----------
6
7
8
9
10
3.集合操作符的优先级
集合可以操作多个数据集,多个操作符的情况下,Oracle默认会从走到右执行,我个人理解从上到下执行更容易理解
1 select 1
from dual
2
union
3 select 2
from dual
4
minus
5* select 1 from
dual
TEST@orcl> /
1
----------
2
通过小括号可以改变集合操作的默认优先级
1 select 1
from dual
2
union
3
(
4 select 2
from dual
5
minus
6 select 1
from dual
7* )
TEST@orcl> /
1
----------
1
2
4.集合操作对null值的处理。
因为null值代表的是未知,所以它可以和所有的数据类型向兼容包括它自己
例如:
1 SELECT 1
num, 'DEFINITE' string FROM DUAL
2
UNION
3* SELECT NULL num, 'UNKNOWN'
string FROM DUAL
TEST@orcl> /
NUM STRING
---------- --------
1
DEFINITE
UNKNOWN
1 SELECT null
num, 'DEFINITE' string FROM DUAL
2
UNION
3* SELECT NULL num, 'UNKNOWN'
string FROM DUAL
TEST@orcl> /
N STRING
- --------
< DEFINITE
n
u
l
l
>
< UNKNOWN
n
u
l
l
>
5.使用集合操作时应注意的问题
5.1
列的名字已第一个数据集为准
1 select 1
num from dual
2
union
3* select 2 from
dual
TEST@orcl> /
NUM
----------
1
2
1 select 1 num
from dual
2
union
3* select 2 tt from
dual
TEST@orcl> /
NUM
----------
1
2
因为后面的的结果集的列名被忽略,如果需要排序引用的名字必须是第一个结果集的否则会报错
1 select 1 num
from dual
2
union
3 select 2 tt
from dual
4* order by tt desc
TEST@orcl> /
order by tt desc
*
第 4 行出现错误:
ORA-00904: "TT": 标识符无效
如果不想这么复杂可以采用位置排序
1 select 1 num
from dual
2
union
3 select 2 tt
from dual
4* order by 1 desc
TEST@orcl> /
NUM
----------
2
1