Oracle中的Union、Union All、Intersect、Minus 
众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考。

假设我们有一个表Student,包括以下字段与数据:

drop table student;

create table student ( id int primary key, name nvarchar2(50) not null, score number not null ); 
insert into student values(1,'Aaron',78);

insert into student values(2,'Bill',76);

insert into student values(3,'Cindy',89);

insert into student values(4,'Damon',90);

insert into student values(5,'Ella',73);

insert into student values(6,'Frado',61);

insert into student values(7,'Gill',99);

insert into student values(8,'Hellen',56);

insert into student values(9,'Ivan',93);

insert into student values(10,'Jay',90);

commit;

 Union和Union All的区别。
select * from student where id < 4

union

select * from student  where id > 2 and id < 6

结果将是

1    Aaron    78

2    Bill    76

3    Cindy    89

4    Damon    90

5    Ella    73 
如果换成Union All连接两个结果集,则返回结果是:
1    Aaron    78

2    Bill    76

3    Cindy    89

3    Cindy    89

4    Damon    90

5    Ella    73 
可以看到,Union和Union All的区别之一在于对重复结果的处理。

接下来我们将两个子查询的顺序调整一下,改为

--Union

select * from student where id > 2 and id < 6

union

select * from student where id < 4

看看执行结果是否和你期望的一致?

--Union All

select * from student where id > 2 and id < 6

union all

select * from student where id < 4  那么这个呢? 
据此我们可知,区别之二在于对排序的处理。

Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序。那么这个规则是?我们换个查询方式看看:

select score,id,name from student where id > 2 and id < 6

union

select score,id,name from student where id < 4

结果如下:

73    5    Ella

76    2    Bill

78    1    Aaron

89    3    Cindy

90    4    Damon
和我们预料的一致:将会按照字段的顺序进行排序。之前我们的查询是基于id,name,score的字段顺序,那么结果集将按照id优先进行排序;而现在新的字段顺序也改变了查询结果的排序。并且,是按照给定字段a,b,c...的顺序进行的order by。即结果是order by a,b,c...........的。

我们看下一个查询:

select score,id,name from student where id > 2

union
 
select score,id,name from student where id < 4

结果如下:

56    8    Hellen

61    6    Frado

73    5    Ella

76    2    Bill

78    1    Aaron

89    3    Cindy

90    4    Damon

90    10    Jay

93    9    Ivan

99    7    Gill 
可以看到,对于score相同的记录,将按照下一个字段id进行排序。如果我们想自行控制排序,是不是用order by指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地方:

select score,id,name from student where id > 2 and id < 7 
union
select score,id,name from student where id < 4  
union 
select score,id,name from student where id > 8 
order by id desc 
order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于Union、Union All、Intersect、Minus都有效。

注意:
1,Union可以对字段名不同但数据类型相同的结果集进行合并;
2,如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效。
=================================================================================================================
Intersect和Minus的操作和Union基本一致,这里一起总结一下:
Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; 
Union All,对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序; 
Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。 
可以在最后一个结果集中指定Order by子句改变排序方式。
 
Oracle Minus
//创建表1
create table test1 (
 name varchar(10),  sex varchar(10),  age int );
insert into test1 values('luxin','female',25);

insert into test1 values('tom','female',26);

insert into test1 values('mary1','male',27);

insert into test1 values('money','male',27);

insert into test1 values('tony','male',28);

insert into test1 values('tony1','male',19);  
//创建表2
create table test2 ( name varchar(10),  sex varchar(10),  age int );  
insert into test2 values('luxin','female',25);

insert into test2 values('tom','female',26);

insert into test2 values('mary2','male',27);

insert into test2 values('money','male',27);

insert into test2 values('tony','male',28);

insert into test2 values('tony2','male',19);  
-------------------------------------------

select * from test1 minus select * from test2;

结果:
NAME       SEX               AGE

---------- ---------- ----------

mary1      male               27

tony1      male               19  
-----------------------------------------------------------

select * from test2 minus select * from test1;

结果:
NAME       SEX               AGE

---------- ---------- ----------

mary2      male               27

tony2      male               19  
结论:Minus返回的总是左边表中的数据,它返回的是差集。 用表1-表2中的数据,如果相同,则去掉,否则返回表1中的数据。  
==========================================================

