mysql的union和union all用法詳解
1. sql中 union 和 union all 的用法
如果我們需要將兩個(gè) select 語句的結(jié)果作為一個(gè)整體顯示出來,我們就需要用到 union 或者 union all 關(guān)鍵字。union (或稱為聯(lián)合)的作用是將多個(gè)結(jié)果合并在一起顯示出來。
union 和 union all 的區(qū)別是,union 會自動(dòng)壓縮多個(gè)結(jié)果集合中的重復(fù)結(jié)果,而 union all 則將所有的結(jié)果全部顯示出來,不管是不是重復(fù)。
union:對兩個(gè)結(jié)果集進(jìn)行并集操作,不包括重復(fù)行,同時(shí)進(jìn)行默認(rèn)規(guī)則的排序;union 在進(jìn)行表鏈接后會篩選掉重復(fù)的記錄,所以在表鏈接后會對所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。實(shí)際大部分應(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:對兩個(gè)結(jié)果集進(jìn)行并集操作,包括重復(fù)行,不進(jìn)行排序; 如果返回的兩個(gè)結(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. 注意事項(xiàng)
2.1、UNION 和 UNION ALL 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列
2.2、每條 SELECT 語句中列的順序必須相同
先來說下,如果順序不同,會是什么結(jié)果?
答:結(jié)果字段的順序以union all 前面的表字段順序?yàn)闇?zhǔn)。
union all 后面的表的數(shù)據(jù)會按照順序依次附在后面。注意:按照字段順序匹配,而不是按照字段名稱匹配。sql如下:順序?qū)Y(jié)果的影響
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 前面的表字段順序?yàn)闇?zhǔn)。union all 后面的表的數(shù)據(jù)會按照字段順序依次附在后面,而不是按照字段名稱匹配。
我們上面以*來表示順序的不同,其實(shí)你寫成不同順序的字段結(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)中進(jìn)行了分表,一定要保證各個(gè)表的字段順序一致。特別是修改的時(shí)候。否則,如果使用 *匯總查詢結(jié)果,肯定是會有問題的…親身踩坑。
到此這篇關(guān)于mysql的union和union all用法詳解的文章就介紹到這了,更多相關(guān)mysql union和union all內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL之union和union all的使用及區(qū)別說明
- MySQL中union和union all區(qū)別
- MySQL中union和unionall區(qū)別
- mysql中union和union?all的使用及注意事項(xiàng)
- 簡單了解MySQL union all與union的區(qū)別
- MySQL如何使用union all獲得并集排序
- MySQL中UNION與UNION ALL的基本使用方法
- 淺析mysql union和union all
- Mysql聯(lián)合查詢UNION和UNION ALL的使用介紹
- MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別
相關(guān)文章
Mysql中LEFT JOIN和JOIN查詢區(qū)別及原理詳解
這篇文章主要介紹了Mysql中LEFT JOIN和JOIN查詢區(qū)別及原理詳解,Nested Loop Join 實(shí)際上就是通過驅(qū)動(dòng)表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條的通過該結(jié)果集中的數(shù)據(jù)作為過濾條件到下一個(gè)表中查詢數(shù)據(jù),然后合并結(jié)果,需要的朋友可以參考下2023-08-08IP處理函數(shù)inet_aton()和inet_ntoa()使用說明
IP處理函數(shù)inet_aton()和inet_ntoa()使用說明,需要的朋友可以參考下2012-03-03mySQL中LEN()與DATALENGTH()的區(qū)別
LEN返回指定字符串表達(dá)式的字符數(shù),其中不包含尾隨空格。DATALENGTH返回用于表示任何表達(dá)式的字節(jié)數(shù)。2011-03-03MySQL學(xué)習(xí)之?dāng)?shù)據(jù)更新操作詳解
這篇文章我們將學(xué)習(xí)一下用于數(shù)據(jù)更改的 “UPDATE” 語句, “UPDATE” 語句也是屬于 DML 這一類數(shù)據(jù)庫操作語言,感興趣的可以了解一下2022-08-08mysql 一個(gè)較特殊的問題:You can''t specify target table ''wms_cabinet
mysql 一個(gè)較特殊的問題:You can't specify target table 'wms_cabinet_form' for update in F2010-11-11MySQL配置文件my.cnf中文詳解附mysql性能優(yōu)化方法分享
Mysql參數(shù)優(yōu)化對于新手來講,是比較難懂的東西,其實(shí)這個(gè)參數(shù)優(yōu)化,是個(gè)很復(fù)雜的東西,對于不同的網(wǎng)站,及其在線量,訪問量,帖子數(shù)量,網(wǎng)絡(luò)情況,以及機(jī)器硬件配置都有關(guān)系,優(yōu)化不可能一次性完成,需要不斷的觀察以及調(diào)試,才有可能得到最佳效果。2011-09-09