# 关于结果集合并问题

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 结果集合并源码分析

• jaryle
• 2017年09月05日 12:13
• 146

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

• u013033038
• 2015年03月23日 11:04
• 1061

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

（新用户）通过表A获取的记录集，如下： 1   2012-11-1 3   2012-11-2 8   2012-11-5 （老用户）通过表B获取的记录集，如下： 5   201...
• rongwenbin
• 2014年05月29日 10:23
• 1744

## oracle数据库将多个列的查询结果集合并到一行中

oracle数据库使用系统函数将多个列的查询结果集合并到一行中。
• qin904863396
• 2017年01月03日 19:34
• 6776

## PostgreSql 合并多行记录

• mynacche
• 2013年07月03日 09:30
• 4549

## 关于数据库合并问题整理

• zwl492454828
• 2016年09月29日 11:27
• 518

## Hibernate合并查询结果集为实体类

• zhulin2012
• 2017年08月30日 11:51
• 318

## ruby on rails 合并多个结果集并排序

• OldLock
• 2017年07月19日 17:05
• 249

## mysql 合并两个查询结果

• yilip
• 2016年01月11日 18:22
• 17403

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

• a497785609
• 2015年02月13日 10:59
• 6617

举报原因： 您举报文章：关于结果集合并问题 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)