SQL Server 之 UNION(原創(chuàng))
UNION 將兩個(gè)或更多查詢的結(jié)果合并為單個(gè)結(jié)果集,該結(jié)果集包含聯(lián)合查詢中的所有查詢的全部行。UNION 運(yùn)算不同于使用聯(lián)接合并兩個(gè)表中的列的運(yùn)算。
下面列出了使用 UNION 合并兩個(gè)查詢結(jié)果集的基本規(guī)則:
1、所有查詢中的列數(shù)和列的順序必須相同。
2、數(shù)據(jù)類型必須兼容(相同或可隱式轉(zhuǎn)換)。
語法:
查詢表達(dá)式1 UNION [ALL] 查詢表達(dá)式2
select fields from tableA UNION select fields from tableB
查詢表達(dá)式:
查詢表達(dá)式或查詢規(guī)范,用以返回與另一個(gè)查詢規(guī)范或查詢表達(dá)式所返回的數(shù)據(jù)合并的數(shù)據(jù)。作為 UNION 運(yùn)算一部分的列定義可以不相同,但它們必須通過隱式轉(zhuǎn)換實(shí)現(xiàn)兼容。如果數(shù)據(jù)類型不同,則根據(jù)數(shù)據(jù)類型優(yōu)先順序規(guī)則確定所產(chǎn)生的數(shù)據(jù)類型。如果類型相同,但精度、小數(shù)位數(shù)或長度不同,則根據(jù)用于合并表達(dá)式的相同規(guī)則來確定結(jié)果。
UNION:
指定合并多個(gè)結(jié)果集并將其作為單個(gè)結(jié)果集返回。使用UNION會(huì)自動(dòng)排除相同的記錄,刪除重復(fù)行。(類似與單一查詢的DISTINCT。)
ALL:
將全部行并入結(jié)果中。其中包括重復(fù)行。如果未指定該參數(shù),則刪除重復(fù)行。
注意:SQL UNION會(huì)自動(dòng)排除相同的記錄,刪除重復(fù)行。這里的相同記錄指的是要用UNION合并兩個(gè)查詢結(jié)果的所有字段的值都相同。
轉(zhuǎn)載請(qǐng)注明出處
下面列出了使用 UNION 合并兩個(gè)查詢結(jié)果集的基本規(guī)則:
1、所有查詢中的列數(shù)和列的順序必須相同。
2、數(shù)據(jù)類型必須兼容(相同或可隱式轉(zhuǎn)換)。
語法:
查詢表達(dá)式1 UNION [ALL] 查詢表達(dá)式2
select fields from tableA UNION select fields from tableB
查詢表達(dá)式:
查詢表達(dá)式或查詢規(guī)范,用以返回與另一個(gè)查詢規(guī)范或查詢表達(dá)式所返回的數(shù)據(jù)合并的數(shù)據(jù)。作為 UNION 運(yùn)算一部分的列定義可以不相同,但它們必須通過隱式轉(zhuǎn)換實(shí)現(xiàn)兼容。如果數(shù)據(jù)類型不同,則根據(jù)數(shù)據(jù)類型優(yōu)先順序規(guī)則確定所產(chǎn)生的數(shù)據(jù)類型。如果類型相同,但精度、小數(shù)位數(shù)或長度不同,則根據(jù)用于合并表達(dá)式的相同規(guī)則來確定結(jié)果。
UNION:
指定合并多個(gè)結(jié)果集并將其作為單個(gè)結(jié)果集返回。使用UNION會(huì)自動(dòng)排除相同的記錄,刪除重復(fù)行。(類似與單一查詢的DISTINCT。)
ALL:
將全部行并入結(jié)果中。其中包括重復(fù)行。如果未指定該參數(shù),則刪除重復(fù)行。
| 例表A:UA | 例表B:UB |
![]() |
![]() |
注意:SQL UNION會(huì)自動(dòng)排除相同的記錄,刪除重復(fù)行。這里的相同記錄指的是要用UNION合并兩個(gè)查詢結(jié)果的所有字段的值都相同。
![]() |
select AID,ANAME,ASEX from UA union select BID,BNAME,BSEX from UB 說明: 1、UA表中有三個(gè)字段,UB表中有四個(gè)三字,但UNION考慮前后兩個(gè)查詢果(并不是實(shí)際表中的數(shù)據(jù))的列數(shù)要一致,即都是三個(gè)字段,且字段的數(shù)據(jù)類型一致就行了,結(jié)果如左圖所示。 如果用:select * from UA union select * from UB 或 select AID,ANAME,ASEX from UA union select BID,BNAME,BSEX,BAddress from UB 因?yàn)榱袛?shù)不一致,將拋出錯(cuò)誤。 2、UNION會(huì)自動(dòng)刪除重復(fù)行。結(jié)果中姓名為"馬艷艷"的,雖然性別、姓名都一樣,但因?yàn)镮D不同,則不認(rèn)為是重復(fù)的記錄,也就是說這里的重復(fù)記錄指的是兩個(gè)查詢結(jié)果中的所有字段的值都是一樣的。如:姓名為"鄧事文"的記錄則認(rèn)為重復(fù)記錄,只保留一條。 |
![]() |
UNION會(huì)自動(dòng)刪除重復(fù)行(記錄)的演示: select AID from UA union select bid from UB select ANAME from UA union select BNAME from UB select ASEX from UA union select BSEX from UB 注意:因?yàn)榍懊娴氖侵鞅恚越Y(jié)果中的字段名都是UA表中的字段名。 |
![]() ![]() |
再來看字段數(shù)據(jù)類型要一致的演示: select AID,ANAME,ASEX from UA union select BID,BNAME,BAddress from UB 說明: 因?yàn)閁A表中的ASEX與UB表中的BAddress都為varchar數(shù)據(jù)類型,所以結(jié)果如左圖所示。 如果類型相同,但精度、小數(shù)位數(shù)或長度不同,則根據(jù)用于合并表達(dá)式的相同規(guī)則來確定結(jié)果。 select ANAME,ASEX from UA union select BNAME,BID from UB select ANAME,AID from UA union select BNAME,BSEX from UB 錯(cuò)誤提示:在將 varchar 值 '女' 轉(zhuǎn)換成數(shù)據(jù)類型 int 時(shí)失敗。 可以對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換后再UNION select ANAME,cast(AID as varchar) from UA union select BNAME,BSEX from UB 如果用:select ANAME,AID from UA union select BNAME,BSEX from UB 不進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,將會(huì)出現(xiàn)錯(cuò)誤。 |
![]() |
最后看看UNION ALL: select AID,ANAME,ASEX from UA union all select BID,BNAME,BSEX from UB 說明: UNION ALL 也是要將兩個(gè) SQL 語句的結(jié)果合并在一起。 UNION ALL 和 UNION 不同之處在于 UNION ALL 會(huì)將左右兩個(gè)查詢的結(jié)果的所有的資料都列出來,無論資料值有無重復(fù)。 左圖結(jié)果中,姓名為"鄧事文"的記錄,在兩個(gè)查詢中是完全相同的。對(duì)比上面第一次試驗(yàn)的結(jié)果(9條記錄),現(xiàn)在這次因?yàn)橛昧薝NION ALL 姓名為"鄧事文"的記錄不管它是否重復(fù),都分別從兩個(gè)查詢結(jié)果中取了出來(結(jié)果為10條記錄)。 |








浙公網(wǎng)安備 33010602011771號(hào)