Union和Union All的区别[转]
来源:http://blog.csdn.net/wanghai__/article/details/4712555/
假设我们有一个表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子句改变排序方式。
Union和Union All的区别[转]的更多相关文章
- Union和Union All到底有什么区别
以前一直不知道Union和Union All到底有什么区别,今天来好好的研究一下,网上查到的结果是下面这个样子,可是还是不是很理解,下面将自己亲自验证: Union:对两个结果集进行并集操作,不包括重 ...
- union和union all的区别
UNION 写一篇联合查询(把前后两个表的查询结果集合在前表中)首先有个为什么需要 相同记录数?? 记错了.应该是union两张表的查询字段数目要一致,字段类型要相似相同的数据类型,至少是相似,可转化 ...
- Oracle之Union与Union all的区别
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...
- union与union all的区别
首先说下union与join的区别 1.union是以行增加的方式,进行连接:join是以列增加的方式进行连接: 2.union连接查询的两个表的字段必须要一一对应,数目相等:join则没有要求,但是 ...
- C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别
C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...
- Ms SQLServer中的Union和Union All的使用方法和区别
Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...
- union与union all 的区别
Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...
- Union 与 Union all 区别
原创,请园长不要删 Sql查询统计时,很多时候用到了union 和 union all,union与union all的区别就是联合查询的时候union会去重,union all不会去重.本人用uni ...
- SQL Server函数---Union与Union All的区别
SQL Server函数---Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称 ...
- Oracle中Union与Union All的区别(适用多个数据库)
Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...
随机推荐
- Vivado SPI Flash程序下载
由于Vivado下载程序步骤和ISE有较大差异,特此写此文章,希望对大家有所帮助. 1,下载文件生成 在.bit文件生成后,在TCL中输入 write_cfgmem -format mcs -inte ...
- FATAL ERROR: Could not find ./share/fill_help_tables.sql
[root@c01 mysql-5.6.33]# /apps/mysql-5.6.33/scripts/mysql_install_db --datadir=/data/my_db --user=my ...
- dom4j: 生成XML时文本中回车换行无效
属性文本中回车换行在输出时被dom4j自动去掉了. 解决办法: 将format.setTrimText(false); 即可.因为 createPrettyPrint()方法中有 format.set ...
- 每日英语:Philippine Chapel Becomes a Medical Center
In the darkest moments of the killer storm that ripped across this coastal city on Friday, residents ...
- Docker 入门 --- 命令总结
Docker命令总结 前言 命令来自于官网的get-started教程,放在这里自用 part-1 ## List Docker CLI commands docker docker containe ...
- maven 远程仓库的配置
setting.xml <profile> <id>development</id> <repositories> <repositor ...
- C# Dictionary通过value获取对应的key值
1:最直白的循环遍历方法,可以分为遍历key--value键值对以及所有的key两种表现形式 2:用Linq的方式去查询(当然了这里要添加对应的命名空间 using System.Linq) 如下为一 ...
- 1. K近邻算法(KNN)
1. K近邻算法(KNN) 2. KNN和KdTree算法实现 1. 前言 K近邻法(k-nearest neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用, ...
- git的版本回退探索
简介 今天改完代码匆忙提交,上线发现有问题,那怎么办?废话,赶紧回滚,那怎么回滚,开始用git reset [--soft | --mixed | --hard 命令,但这命令真的能达到我预期的效果吗 ...
- mysql 实现多列唯一性约束
alter table j_assistants add constraint unique_name_course_class unique(name_id,course_id,class_id);