`
s343174147
  • 浏览: 33383 次
  • 性别: 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 等操作。这些操作可以对数据进行合并、交叉、差异等处理,提高数据处理效率。 union 操作 Union 操作是将两...

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

    Oracle 集合操作函数 union、intersect、minus Oracle 集合操作函数是用于合并多条 SELECT 语句的结果的函数,包括 UNION、INTERSECT、MINUS 等。这些函数可以将多个查询结果合并成一个结果集,以便进一步处理和...

    oracle常用函数汇总大全

    * 集合运算符:INTERSECT、UNION、UNION ALL、MINUS 等。 日期和时间函数 Oracle 提供了多种日期和时间函数来处理日期和时间数据。 * TO_DATE 函数:将字符串转换为 DATE 类型,例如 TO_DATE('2007-11-02 13:45:...

    视频教程读书笔记之oracle从入门到精通

    数据集合操作是指对多个查询结果进行合并或比较,常见的数据集合操作包括UNION、UNION ALL、INTERSECT和MINUS。 ##### 1. UNION UNION操作符用于合并两个或多个SELECT语句的结果集,但会去除重复的行。 ```sql ...

    数据库——的集合运算

    在SQL语言中,最基本的集合运算符包括UNION、UNION ALL、INTERSECT和MINUS。每个运算符都有其特定的用途和规则: 1. UNION运算符:此运算符用于合并两个或多个SELECT语句的结果集,并且会自动去除重复的行,只保留...

    Oracle高级sql学习与练习

    1. 集合操作包括UNION、UNION ALL、INTERSECT和MINUS等,它们用于合并两个或多个SELECT语句的结果集。UNION和UNION ALL用于联合多个结果集,不同之处在于UNION ALL会将所有结果包括重复项,而UNION则会自动去除重复...

    第6章 Oracle_DML_高级查询.pptx

    本章将深入探讨四种主要的集合运算:UNION、UNION ALL、INTERSECT 和 MINUS,以及子查询的使用,这些都是Oracle数据库中进行高效数据检索的关键工具。 一、集合运算 1. UNION 运算符:它用于合并两个或多个SELECT...

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

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

    Oracle培训教材.doc

    连接两字符串可以使用||,UNION、UNION ALL、INTERSECT和MINUS则用于合并或比较多个查询的结果集。 在SQL查询中,SELECT语句是最基础的部分,用于从表中提取数据。例如,`SELECT * FROM jobs`会显示jobs表的所有列...

    Oracle课程文档2

    主要有三种类型的集合运算:并集(`UNION`, `UNION ALL`)、交集(`INTERSECT`)和差集(`MINUS`)。 - **并集(`UNION` / `UNION ALL`)** - **`UNION`** 运算符用于合并两个或多个`SELECT`语句的结果集,并自动...

    SQL语言生成器(delphi)

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

    oracle 10g培训资料——SQL第二部分

    在本培训资料的第二部分中,主要介绍了四种高级查询语句:UNION、UNION ALL、INTERSECT和MINUS,这些都是集合操作符,用于合并或比较多个SQL查询的结果。 1. **UNION** 操作符: UNION用于合并两个或更多SELECT...

    Oracle.1z0-061 题库

    - **使用集合操作符**:理解并正确使用UNION, UNION ALL, INTERSECT 和 MINUS等操作符。 - **数据排序和过滤**:掌握ORDER BY子句的使用来对数据进行排序,以及使用WHERE子句来筛选数据。 - **表连接的概念**:理解...

    Oracle学习笔记——day05

    在Oracle学习笔记的第五天中,主要探讨了数据库中的连接查询、子查询、集合操作以及SQL注入防范等重要概念。 首先,连接查询是数据库操作的基础,用于将两个或多个表的数据结合在一起。在示例中,我们看到了三种...

    Oracle和SqlServer语法区别

    [{UNION | UNION ALL | INTERSECT |MINUS} SELECT U] [ORDER BY clause] [FOR UPDATE] ``` SqlServer: ``` SELECT select_list FROM table_source [WHERE search_condition] [GROUP BY [ALL] group_by_expression ...

    oracle中sql函数小结

    主要包括`UNION`, `UNION ALL`, `INTERSECT` 和 `MINUS`。 - **UNION ALL**:返回所有查询结果,包括重复行。 - **UNION**:返回所有查询结果,但会自动去除重复行。 - **INTERSECT**:返回两个查询结果集中的公共...

    第8章Oracle资料学习.pptx

    此外,学习Oracle的高级查询还包括了对简单连接、内连接、外连接和交叉连接的理解与应用。简单连接是基础,而内连接通过匹配两个表的字段值来合并数据。外连接又分为左外连接、右外连接和全外连接,分别保留左表、右...

    Oracle11g学习笔记五

    Oracle 11g支持四种基本的集合操作:UNION、UNION ALL、INTERSECT和MINUS。这些操作允许用户在多个查询结果集中进行合并或对比,以获取特定的数据子集。 1. **UNION**:用于合并两个查询的结果,去除重复的行。例如...

    SQL语句生成及分析器

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

Global site tag (gtag.js) - Google Analytics