1. [sql] view plaincopyprint?
    众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考。

    假设我们有一个表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 union 用法的更多相关文章

  1. ORACLE RETURNING 用法总结

    ORACLE RETURNING 用法总结 场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的信息时使用,合理使用returning能够 ...

  2. oracle union 注入工具

    '***********************************************************************************************'ora ...

  3. Oracle instr用法

    1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...

  4. Oracle minus用法详解及应用实例

    本文转载:https://blog.csdn.net/jhon_03/article/details/78321937 Oracle minus用法 “minus”直接翻译为中文是“减”的意思,在Or ...

  5. Oracle触发器用法实例详解

    转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...

  6. Mysql中WHERE IN,UNION 用法详解

    WHERE IN 用法 这里分两种情况来介绍 1.in 后面是记录集,如: select  *  from  table  where   uname  in(select  uname  from  ...

  7. ORACLE SEQUENCE用法(转)

    ORACLE SEQUENCE用法 在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系. 1.Create Sequence     首先要有CREATE ...

  8. [转载]Oracle触发器用法实例详解

    本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...

  9. mysql 中合并查询结果union用法 or、in与union all 的查询效率

    mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...

随机推荐

  1. switch和continue的关系

    突然想到 我们用 switch都是用 break return等关键字来配合,有没有一种情况下是用continue呢?而且如果真的出现了continue,结果是什么样的呢?

  2. iOS Ad hoc

    There's one situation in which you need an Ad Hoc profile, and that's when you want to test Push Not ...

  3. MySQL on Linux 部署手册

    1. 背景 MySQL为开源数据库,因此可以基于源码实现安装.基于源码安装有更多的灵活性.也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码,根据不同的软件平台环境调整相关的编 ...

  4. hive操作

    1.创建hive分区表: create table invites (id int, name string) partitioned by (ds string) row format delimi ...

  5. 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  6. C#中的垃圾回收机制与delegate

    在DeepStream的C#版本调试过程中,发现了一个问题,运行一段时间后,大概每次内存到16M(Debug模式)就会异常 错误“System.NullReferenceException:未将对象引 ...

  7. Java读取maven目录下的*.properties配置文件

    public class ReadProperties{ private static String proFileName = "/config/MQSubjectId.propertie ...

  8. java远程连接access数据库

    本文转载自http://www.voidcn.com/article/p-tlrtkqlp-k.html 1  rmijdbc远程连接access数据库 正常情况下,常用的数据库sql server, ...

  9. <转>查看linux占用内存/CPU最多的进程

    转自 http://beginman.cn/page26/ 查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 或者top (然后按下M,注意大写) 查使用 ...

  10. 六、K3 WISE 开发插件《直接SQL报表开发新手指导 - BOM成本报表》

    ======================== 目录: 1.直接SQL报表 ======================== 1.直接SQL报表 以BOM成本报表为例,在销售模块部署,需要购买[金蝶 ...