Union和Union All的區別

2022-04-06 06:32:16 字數 3257 閱讀 8459

假設我們有乙個表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 在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表 ...