`
suixinsuoyu12519
  • 浏览: 43853 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Union和Union All的区别

 
阅读更多
假设我们有一个表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的例子:


 view plaincopyprint?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>  
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连接两个结果集,则结果如下:



 view plaincopyprint?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.  
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语句的顺序,看看结果是怎样的。



 view plaincopyprint?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.  
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),看看结果如何:



 view plaincopyprint?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  
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呢?当然可以。不过在写法上有需要注意的地方:



 view plaincopyprint?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  
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子句改变排序方式。



分享到:
评论

相关推荐

    SQL语句 UNION 和 UNION ALL 使用

    通过本篇文章的学习,我们了解到 `UNION` 和 `UNION ALL` 的主要区别在于是否保留重复的行。此外,还介绍了使用这些关键字时需要注意的几个关键点,以及如何使用 `EXCEPT` 和 `INTERSECT` 运算符来处理结果集。这些...

    union和union All的区别.md

    union和union all的区别 两个查询的结果集中必须拥有相同的列数和相同的数据类型。 UNION 和 UNION ALL 操作的结果集的列名和数据类型是根据第一个查询的结果集来决定的,因此如果第一个查询的列名或数据类型发生...

    MySQL中使用or、in与union all在查询命令下的效率对比

    在MySQL数据库中,进行数据查询时,我们经常需要使用到`OR`、`IN`和`UNION ALL`这些操作符。这些操作符在不同的场景下有不同的效率表现,但并不是像网络上普遍认为的那样,`UNION ALL`总是比`OR`和`IN`更快。实际上...

    数据库中union和union all的区别

    在数据库查询中,UNION 和 UNION ALL 是两个非常重要的操作符,它们被用来组合不同的 SELECT 语句,形成一个单一的结果集。理解这两者之间的差异对于优化查询性能和获取准确的查询结果至关重要。 首先,UNION 操作...

    union all与order by用法

    UNION ALL 和 ORDER BY 是 SQL 语言中的两个基本操作符,分别用于合并查询结果和排序数据。在 Oracle PL/SQL 中, UNION ALL 和 ORDER BY 的使用需要遵循一定的规则和限制。本文将详细介绍 UNION ALL 和 ORDER BY 的...

    Mssql Union 与 Union All区别,用union还是union all主要看业务需求.docx

    在SQL查询中,`UNION` 和 `UNION ALL` 是两种用于合并多个SELECT语句结果集的方法,它们之间的主要区别在于数据去重处理和性能优化。了解这些概念对于优化SQL查询性能和满足特定的业务需求至关重要。 1. **UNION**...

    数据库中union 与union all 的区别

    在数据库查询中,`UNION` 和 `UNION ALL` 是两种用于合并多个查询结果集的方法,它们在处理数据合并时具有不同的行为和性能特点。 首先,`UNION` 操作符用于合并两个或更多 `SELECT` 查询的结果,并且会自动去除...

    浅析mysql union和union all

    在MySQL数据库中,`UNION` 和 `UNION ALL` 是两种用于合并多个查询结果集的关键字,它们在处理数据时具有不同的特性和性能影响。 首先,`UNION` 关键字用于合并两个或更多 `SELECT` 查询的结果,并且会自动去除重复...

    sql利用union all行转列

    ### SQL利用UNION ALL进行行转列方法解析 在数据库操作中,经常需要对数据进行各种转换以满足不同的业务需求。其中,“行转列”(Pivot)是一种常见的数据转换方式,它能够将数据表中的某列或多列值转换为多列的...

    Sql中的UNION ALL

    `UNION ALL`和`UNION`都可以用来合并结果集,但是它们之间有一个重要的区别:`UNION`会在最终结果集中去除重复的行,而`UNION ALL`则不会。这意味着如果两表中有相同的行,`UNION`只会显示一次,而`UNION ALL`则会...

    oracle集合union、union all、intersect、minus

    Oracle 集合操作是指在数据库中对数据进行集合运算的操作,包括 union、union all、intersect 和 minus 等操作。这些操作可以对数据进行合并、交叉、差异等处理,提高数据处理效率。 union 操作 Union 操作是将两...

    MySQL UNION 与 UNION ALL 语法与用法.docx

    MySQL UNION 与 UNION ALL 的区别在于,UNION 会删除结果集中重复的记录,而 UNION ALL 则会把所有的记录返回。 UNION ALL 的效率高于 UNION,因为 UNION 需要删除重复记录,而 UNION ALL 不需要。 MySQL UNION ...

    基本数据插入 except和intersect和exists和not exists和union和union all

    基本数据插入 except和intersect和exists和not exists和union和union all sql server

    Oracle中Union与Union All的区别(适用多个数据库)

    在数据库查询中,`UNION` 和 `UNION ALL` 是两个关键的SQL操作,主要用于合并多个 `SELECT` 语句的结果。它们的主要区别在于如何处理重复的行。 `UNION` 操作符用于合并两个或多个 `SELECT` 查询的结果集,但会自动...

    简单了解MySQL union all与union的区别

    union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明: 创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` ...

    使用UNION ALL代替IF语句的合并处理案例

    测试结果显示,虽然在某些特定条件下,`UNION ALL`可能与`IF`语句的性能相当,但在大多数情况下,`IF`语句通常会有更好的表现,因为它避免了不必要的数据扫描和合并。 使用`UNION ALL`的主要问题在于,即使条件不...

    sqlserver Union和SQL Union All使用方法

    在SQL Server中,`UNION`和`UNION ALL`是两种用于合并多个SELECT语句结果集的关键字,它们在数据库查询中起着至关重要的作用。理解这两种操作符的使用方法可以帮助你更有效地构建和优化SQL查询。 首先,`UNION`操作...

    sql Union和Union All的使用方法

    在SQL中,`UNION`和`UNION ALL`是用来合并多个查询结果的两种方法,它们主要用于处理来自不同数据表的数据。尽管它们的功能相似,但它们在处理重复数据时的行为有所不同。 首先,让我们来理解`UNION`。`UNION`操作...

    Mysql联合查询UNION和UNION ALL的使用介绍

    一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中...

Global site tag (gtag.js) - Google Analytics