簡單聊一聊SQL中的union和union?all
概念
MySQL UNION
操作符用于連接兩個以上的 SELECT
語句的結(jié)果組合到一個結(jié)果集合中。多個 SELECT
語句會刪除重復(fù)的數(shù)據(jù)。
UNION
操作符選取不同的值,如果允許得到重復(fù)的值,可以使用 UNION ALL
基礎(chǔ)語法
-- union SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; -- union all SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
注意:
UNION
內(nèi)部的每個SELECT
語句必須擁有相同數(shù)量的列列也必須擁有相似的數(shù)據(jù)類型
每個
SELECT
語句中的列的順序必須相同
使用技巧
我們發(fā)現(xiàn)我們用 UNION
得到的結(jié)果都是必須是相同的,這就不得不提 in
和 or
這兩個關(guān)鍵字了
-- in select * from users where name in ('sbc', 'bhy'); -- or select * from users where name = 'sbc' or name = 'bhy'; select * from users where name = 'sbc' or tel = '123456'; -- union select * from users where name = 'sbc' union select * from users where name = 'bhy'; select * from users where name = 'sbc' union select * from users where tel = '123456';
通過在用戶表(users)這幾個select語句中我們比較一下
如果我們想要名字為 sbc 或者 bhy 的用戶我們可以用in
、or
和union
都可以實(shí)現(xiàn)
如果在較大的數(shù)據(jù)量下差距就會有明顯的差距,如果 name 字段存在索引,這幾種方法都是不分上下的;可是如果像 or
寫法的第二種情況,那數(shù)據(jù)庫都會去找兩個字段各自的索引嗎,答案不是的,數(shù)據(jù)庫只會尋找一個字段的索引,而另一個字段就需要全局查詢
這樣遇到較大的數(shù)據(jù)量就會耗費(fèi)大量的時間,但是 union
方法的第二種方法就會引用兩次索引。
區(qū)別
union
:對兩個結(jié)果集進(jìn)行并集操作,不包括重復(fù)行,相當(dāng)于distinct
,同時進(jìn)行默認(rèn)規(guī)則的排序union all
:對兩個結(jié)果集進(jìn)行并集操作,包括重復(fù)行,即所有的結(jié)果全部顯示,不管是不是重復(fù);
tips
union all只是合并查詢結(jié)果,并不會進(jìn)行去重和排序操作,在沒有去重的前提下,使用union all的執(zhí)行效率要比union高
總結(jié)
如果遇到?jīng)]有索引的表或者只對單個字段進(jìn)行篩選,其實(shí)推薦使用 or 和 in ,看上去優(yōu)雅簡潔
如果遇到多個索引列的情況,還是推薦使用 union 和 union all
到此這篇關(guān)于SQL中union和union all的文章就介紹到這了,更多相關(guān)SQL中union和union all內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別
- MySQL之union和union all的使用及區(qū)別說明
- 帶例子詳解Sql中Union和Union?ALL的區(qū)別
- MySQL系列理解運(yùn)用union(all)與limit及exists關(guān)鍵字教程
- 簡單了解MySQL union all與union的區(qū)別
- MySQL中UNION與UNION ALL的基本使用方法
- 淺析mysql union和union all
- 5分鐘了解MySQL5.7中union all用法的黑科技
- SQL語句之Union和Union All的用法
- SQL中UNION與UNION ALL的區(qū)別小結(jié)
相關(guān)文章
Mysql?InnoDB?的內(nèi)存結(jié)構(gòu)詳情
這篇文章主要介紹了Mysql InnoDB的內(nèi)存結(jié)構(gòu)詳情,InnoDB存儲引擎的邏輯存儲結(jié)構(gòu)是什么呢,下面我們就一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧,感興趣的小伙伴可以參考一下2022-05-05mysql建表常用sql語句個人經(jīng)驗(yàn)分享
熟悉一些常用的建表語句可以提升你建表的速度效率,本文整理了一些,個人感覺還不錯,希望對大家有所幫助2014-01-01Mysql 取字段值逗號第一個數(shù)據(jù)的查詢語句
Mysql 取字段值逗號第一個數(shù)據(jù),在某些情況下還是比較實(shí)用的,主要使用到了left函數(shù)及其他等等,感興趣的朋友可以參考下2013-10-10MySQL查詢中LIMIT的大offset導(dǎo)致性能低下淺析
這篇文章主要給大家介紹了關(guān)于MySQL查詢中LIMIT的大offset導(dǎo)致性能低下的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12MySQL錯誤代碼3140:無效的JSON文本編碼問題解決辦法
下面這篇文章主要給大家介紹了關(guān)于MySQL錯誤代碼3140:無效的JSON文本編碼問題的解決辦法,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考借鑒價值,需要的朋友可以參考下2024-03-03阿里云ECS云服務(wù)器(linux系統(tǒng))安裝mysql后遠(yuǎn)程連接不了(踩坑)
這篇文章主要介紹了阿里云ECS云服務(wù)器(linux系統(tǒng))安裝mysql后遠(yuǎn)程連接不了(踩坑),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04