OR 语句在 where 语句中使用,是两个或多个表连接后的过滤条件。UNION 和 UNION ALL 对两个查询结果集合做“并”运算,只有 record 中属性一致的记录集才能做"并"运算。就最终结果而言,它们可能异曲同工,但它们之间还是有差别的。如果不考虑索引,用 OR 的效率比 UNION 高,因为 OR 只扫描一次表,而 UNION 扫描两次。但一般不用索引的情况很少。
需要指出的是,进行 UNION 操作的两段 SQL,对应位置的类型必须相同,但列名可以不同,执行 UNION 操作后,列名与第一段 SQL 的列名相同。
本实验在 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
可见,所有记录原样成列。
谢谢。