假设我们有一个表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. 更改嵌入式Linux中开机画面----左上角小企鹅图标

    一直想给嵌入式仪表加个开机LOGO,但是没有找到更换的方法.最近在网上收集了一些文章,整理一下一共自己参考.目前也还没有试过这种方法究竟是否可以.但察看Kernel源代码可以知道,Linux-2.6的 ...

  2. 如何在单片机上使用printf函数(printf)(avr)(stm)(lpc)(单片机)(转)

    摘要:    当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,printf ...

  3. PHP创建文件以及移动文件

    创建文件,这里用到的是fopen,即是打开,又是创建 <?php $counter_file = 'aa.txt ';//文件名及路径,在当前目录下新建aa.txt文件 $fopen = fop ...

  4. 解决Xcode "The selected destination does not support the architecture " 错误错误

    XCODE编译运行项目后,发现工程编译后无法运行,出现:"The selected destination does not support the architecture for whi ...

  5. Oracle 12C卸载图文教程

    第一步:找到自己的Oracle安装目录.我的目录是:D:\app\u01\product\12.1.0\dbhome_1\deinstall ,然后点击bat文件.出现如下等待画面.   第二步:耐心 ...

  6. Unity3D笔记六 GUI游戏界面

    1.Label:标签控件,可以在游戏中用来展示文本字符串信息,不仅可以写字还可以贴图片. 2.Button:按钮控件,一般分图片按钮和普通的按钮,还有一个连续按钮RepeatButton注意,这个在W ...

  7. Java面试题全集(上)

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  8. 配置oem

    [oracle@kaifai ~]$ export ORACLE_SID=dbking[oracle@kaifai ~]$ export ORACLE_SID=kaifai[oracle@kaifai ...

  9. 13.Github使用

    我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...

  10. Tensorflow中卷积的padding方式

    根据tensorflow中的Conv2D函数,先定义几个基本符号: 输入矩阵W*W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样 filter矩阵F*F,卷积核 stride值S,步长 输出 ...