mysql中union和union all的使用及註意事項
1. sql中 union 和 union all 的用法
如果我們需要將兩個 select 語句的結果作為一個整體顯示出來,我們就需要用到 union 或者 union all 關鍵字。union (或稱為聯合)的作用是將多個結果合並在一起顯示出來。
union 和 union all 的區別是,union 會自動壓縮多個結果集合中的重復結果,而 union all 則將所有的結果全部顯示出來,不管是不是重復。
union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;union 在進行表鏈接後會篩選掉重復的記錄,所以在表鏈接後會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。實際大部分應用中是不會產生重復的記錄,最常見的是過程表與歷史表 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'
結果:
union all:對兩個結果集進行並集操作,包括重復行,不進行排序; 如果返回的兩個結果集中有重復的數據,那麼返回的結果集就會包含重復的數據瞭。
如下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'
結果:
2. 註意事項
2.1、UNION 和 UNION ALL 內部的 SELECT 語句必須擁有相同數量的列
2.2、每條 SELECT 語句中列的順序必須相同
先來說下,如果順序不同,會是什麼結果?
答:結果字段的順序以union all 前面的表字段順序為準。
union all 後面的表的數據會按照順序依次附在後面。註意:按照字段順序匹配,而不是按照字段名稱匹配。
sql如下:順序對結果的影響
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 結果字段的順序以 union all 前面的表字段順序為準。union all 後面的表的數據會按照字段順序依次附在後面,而不是按照字段名稱匹配。
我們上面以*來表示順序的不同,其實你寫成不同順序的字段結果一致。
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>
另外,如果系統中進行瞭分表,一定要保證各個表的字段順序一致。特別是修改的時候。否則,如果使用 *匯總查詢結果,肯定是會有問題的…親身踩坑。
補充:mysql中union和union all的區別
一、區別1:取結果的交集
1、union: 對兩個結果集進行並集操作, 不包括重復行,相當於distinct, 同時進行默認規則的排序;
2、union all: 對兩個結果集進行並集操作, 包括重復行, 即所有的結果全部顯示, 不管是不是重復;
二、區別2:獲取結果後的操作
1、union: 會對獲取的結果進行排序操作
2、union all: 不會對獲取的結果進行排序操作
三、區別3:
1、union看到結果中ID=3的隻有一條
select * from student2 where id < 4 union select * from student2 where id > 2 and id < 6
2、union all 結果中ID=3的結果有兩個
select * from student2 where id < 4 union all select * from student2 where id > 2 and id < 6
總結
到此這篇關於mysql中union和union all的使用及註意事項的文章就介紹到這瞭,更多相關mysql union和union all內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mysql排序的特性詳情
- 一文弄懂MySQL索引創建原則
- Mybatis動態SQL foreach批量操作方法
- MySQL優化之如何寫出高質量sql語句
- MySQL索引優化之適合構建索引的幾種情況詳解