今天在看数据集合时偶然看到了SQL 有MINUS,可以达到相同的目的   具体如下:
  SQL中的MINUS关键字
SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:   
[SQL Segment 1]   
MINUS
[SQL Segment 2]
  其实简单的一句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!   下面是我做的实验,很明显能够看出MINUS的效率,made_order共23万笔记录,charge_detail共17万笔记录  
性能比较:
SELECT order_id FROM made_order   
MINUS
SELECT order_id FROM charge_detail   
1.14 sec   
SELECT a.order_id FROM made_order a   WHERE NOT exists (    SELECT 1
FROM charge_detail  WHERE order_id = a.order_id    )
18.19 sec   
SELECT order_id FROM made_order   WHERE order_id NOT in (    SELECT order_id    FROM charge_detail    )
20.05 sec   
还有其它一下关键字:   
INTERSECT (交集)   
UNION ALL 并集

Oracle中的Union、Union All、Intersect、Minus的更多相关文章

  1. ORACLE中union/union all/Intersect/Minus用法

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

  2. Oracle中的Union、Union All、Intersect、Minus[转]

    众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table ...

  3. Oracle集合操作函数:union、intersect、minus

    [转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINU ...

  4. 【转】Oracle集合操作函数:union、intersect、minus

    集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符 ...

  5. oracle 的交并差函数,intersect;union;minus。

    创建表并添加数据: --创建TABLE_A create table TABLE_A ( A ), B ) ); --给TABLE_A添加数据 insert into TABLE_A values(' ...

  6. Oracle SQL Lesson (8) - 使用集合操作符(Union,Intersect,Minus)

    集合操作符UNION/UNION ALLINTERSECTMINUS Union All不排序,不去重,其余均升序且去重.create table e1 as select * from emp wh ...

  7. Oracle中Union与Union All的区别(适用多个数据库)

    Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...

  8. Union、Union All、Intersect、Minus用法和区别

    假设我们有一个表Student,包括以下字段与数据: [c-sharp] view plain copydrop table student;    create table student  (   ...

  9. Union、Union All、Intersect、Minus

    转自:http://www.2cto.com/database/201208/148795.html Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All: ...

随机推荐

  1. DFT 展开式和 FFT推导

    C语言的FFT //---------------------------------------------------------------------------------- //----- ...

  2. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  3. Unity3D移动端内存优化(NGUI方面)

     Unity3D引擎技术交流QQ群:[21568554] 做3d移动端内存一直是人们头疼的问题,载入的资源释放了,还有其它的须要释放.比方ngui释放,事实上主要是NGUI的Texture和Spr ...

  4. linux Apache rotatelogs 故障原因及解决方案未生效

    rotatelogs 截断日志.构造.但保存vhost.conf 之后.serverhttpd -k restart 还是无法成功重新启动. 日志文件: (2)No such file or dire ...

  5. Is it always safe to call getClass() within the subclass constructor?(转)

    14down votefavorite   An article on classloading states that the method getClass() should not be cal ...

  6. Windows 8 – Reason 442: Failed to enable Virtual Adapter

    Cisco VPN on Windows 8.1 – Reason 442: Failed to enable Virtual Adapter https://supertekboy.com/2013 ...

  7. android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色

    1.更改PagerTabStrip背景颜色 我们直接在布局中设置background属性可以: <android.support.v4.view.ViewPager android:id=&qu ...

  8. Javascript学习4 - 对象和数组

    原文:Javascript学习4 - 对象和数组 在Javascript中,对象和数组是两种基本的数据类型,而且它们也是最重要的两种数据类型. 对象是已命名的值的一个集合,而数组是一种特殊对象,它就像 ...

  9. 读取xml文件"分析 EntityName 时出错"的解决方案

    在涉及到xml与xslt编程的过程中,经常会碰到"分析 EntityName 时出错"的提示,这个不是程序错误,是因为xml文件中使用了一些特殊符号导致的.    XML 节点中不 ...

  10. 第22章 职责链模式(Chain of Responsibility)

    原文 第22章 职责链模式(Chain of Responsibility) 职责链模式 导读:职责链模式是一个既简单又复杂的设计模式,刚开始学习这个设计模式的时候光示例都看了好几遍.就为了理清里面的 ...