首頁 > 軟體

mysql中union和union all的使用及注意事項

2022-08-05 18:03:00

1. sql中 union 和 union all 的用法

如果我們需要將兩個 select 語句的結果作為一個整體顯示出來,我們就需要用到 union 或者 union all 關鍵字。union (或稱為聯合)的作用是將多個結果合併在一起顯示出來。

unionunion 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 &lt;&gt; 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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com