union distinct_当面试官问你UNION 和UNION ALL之间的区别时该怎么答?
概述
MySQL數(shù)據(jù)庫(kù)支持兩種集合操作:UNION DISTINCT和UNION ALL。 UNION DISTINCT組合兩個(gè)輸入,并應(yīng)用DISTINCT過(guò)濾重復(fù)項(xiàng),一般可以直接省略DISTINCT關(guān)鍵字,直接使用UNION。 在多個(gè)SELECT語(yǔ)句中,對(duì)應(yīng)的列應(yīng)該具有相同的字段屬性,且第一個(gè)SELECT語(yǔ)句中被使用的字段名稱(chēng)也被用于結(jié)果的字段名稱(chēng)。
建表數(shù)據(jù)
為了更好的理解,造了下面mysql的兩張表和一些數(shù)據(jù)。兩張表中的數(shù)據(jù)其實(shí)是一樣的(比較懶了,^_^),表及表字段略加改動(dòng)。
create table name( id int(4) not null auto_increment comment 'key', name varchar(16) not null comment 'Name', agend int(1) comment 'agend', PRIMARY key(id))ENGINE=INNODB DEFAULT charset='utf8' comment 'name';insert into name(name,agend) values('ck1','1');insert into name(name,agend) values('ck2','0');insert into name(name,agend) values('ck3','1');insert into name(name,agend) values('ck4','0');insert into name(name,agend) values('ck1','1');create table name2( id2 int(4) not null auto_increment comment 'key', name2 varchar(16) not null comment 'Name', agend2 int(1) comment 'agend', PRIMARY key(id2))ENGINE=INNODB DEFAULT charset='utf8' comment 'name2';insert into name2(name2,agend2) values('ck1','1');insert into name2(name2,agend2) values('ck2','0');insert into name2(name2,agend2) values('ck3','1');insert into name2(name2,agend2) values('ck4','0');insert into name2(name2,agend2) values('ck1','1');union distinct
其實(shí)union 相當(dāng)于 union distinct,個(gè)人覺(jué)得寫(xiě)全比較好,不要偷懶。
當(dāng)A查詢(xún)中有數(shù)據(jù)a,B查詢(xún)中有數(shù)據(jù)a,對(duì)兩個(gè)查詢(xún)使用union distinct方法,那么查詢(xún)結(jié)果只有一條數(shù)據(jù)a記錄。
舉例如下:
(select * from name where name = 'ck1' AND agend = '1') UNION DISTINCT (SELECT * from name2 where agend2 = '1');union distinctunion all
當(dāng)A查詢(xún)中有數(shù)據(jù)a,B查詢(xún)中有數(shù)據(jù)a,對(duì)兩個(gè)查詢(xún)使用union all方法,那么查詢(xún)結(jié)果會(huì)出現(xiàn)兩條數(shù)據(jù)a。
舉例如下:
(SELECT * from name2 where agend2 = '1') UNION ALL (select * from name where name = 'ck1' AND agend = '1');說(shuō)明:
1、當(dāng)A查詢(xún)中有數(shù)據(jù)a,B查詢(xún)中有數(shù)據(jù)a,不管對(duì)兩個(gè)查詢(xún)使用union all/distinct方法,查詢(xún)結(jié)果的字段展示是根據(jù)union all/distinct前的查詢(xún)結(jié)果字段展示的。例如前面union all,查詢(xún)語(yǔ)句為:
(SELECT * from name2 where agend2 = '1') UNION ALL (select * from name where name = 'ck1' AND agend = '1');那么展示的字段是 name2 表中的字段。
2、union all 在使用UNION DISTINCT的時(shí)候,由于向臨時(shí)表中添加了唯一索引,插入的速度顯然會(huì)因此而受到影響。如果確認(rèn)進(jìn)行UNION操作的兩個(gè)集合中沒(méi)有重復(fù)的選項(xiàng),最有效的辦法應(yīng)該是使用UNION ALL。
union會(huì)自動(dòng)壓縮多個(gè)結(jié)果集合中的重復(fù)結(jié)果,而union all則將所有的結(jié)果全部顯示出來(lái),不管是不是重復(fù)。
Union:對(duì)兩個(gè)結(jié)果集進(jìn)行并集操作,不包括重復(fù)行,同時(shí)進(jìn)行默認(rèn)規(guī)則的排序。
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。
Union All:對(duì)兩個(gè)結(jié)果集進(jìn)行并集操作,包括重復(fù)行,不進(jìn)行排序。
后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
總結(jié)
以上是生活随笔為你收集整理的union distinct_当面试官问你UNION 和UNION ALL之间的区别时该怎么答?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 周鸿祎透露360大语言模型进展 将推智能
- 下一篇: 明查|中国高铁“一公里耗电一万度”?太假
