# 关于结果集合并问题

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

• 本文已收录于以下专栏：

## CETK测试原理/测试方法/测试结果分析以及常见WinCE Test Kit运行问题的排查

• 2009-09-17 18:02
• 3.98MB
• 下载

## NOT EXISTS　⇔ NOT IN　⇒ NOT NULL 问题 结果不一样 疑问 如果等效

• 2009-12-31 17:11
• 211B
• 下载

## ASP把Access数据库的查询结果导出为Excel文件时，出现一点问题身份证号后3位全部变成0的解决办法

• 2012-07-10 15:40
• 141KB
• 下载

## 在搜索引擎开发过程中的问题解决（关于高亮和结果集）

• 2012-01-11 14:13
• 27KB
• 下载

## java 单元最短路问题 附有结果

• 2012-07-03 10:51
• 14KB
• 下载

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)