淺析mysql union和union all
在數(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)致用磁盤進(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
使用Union,則所有返回的行都是唯一的,如同您已經(jīng)對(duì)整個(gè)結(jié)果集合使用了DISTINCT
使用Union all,則不會(huì)排重,返回所有的行
如果您想使用ORDER BY或LIMIT子句來(lái)對(duì)全部UNION結(jié)果進(jìn)行分類或限制,則應(yīng)對(duì)單個(gè)地SELECT語(yǔ)句加圓括號(hào),并把ORDER BY或LIMIT放到最后一個(gè)的后面:
(SELECT a FROM tbl_name WHERE a=10 AND B=1) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2) ORDER BY a LIMIT 10;
麻煩一點(diǎn)也可以這么干:
select userid from ( select userid from testa union all select userid from testb) t order by userid limit 0,1;
如果你還想group by,而且還有條件,那么:
select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;
注意:在union的括號(hào)后面必須有個(gè)別名,否則會(huì)報(bào)錯(cuò)
當(dāng)然了,如果當(dāng)union的幾個(gè)表的數(shù)據(jù)量很大時(shí),建議還是采用先導(dǎo)出文本,然后用腳本來(lái)執(zhí)行
因?yàn)榧兇庥胹ql,效率會(huì)比較低,而且它會(huì)寫臨時(shí)文件,如果你的磁盤空間不夠大,就有可能會(huì)出錯(cuò)
Error writing file '/tmp/MYLsivgK' (Errcode: 28)
總結(jié)
以上所述是小編給大家介紹的mysql union和union all,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別
- MySQL之union和union all的使用及區(qū)別說(shuō)明
- 簡(jiǎn)單聊一聊SQL中的union和union?all
- 帶例子詳解Sql中Union和Union?ALL的區(qū)別
- MySQL系列理解運(yùn)用union(all)與limit及exists關(guān)鍵字教程
- 簡(jiǎn)單了解MySQL union all與union的區(qū)別
- MySQL中UNION與UNION ALL的基本使用方法
- 5分鐘了解MySQL5.7中union all用法的黑科技
- SQL語(yǔ)句之Union和Union All的用法
- SQL中UNION與UNION ALL的區(qū)別小結(jié)
相關(guān)文章
MySQL中Stmt 預(yù)處理提高效率問(wèn)題的小研究
在oracle數(shù)據(jù)庫(kù)中,有一個(gè)變量綁定的用法,很多人都比較熟悉,可以調(diào)高數(shù)據(jù)庫(kù)效率,應(yīng)對(duì)高并發(fā)等,好吧,這其中并不包括我,當(dāng)同事問(wèn)我MySQL中有沒(méi)有類似的寫法時(shí),我是很茫然的,于是就上網(wǎng)查,找到了如下一種寫法2011-08-08MySQL數(shù)據(jù)庫(kù)表的合并及分區(qū)方式
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)表的合并及分區(qū)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08解決Mysql5.7.17在windows下安裝啟動(dòng)時(shí)提示不成功問(wèn)題
這篇文章主要介紹了解決Mysql5.7.17在windows下安裝啟動(dòng)時(shí)提示不成功問(wèn)題,需要的朋友可以參考下2017-03-03兩個(gè)windows服務(wù)器使用canal實(shí)現(xiàn)mysql實(shí)時(shí)同步
canal是阿里基于java寫的一個(gè)組件,他的作用是canal.deployer讀取mysql數(shù)據(jù)的binlog日志,然后canal.adapter將其轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)(數(shù)據(jù)的變化或者變化后的數(shù)據(jù),跟配置有關(guān)),并且同步到相關(guān)中間件,本文實(shí)現(xiàn)兩個(gè)windows服務(wù)器使用canal實(shí)現(xiàn)mysql主從復(fù)制實(shí)時(shí)同步2025-03-03MySQL數(shù)據(jù)庫(kù)設(shè)置遠(yuǎn)程訪問(wèn)權(quán)限方法小結(jié)
很多情況下我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù),那么就可以參考下面的權(quán)限設(shè)置2013-10-10關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法
這篇文章主要介紹了關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法,在我們?nèi)粘J褂胢ysql的過(guò)程中會(huì)經(jīng)常遇到各種報(bào)錯(cuò),今天我們就來(lái)看一下ERROR 1366報(bào)錯(cuò)的解決方法吧2023-07-07圖文詳解Mysql使用left?join寫查詢語(yǔ)句執(zhí)行很慢問(wèn)題的解決
最近工作中遇到一個(gè)非常奇怪的問(wèn)題,mysql中有兩張表,test_info和test_do_info需要進(jìn)行LEFT?JOIN關(guān)聯(lián)查詢,下面這篇文章主要給大家介紹了關(guān)于Mysql使用left?join寫查詢語(yǔ)句執(zhí)行很慢問(wèn)題的解決方法2023-04-04MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語(yǔ)法詳解
這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語(yǔ)法,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11