UNION在mysql中被稱為集合操作晕城,操作類型分為兩種:UNION DISTINCT 和? UNION ALL;注意:UNION和UNION DISTINCT是一樣的功能窖贤。UNION功能為合并多個(gè)查詢的結(jié)果并去重砖顷,UNION ALL的功能為合并多個(gè)查詢的結(jié)果不去重。
集合操作時(shí)赃梧,兩邊的輸入必須擁有相同的列數(shù)滤蝠,如果數(shù)據(jù)類型不同的話,mysql會(huì)自動(dòng)進(jìn)行隱式轉(zhuǎn)化 授嘀;同時(shí)物咳,結(jié)果列的名稱由第一個(gè)查詢的列的名稱決定。下面看一下例子:
sql語句為:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;結(jié)果是:
如果是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL;
如果兩次查詢的列個(gè)數(shù)不一致蹄皱,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL;
在多個(gè)列查詢時(shí)览闰,只要有一個(gè)列的數(shù)據(jù)不一致時(shí),都是無法去重的巷折;也就是去重是每個(gè)列的數(shù)據(jù)完全一致压鉴,比如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL;
這幾個(gè)例子可以看出UNION (DISTINCT) 與 UNION ALL的用法了吧,下面講一下UNION (DISTINCT)的實(shí)現(xiàn)方式:
一:創(chuàng)建一張?zhí)摂M表锻拘;
二:對(duì)這張?zhí)摂M表的列添加唯一索引晴弃,即UNIQUE INDEX;
三:將結(jié)果插入虛擬表
四:返回虛擬表;?
如何判斷是否創(chuàng)建一個(gè)虛擬表,我們可以通過一下語句判斷:
SHOW STATUS LIKE 'Created_tmp_tables';?
SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;
SHOW STATUS LIKE 'Created_tmp_tables'; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 結(jié)果是:
可見結(jié)果3比結(jié)果1多1逊拍,在操作第二個(gè) UNION語句時(shí)創(chuàng)建了一個(gè)虛擬表上鞠;如果UNION創(chuàng)建了索引,插入會(huì)相對(duì)變慢