假設我們有一個表 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(6,'Frado',61);
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 和 Union All 的區別。
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
結果將是
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
如果換成 Union All 連接兩個結果集, 則返回結果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
可以看到, Union 和 Union All 的區別之一在于對重復結果的處理。
UNION 在進行表鏈接后會篩選掉重復的記錄, 所以在表鏈接后會對所產生的結果集進行排
序運算, 刪除重復的記錄再返回結果。 實際大部分應用中是不會產生重復的記錄, 最常見的
是過程表與歷史表 UNION。 如:
select * from gc_dfys
union
select * from ls_jg_dfys
這個 SQL 在運行時先取出兩個表的結果, 再用排序空間進行排序刪除重復的記錄, 最
后返回結果集, 如果表數據量大的話可能會導致用磁盤進行排序。
而 UNION ALL 只是簡單的將兩個結果合并后就返回。 這樣, 如果返回的兩個結果集中有
重復的數據, 那么返回的結果集就會包含重復的數據了。
從效率上說, UNION ALL 要比 UNION 快很多, 所以, 如果可以確認合并的兩個結果集
中不包含重復的數據的話, 那么就使用 UNION ALL,