5 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在數(shù)據(jù)庫(kù)中,UNION和UNION ALL關(guān)鍵字都是將兩個(gè)結(jié)果集合并為一個(gè),但這兩者從使用和效率上來(lái)說(shuō)都有所不同。
MySQL中的UNION
UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見(jiàn)的是過(guò)程表與歷史表UNION。如:
select * from gc_dfys union select * from ls_jg_dfys
這個(gè)SQL在運(yùn)行時(shí)先取出兩個(gè)表的結(jié)果,再用排序空間進(jìn)行排序刪除重復(fù)的記錄,最后返回結(jié)果集,如果表數(shù)據(jù)量大的話可能會(huì)導(dǎo)致用磁盤(pán)進(jìn)行排序。
MySQL中的UNION ALL
而UNION ALL只是簡(jiǎn)單的將兩個(gè)結(jié)果合并后就返回。這樣,如果返回的兩個(gè)結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會(huì)包含重復(fù)的數(shù)據(jù)了。
從效率上說(shuō),UNION ALL 要比UNION快很多,所以,如果可以確認(rèn)合并的兩個(gè)結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話,那么就使用UNION ALL,如下:
select * from gc_dfys union all select * from ls_jg_dfys

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
UNION 用于把來(lái)自許多SELECT語(yǔ)句的結(jié)果組合到一個(gè)結(jié)果集合中。 (如果你要將多個(gè)表的查詢結(jié)果進(jìn)行合并輸出比如說(shuō) 群組消息跟個(gè)人消息表是分離的但是想一起提取出來(lái)并顯示的話就可以如此處理。通過(guò)MySQLUNION聯(lián)合查詢出來(lái)即可;
你要union兩個(gè)表,就必須滿足這兩個(gè)表的字段名字都是一樣的才行。首先,你的B表字段只有x,y兩個(gè),(select (*,z) from b) 這樣寫(xiě)就已經(jīng)不對(duì)了,因?yàn)閆字段不存在,應(yīng)該是(select (*,'' as z) from b)。
最好就改成:select x,y,z from a union select x,y,'' as z from b ,這樣就明了了!
添加回答
舉報(bào)