mysqlでのunionとunion allの使い方と注意点

王林
リリース: 2023-05-26 17:07:46
転載
2556 人が閲覧しました

    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'
    ログイン後にコピー

    结果:

    mysqlでのunionとunion allの使い方と注意点

    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'
    ログイン後にコピー

    结果:

    mysqlでのunionとunion allの使い方と注意点

    2. 注意事项

    2.1、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列

    mysqlでのunionとunion allの使い方と注意点

    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
    ログイン後にコピー

    mysqlでのunionとunion allの使い方と注意点

    综上:

    union all 结果字段的顺序以 union all 前面的表字段顺序为准。union all 后面的表的数据会按照字段顺序依次附在后面,而不是按照字段名称匹配。

    我们上面以*来表示顺序的不同,其实你写成不同顺序的字段结果一致。

    mysqlでのunionとunion allの使い方と注意点

    3. union all 使用场景

    sql 中的组合in,可用 union all 来代替,提高查询效率

    修改前:组合in sql

    SELECT ***, ***, ***, ***, ***
    FROM e_rating_info 
    WHERE rating_quantity <> 0 AND (***, ***) 
    IN ((&#39;***&#39;, &#39;***&#39;), (&#39;***&#39;, &#39;***&#39;), 
    (&#39;***&#39;, &#39;***&#39;), (&#39;***&#39;, &#39;***&#39;), 
    (&#39;***&#39;, &#39;***&#39;), (&#39;***&#39;, &#39;***&#39;), 
    (&#39;***&#39;, &#39;***&#39;), (&#39;***&#39;, &#39;***&#39;), 
    (&#39;***&#39;, &#39;***&#39;), (&#39;***&#39;, &#39;***&#39;)) 
    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の使い方と注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート