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

[c-sharp] view plain copy
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的例子:

[c-sharp] view plain copy
SQL> select *  
  2  from student  
  3  where id<4  
  4  union  
  5  select *  
  6  from student  
  7  where id>2 and id<6  
  8  ;  
  
        ID NAME                                SCORE  
---------- ------------------------------ ----------  
         1 Aaron                                  78  
         2 Bill                                   76  
         3 Cindy                                  89  
         4 Damon                                  90  
         5 Ella                                   73  
  
SQL>

如果换成Union All连接两个结果集,则结果如下:

[c-sharp] view plain copy
SQL> select *  
  2  from student  
  3  where id<4  
  4  union all  
  5  select *  
  6  from student  
  7  where id>2 and id<6  
  8  ;  
  
        ID NAME                                SCORE  
---------- ------------------------------ ----------  
         1 Aaron                                  78  
         2 Bill                                   76  
         3 Cindy                                  89  
         3 Cindy                                  89  
         4 Damon                                  90  
         5 Ella                                   73  
  
6 rows selected.

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

接下来,我们交换一个两个SELECT语句的顺序,看看结果是怎样的。

[c-sharp] view plain copy
SQL> select *  
  2  from student  
  3  where id>2 and id<6  
  4  union  
  5  select *  
  6  from student  
  7  where id<4  
  8  ;  
  
        ID NAME                                SCORE  
---------- ------------------------------ ----------  
         1 Aaron                                  78  
         2 Bill                                   76  
         3 Cindy                                  89  
         4 Damon                                  90  
         5 Ella                                   73  
  
SQL> select *  
  2  from student  
  3  where id>2 and id<6  
  4  union all  
  5  select *  
  6  from student  
  7  where id<4  
  8  ;  
  
        ID NAME                                SCORE  
---------- ------------------------------ ----------  
         3 Cindy                                  89  
         4 Damon                                  90  
         5 Ella                                   73  
         1 Aaron                                  78  
         2 Bill                                   76  
         3 Cindy                                  89  
  
6 rows selected.

可以看到,对于UNION来说,交换两个SELECT语句的顺序后结果仍然是一样的,这是因为UNION会自动排序。而UNION ALL在交换了SELECT语句的顺序后结果则不相同,因为UNION ALL不会对结果自动进行排序。

那么这个自动排序的规则是什么呢?我们交换一下SELECT后面选择字段的顺序(前面使用SELECT *相当于SELECT ID,NAME,SCORE),看看结果如何:

[c-sharp] view plain copy
SQL> select score,id,name  
  2  from student  
  3  where id<4  
  4  union  
  5  select score,id,name  
  6  from student  
  7  where id>2 and id<6  
  8  ;  
  
     SCORE         ID NAME  
---------- ---------- ------------------------------  
        73          5 Ella  
        76          2 Bill  
        78          1 Aaron  
        89          3 Cindy  
        90          4 Damon

可是看到,此时是按照字段SCORE来对结果进行排序的(前面SELECT *的时候是按照ID进行排序的)。

那么有人会问,如果我想自行控制排序,能不能使用ORDER BY呢?当然可以。不过在写法上有需要注意的地方:

[c-sharp] view plain copy
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都有效。

其他的集合操作符,如Intersect和Minus的操作和Union基本一致,这里一起总结一下:

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

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

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

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

可以在最后一个结果集中指定Order by子句改变排序方式。
---------------------
作者:wh62592855
来源:CSDN
原文:https://blog.csdn.net/wanghai__/article/details/4712555
版权声明:本文为博主原创文章,转载请附上博文链接!

Union、Union All、Intersect、Minus用法和区别的更多相关文章

  1. Oracle中的Union、Union All、Intersect、Minus

    Oracle中的Union.Union All.Intersect.Minus  众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括 ...

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

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

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

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

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

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

  5. Union、Union All、Intersect、Minus

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

  6. 集合操作符 Union / Union All / Intersect / Minus

    集合操作符 Union / UnionAll / Intersect / Minus -- 生成测试数据 create table dept_01 as select * from dept wher ...

  7. sql inner join , left join, right join , union,union all 的用法和区别

    Persons 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fift ...

  8. 数据库学习之五--Union, Union All和Intersect

    一.定义 Union操作符用于合并两个或多个SELECT语句的结果集: 注:1. Union连接的Select语句之间必须拥有相同数量的列: 2. 列也必须拥有相似的数据类型: 3. 每条 SELEC ...

  9. set和enum类型的用法和区别

    mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值.   1 2 3 ...

随机推荐

  1. 第三篇:关于TIME_WAIT状态

    前言 为何TCP ”四次分手“ 的过程中会有一个TIME_WAIT状态?这个状态有什么意义呢?这是网络中的一个经典问题,本文将给出精简的回答. 什么是TIME_WAIT状态 这是TCP通信协议中出现的 ...

  2. 《转载》POI导出excel日期格式

    参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...

  3. poj_2406 kmp

    题目大意 给出一个字符串S,S可能是多个较短的字符串的重复连接.比如"ababab"为字符串"ab"重复三次的结果:"abc" 为" ...

  4. LeetCode——Search for a Range

    Description: Given a sorted array of integers, find the starting and ending position of a given targ ...

  5. cookie带来的致命危险

    1.危险:当记录了过多的cookie时,可能导致http header过大,进而导致服务器端发生错误,导致用户无法打开页面. 2.cookie限制: 各浏览器对单cookie键的限制基本都在4kb左右 ...

  6. 使用CDN的网络访问过程

    CDN是指内容分发网络,在网络各处架设节点服务器,当用户访问时,CDN系统会根据网络流量.到用户的距离等因素将请求导向离用户最近的节点上. 访问过程是: 1.用户向浏览器提供要访问的域名. 2.浏览器 ...

  7. Java初学者笔记五:泛型处理

    一.泛型类: 泛型是指适用于某一种数据类型而不是一个数据机构中能存不同类型 import java.io.*; import java.nio.file.Files; import java.nio. ...

  8. 2.实现官网环境, 搭建HTTP服务器

    1.建立 HTTP 服务器 Node.js 是为网络而诞生的平台,但又与 ASP.PHP 有很大的不同,究竟不同在哪里呢?如果你有 PHP 开发经验,会知道在成功运行 PHP 之前先要配置一个功能强大 ...

  9. 超级小的web手势库AlloyFinger

    针对多点触控设备编程的Web手势组件,快速帮助你的web程序增加手势支持,也不用再担心click 300ms的延迟了.拥有两个版本,无依赖的独立版和react版本.除了Dom对象,也可监听Canvas ...

  10. java中得到文件MIME类型的几种方法(转)

     本文转载自:http://hotsunshine.iteye.com/blog/857485 使用 javax.activation.MimetypesFileTypeMap 需要引入activat ...