數據庫中的union與union all的區別


Union因為要進行重復值掃描,所以效率低。如果合並沒有刻意要刪除重復行,那么就使用Union All

 兩個要聯合的SQL語句 字段個數必須一樣,而且字段類型要“相容”(一致);

如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。union(或稱為聯合)的作用是將多個結果合並在一起顯示出來。 

union和union all的區別是,union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來,不管是不是重復。 


Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序; 

Union All:對兩個結果集進行並集操作,包括重復行,不進行排序; 

Intersect:對兩個結果集進行交集操作,不包括重復行,同時進行默認規則的排序; 

Minus:對兩個結果集進行差操作,不包括重復行,同時進行默認規則的排序。 

可以在最后一個結果集中指定Order by子句改變排序方式。 

例如: 

select employee_id,job_id from employees 
union 
select employee_id,job_id from job_history 

以上將兩個表的結果聯合在一起。這兩個例子會將兩個select語句的結果中的重復值進行壓縮,也就是結果的數據並不是兩條結果的條數的和。如果希望即使重復的結果顯示出來可以使用union all,例如: 

2.在oracle的scott用戶中有表emp 
select * from emp where deptno >= 20 
union all 
select * from emp where deptno <= 30 
這里的結果就有很多重復值了。 

有關union和union all關鍵字需要注意的問題是: 

union 和 union all都可以將多個結果集合並,而不僅僅是兩個,你可以將多個結果集串起來。 
使用union和union all必須保證各個select 集合的結果有相同個數的列,並且每個列的類型是一樣的。但列名則不一定需要相同,oracle會將第一個結果的列名作為結果集的列名。例如下面是一個例子: 
select empno,ename from emp 
union 
select deptno,dname from dept 
我們沒有必要在每一個select結果集中使用order by子句來進行排序,我們可以在最后使用一條order by來對整個結果進行排序。例如: 
select empno,ename from emp 
union 
select deptno,dname from dept 
order by ename;

------------------------------------------------------------

UNION 並集,表中的所有數據,並且去除重復數據(工作中主要用到的是這個);

UNION ALL,表中的數據都羅列出來;

那么交集怎么取呢,怎么取得幾張表中的重疊的部分呢?(文末提供了一種方法)

UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。需要滿足以下條件:

1、相同數量的列;

2、列也必須擁有相似的數據類型;

3、同時,每條 SELECT 語句中的列的順序必須相同。

這三點一定要牢記,下面用一個小例子來說明。

建了兩張表,一張選功夫課程的學生表,一張是選音樂課程的學生表。里面的主要數據如下

 

我們先用UNION連接一下,查看下查詢結果。

 

 

仔細看一下,不是說UNION是並集且去掉重復的數據嗎。為什么還會有兩個令狐沖?

 

這樣來看為什么只有一個令狐沖呢,再對比一下腳本,原來是第一個腳本的字段比第二個腳本的查詢到的字段比較多。觀察第一個腳本的查詢結果並沒有四列全部重復的數據,所以查詢時要盡量明確自己的目的。如果是查詢學習課程的同學有哪些,第二個腳本的查詢結果就是。而第一個腳本就是查詢了哪些同學選了哪些課程,並且任課老師的信息全部列出來了。

接下來來看交集怎么取,查詢目的,有哪些同學既學習了武功還學習了音樂。

 

 

union在數據庫運算中會過濾掉重復數據,並且合並之后的是根據行合並的,即:如果a表和b表中的數據各有五行,且有兩行是重復數據,合並之后為8行。運用場景:適合於需要進行統計的運算

union all是進行全部合並運算的,即:如果a表和b表中的數據各有五行,且有兩行是重復數據,合並之后為10行。

join是進行表關聯運算的,兩個表要有一定的關系。即:如果a表和b表中的數據各有五行,且有兩行是重復數據,根據某一列值進行笛卡爾運算和條件過濾,假如a表有2列,b表有2列,join之后是4列。

        對於無關的運算,一般適合於full join,這樣在圖表展示的時候可以進行很好的處理,每個元素都可以展示的很好。

 

union在進行表求並集后會去掉重復的元素,所以會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。

 

union all則只是簡單地將兩個結果集合並后就返回結果。因此,如果返回的兩個結果集中有重復的數據,那么返回的結果就會包含重復的數據。

 

從上面的對比可以看出,在執行查詢操作時,union all要比union快很多,所以,如果可以確認合並的兩個結果集中不包含重復的數據,那么最好使用union all。例如,現有兩個學生表Table1和Table2:

 

 

 

執行語句:


select * from Table1 union select * from Table2

查詢結果如下:

 

 

執行語句:


select * from Table1 union all select * from Table2

查詢結果如下:

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM