查询中 OR, UNION 和 UNION ALL 的区别

OR 语句在 where 语句中使用,是两个或多个表连接后的过滤条件。UNION 和 UNION ALL 对两个查询结果集合做“并”运算,只有 record 中属性一致的记录集才能做"并"运算。就最终结果而言,它们可能异曲同工,但它们之间还是有差别的。如果不考虑索引,用 OR 的效率比 UNION 高,因为 OR 只扫描一次表,而 UNION 扫描两次。但一般不用索引的情况很少。

需要指出的是,进行 UNION 操作的两段 SQL,对应位置的类型必须相同,但列名可以不同,执行 UNION 操作后,列名与第一段 SQL 的列名相同。

实验:UNION 和 UNION ALL 区别

本实验在 Oracle 10g 上进行。

UNION 在对两个结果集进行“并”运算时,会除去重复的纪录,而 UNION ALL 不会去重。如果确认两个集合没有重复的纪录,那么就可以直接用 UNION ALL 以提高效率。

1. 创建表

create table test_a(col number(2));
create table test_b(col number(2));

2. 插入数据

insert into test_a values (1);
insert into test_a values (1);
insert into test_a values (2);
insert into test_a values (3);
insert into test_b values (2);
insert into test_b values (3);
insert into test_b values (4);

注意这里插入的数据:test_a: 1, 1, 2, 3; test_b: 2, 3, 4. 不但 test_a 和 test_b 两个集合中有相同的元素,在 test_a 内部,也有两个相同的元素1.

3. 查询

先尝试 UNION 运算符:

select *  from test_a
union
select * from test_b;

输出结果:

COL
1
2
3
4

可见,不但 test_a 和 test_b 中相同的记录合并了,而且在 test_a 内部,相同的两条记录也合并了。

再尝试 UNION ALL 运算符:

select *  from test_a
union all
select * from test_b;

输出结果:

COL
1
1
2
3
2
3
4

可见,所有记录原样成列。

谢谢。