`
s343174147
  • 浏览: 32596 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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;

一个表student_skill,包括以下字段与数据:
drop table student_skill;
  create table student_skill
    (
       id  varchar2(20),
       skill    varchar2(20)
   );
  insert into student_skill values('1','篮球');
  insert into student_skill(id) values('2');
  insert into student_skill values('3','足球');
  insert into student_skill values('11','篮球');


(左)连接
即(+)在右边返回左边的值
select * from student s, student_skill ss where s.id = ss.id(+);

1 1 Aaron 78 1 篮球
2 2 Bill 76 2
3 3 Cindy 89 3 足球
4 6 Frado 61
5 10 Jay 90
6 5 Ella 73
7 9 Ivan 93
8 4 Damon 90
9 7 Gill 99
10 8 Hellen 56


(右)连接
即(+)在左边返回右边的值

select * from student s, student_skill ss where s.id(+) = ss.id;
1 1 Aaron 78 1 篮球
2 2 Bill 76 2
3 3 Cindy 89 3 足球
4 11 篮球


总结“

"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配



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都有效。

=======================================================
Oracle Minus关键字
  SQL中的MINUS关键字
  SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:
  [SQL Segment 1]
  MINUS
  [SQL Segment 2]
--------------------------------------------
//创建表1
create table test1
(
  name varchar(10),
  sex varchar(10),
);

insert into test1 values('test','female');
insert into test1 values('test1','female');
insert into test1 values('test1','female');
insert into test1 values('test11','female');
insert into test1 values('test111','female');

//创建表2
create table test2
(
  name varchar(10),
  sex varchar(10),
);
insert into test1 values('test','female');
insert into test1 values('test2','female');
insert into test1 values('test2','female');
insert into test1 values('test22','female');
insert into test1 values('test222','female');
-------------------------------------------

select * from test1 minus select * from test2;

结果:

NAME       SEX           
---------- ----------
test1      female            
test11     female 
test111    female
-----------------------------------------------------------

select * from test2 minus select * from test1;

结果:

NAME       SEX           
---------- ----------
test2      female            
test22     female 
test222    female

结论:Minus返回的总是左边表中的数据,它返回的是差集。注意:minus有剃重作用

==========================================================
 下面是我做的实验,很明显能够看出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 order_id
   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 并集

==========================================================

Intersect和Minus的操作和Union基本一致,这里一起总结一下:

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

Union All,对两个结果集进行并集操作,包括重复行,不进行排序;

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

Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

可以在最后一个结果集中指定Order by子句改变排序方式。
分享到:
评论

相关推荐

    oracle集合union、union all、intersect、minus

    oracle集合union、union all、intersect、minus

    Oracle中的Union、Union_All、Intersect、Minus

    Oracle中的Union、Union_All、Intersect、Minus

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

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

    sql语句生成器+支持各大数据库+说明书

    SQL语句生成器的特色 支持几乎所有类型的数据库, ...联合(Union,对于Oracle 支持Union All,Minus,Intersect) 支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句  附属工具内嵌入Delphi IDE

    SQL语言生成器(delphi)

    1、支持几乎所有类型的数据库, 包括小型(桌面)数据库:...联合(Union,对于Oracle 支持Union All,Minus,Intersect) 4、支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 4、附属工具内嵌入Delphi IDE

    Oracle笔记

    学习oracle时的学习心得。 第一天 1 安装出现的问题: 1 运行 2 第二天 4 表管理 5 第三天 6 简单查询 7 ...union,union all,intersect,minus 17 字符函数 18 第六天 19 常用函数 19 日期函数 19 转换函数 20

    SQL语句生成及分析器

    联合(Union,Union All,Minus,Intersect) 4、SQL语句反向分析 无论多么复杂的语句,都能分析出来(包括SQL各子句中嵌套的SQL语句) 5、数据库视图定义和重建 6、支持将SQL查询语句,替换为插入(Insert into)和更新...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    4.8 连接(ANSI与Oracle对比):内连接、外连接、自连接 4.8.1 内连接 4.8.2 外连接 4.8.3 自连接 4.9 groupby和having子句 4.9.1 groupby 4.9.2 having 4.10 子查询:简单子查询和带连接的相关比较 4.10.1 简单子...

    SQL语句自动生成工具

    支持几乎所有类型的数据库, 包括小型(桌面)数据库:Fox DBF...对于Oracle 支持Union All,Minus,Intersect) &lt;br&gt;支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 附属工具内嵌入Delphi IDE

    SQL语句自动生成器简体中文版

    支持几乎所有类型的数据库, 包括小型(桌面)数据库:Fox ...对于Oracle 支持Union All,Minus,Intersect) &lt;br&gt;支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 附属工具内嵌入Delphi IDE

    Oracle Database 11g初学者指南--详细书签版

    4.8 连接(ANSI与Oracle对比):内连接、外连接、自连接 95 4.8.1 内连接 95 4.8.2 外连接 98 4.8.3 自连接 102 4.9 group by和having子句 103 4.9.1 group by 103 4.9.2 having 104 4.10 子查询:简单子查询...

    oracle常用函数汇总(分享)

    = like between is null in逻辑运算符:not and or 集合运算符: intersect ,union, union all, minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时...

    SQL语句教程.pdf

    UNION ALL INTERSECT MINUS 子查询 EXISTS CASE 算排名 算中位数 算总合百分比 算累积总合百分比 SQL 语法 无论您是一位 SQL 的新手,或是一位只是需要对 SQL 复习一下的资料仓储业界老将,您 就来对地方了。这个 ...

    SQL语句生成及分析器(中文绿色)

    3.8 联合 (Union [All],Minus,Intersect) 3.9 字段别名,数据表别名 3.10 SQL子查询表,内嵌SQL子句 4、粘贴字段、系统函数 5、SQL查询语句反向分析, 无论多么复杂的语句,都能分析得出来 包括上面提到...

    Oracle_Database_11g完全参考手册.part3/3

    13.2.1 Oracle9i以前版本中的外部连接的语法 13.2.2 现在的外部连接语法 13.2.3 用外部连接代替NOTIN 13.2.4 用NOTEXISTS代替NOTIN 13.3 自然连接和内部连接 13.4 UNION、INTERSECT和MINUS 13.4.1 IN子查询 13.4.2 ...

    Oracle_Database_11g完全参考手册.part2/3

    13.2.1 Oracle9i以前版本中的外部连接的语法 13.2.2 现在的外部连接语法 13.2.3 用外部连接代替NOTIN 13.2.4 用NOTEXISTS代替NOTIN 13.3 自然连接和内部连接 13.4 UNION、INTERSECT和MINUS 13.4.1 IN子查询 13.4.2 ...

    一个释放临时表空间实例

    Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。 重启数据库可以释放临时表空间,如果不能...Union 或 intersect 或 minus Sort-merge joins analyze

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合...

Global site tag (gtag.js) - Google Analytics