假設我們有乙個表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
select *
from student
where id > 2 and id < 6
union
select *
from student
where id < 4
看看執行結果是否和你期望的一致?
--union all
select *
from student
where id > 2 and id < 6
union all
select *
from student
where id < 4
那麼這個呢?
據此我們可知,區別之二在於對排序的處理。union all將按照關聯的次序組織資料,而union將進行依據一定規則進行排序。那麼這個規則是?我們換個查詢方式看看:
select score,id,name
from student
where id > 2 and id < 6
union
select score,id,name
from student
where id < 4
結果如下:
73 5 ella
76 2 bill
78 1 aaron
89 3 cindy
90 4 damon
和我們預料的一致:將會按照欄位的順序進行排序。之前我們的查詢是基於id,name,score的字段順序,那麼結果集將按照id優先進行排序;而現在新的字段順序也改變了查詢結果的排序。並且,是按照給定欄位a,b,c...的順序進行的order by。即結果是order by a,b,c...........的。我們看下乙個查詢:
select score,id,name
from student
where id > 2
union
select score,id,name
from student
where id < 4
結果如下:
56 8 hellen
61 6 frado
73 5 ella
76 2 bill
78 1 aaron
89 3 cindy
90 4 damon
90 10 jay
93 9 ivan
99 7 gill
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基本一致,這裡一起總結一下:
union,對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序;
union all,對兩個結果集進行並集操作,包括重複行,不進行排序;
intersect,對兩個結果集進行交集操作,不包括重複行,同時進行預設規則的排序;
minus,對兩個結果集進行差操作,不包括重複行,同時進行預設規則的排序。
可以在最後乙個結果集中指定order by子句改變排序方式。
#資料庫技術
UNION 和UNION ALL 的區別
在資料庫中,union 和union all 關鍵字都是將兩個結果集合並為乙個,但這兩者從使用和效率上來說都有所不同。union 在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表 ...
UNION和UNION ALL的區別
關鍵字 union 和union all 的區別 出處 在資料庫中,union和union all關鍵字都是將兩個結果集合並為乙個,但這兩者從使用和效率上來說都有所不同。union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用...
UNION 和UNION ALL 的區別
在資料庫中,union 和union all 關鍵字都是將兩個結果集合並為乙個,但這兩者從使用和效率上來說都有所不同。union 在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表 ...