# 关于结果集合并问题

table A
id,name
1,marry
2,jack

table B
id       word
1001  abce
1002  1234

id   content
1  marry
2  jack
1001  abce
1002  1234


select * from a union all select * from b










假设我们有一个表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(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

那么有人会问，如果我想自行控制排序，能不能使用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基本一致，这里一起总结一下：

# 可以在最后一个结果集中指定Order by子句改变排序方式。

#### mycat 结果集合并源码分析

2017-09-05 12:13:24

#### Mycat1.6的多分片结果集聚合源码分析(1)

2018-04-01 12:53:10

#### 文章标题多表查询：合并结果集，连接查询，子查询

2015-03-23 11:04:12

#### MySQL多行查询结果集合并

2015-06-10 18:20:05

#### VB合并多个结果集，合并记录集

2013年03月13日 11KB 下载

#### mysql：如何合并两个查询的结果集的数据

2014-05-29 10:23:23

#### oracle合并两个不一样的结果集

2017-08-11 16:36:01

#### MS SQL 合并结果集并求和

2015-02-13 10:59:17

#### sql的结果集合并

2013-07-04 13:48:45

#### 同一张表两次查询结果集合并

2017-08-21 10:54:51