mysql中union和union?all的使用及注意事項
1. sql中 union 和 union all 的用法
如果我們需要將兩個 select 語句的結(jié)果作為一個整體顯示出來,我們就需要用到 union 或者 union all 關(guān)鍵字。union (或稱為聯(lián)合)的作用是將多個結(jié)果合并在一起顯示出來。
union 和 union all 的區(qū)別是,union 會自動壓縮多個結(jié)果集合中的重復(fù)結(jié)果,而 union all 則將所有的結(jié)果全部顯示出來,不管是不是重復(fù)。
union:對兩個結(jié)果集進行并集操作,不包括重復(fù)行,同時進行默認規(guī)則的排序;union 在進行表鏈接后會篩選掉重復(fù)的記錄,所以在表鏈接后會對所產(chǎn)生的結(jié)果集進行排序運算,刪除重復(fù)的記錄再返回結(jié)果。實際大部分應(yīng)用中是不會產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表 union。
如下sql:
SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
結(jié)果:
union all:對兩個結(jié)果集進行并集操作,包括重復(fù)行,不進行排序; 如果返回的兩個結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會包含重復(fù)的數(shù)據(jù)了。
如下sql:
SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION ALL SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
結(jié)果:
2. 注意事項
2.1、UNION 和 UNION ALL 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列
2.2、每條 SELECT 語句中列的順序必須相同
先來說下,如果順序不同,會是什么結(jié)果?
答:結(jié)果字段的順序以union all 前面的表字段順序為準。
union all 后面的表的數(shù)據(jù)會按照順序依次附在后面。注意:按照字段順序匹配,而不是按照字段名稱匹配。
sql如下:順序?qū)Y(jié)果的影響
SELECT * FROM( SELECT msku,create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION ALL SELECT create_time,msku FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK') t
綜上:
union all 結(jié)果字段的順序以 union all 前面的表字段順序為準。union all 后面的表的數(shù)據(jù)會按照字段順序依次附在后面,而不是按照字段名稱匹配。
我們上面以*來表示順序的不同,其實你寫成不同順序的字段結(jié)果一致。
3. union all 使用場景
sql 中的組合in,可用 union all 來代替,提高查詢效率
修改前:組合in sql
SELECT ***, ***, ***, ***, *** FROM e_rating_info WHERE rating_quantity <> 0 AND (***, ***) IN (('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***')) ORDER BY *** DESC
修改后:UNION ALL sql
<select id="queryRatingInfo" resultType="***"> <foreach collection="ratingList" item="item" index="index" open="" separator="UNION ALL" close=""> SELECT ***, ***, ***, ***, *** FROM e_rating_info WHERE rating_quantity <> 0 AND country_code = #{item.***} AND asin = #{item.***} </foreach> ORDER BY *** DESC; </select>
另外,如果系統(tǒng)中進行了分表,一定要保證各個表的字段順序一致。特別是修改的時候。否則,如果使用 *匯總查詢結(jié)果,肯定是會有問題的…親身踩坑。
補充:mysql中union和union all的區(qū)別
一、區(qū)別1:取結(jié)果的交集
1、union: 對兩個結(jié)果集進行并集操作, 不包括重復(fù)行,相當(dāng)于distinct, 同時進行默認規(guī)則的排序;
2、union all: 對兩個結(jié)果集進行并集操作, 包括重復(fù)行, 即所有的結(jié)果全部顯示, 不管是不是重復(fù);
二、區(qū)別2:獲取結(jié)果后的操作
1、union: 會對獲取的結(jié)果進行排序操作
2、union all: 不會對獲取的結(jié)果進行排序操作
三、區(qū)別3:
1、union看到結(jié)果中ID=3的只有一條
select * from student2 where id < 4 union select * from student2 where id > 2 and id < 6
2、union all 結(jié)果中ID=3的結(jié)果有兩個
select * from student2 where id < 4 union all select * from student2 where id > 2 and id < 6
總結(jié)
到此這篇關(guān)于mysql中union和union all的使用及注意事項的文章就介紹到這了,更多相關(guān)mysql union和union all內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解
這篇文章主要介紹了mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12mysql獲取指定時間段中所有日期或月份的語句(不設(shè)存儲過程,不加表)
最近需要用mysql獲取一個時間段中的所有月份,網(wǎng)上查都是要設(shè)置存儲過程或者加一個日期表的,不滿足我的需求,翻墻找資料加上自己試驗,如下代碼分享給大家2021-06-06Windows系統(tǒng)下mysql5.7.21安裝詳細教程
這篇文章主要為大家詳細介紹了Windows系統(tǒng)下mysql5.7.21安裝詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Mac OS系統(tǒng)下mysql 5.7.20安裝教程圖文詳解
這篇文章主要介紹了Mac OS系統(tǒng)下mysql 5.7.20安裝教程圖文詳解,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2017-11-11Mysql服務(wù)器的安裝配置與啟動關(guān)閉方法詳解
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一2021-10-10