zoukankan      html  css  js  c++  java
  • Union和Union_All的区别

    GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
    https://cnsendnet.taobao.com
    来自森大科技官方博客
    http://www.cnsendblog.com/index.php/?p=2052

    假设我们有一个表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的例子:
    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连接两个结果集,则结果如下:
    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语句的顺序,看看结果是怎样的。
    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),看看结果如何:
    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呢?当然可以。不过在写法上有需要注意的地方:
    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子句改变排序方式。

    GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
    https://cnsendnet.taobao.com
    来自森大科技官方博客
    http://www.cnsendblog.com/index.php/?p=2052

  • 相关阅读:
    Elasticsearch 之 Hello World (二)
    Elasticsearch 之 Hello World (一)
    Linux动态gif图的录制
    Vim配置及说明——IDE编程环境
    Vim自动补全插件----YouCompleteMe安装与配置
    Linux查看硬件信息(北桥芯片组、南桥、PCI接口、CPU等)
    Linux中源码安装编译Vim
    Linux安装搜狗拼音输入法-sogoupinyin
    开始写博客,与ITer们互相学习
    笔记本多硬盘win7下U盘安装Cnetos7引导问题!
  • 原文地址:https://www.cnblogs.com/cnsend/p/15563879.html
Copyright © 2011-2022 走看看