ITPub博客

首页 > 数据库 > Oracle > Oracle集合操作因为比and或者or的效率要高的多所以这里介绍一下

Oracle集合操作因为比and或者or的效率要高的多所以这里介绍一下

Oracle 作者:ruiee 时间:2014-03-12 20:45:43 0 删除 编辑

 

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
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21943942/viewspace-1115855/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-06-21