• Union 与 Union all 区别


    原创,请园长不要删

    Sql查询统计时,很多时候用到了union 和 union all,union与union all的区别就是联合查询的时候union会去重,union all不会去重。本人用union all,主要用来统计多个不相关的表的数据汇总,用的次数很多,所以有点心得,记录下来,分享一下。

    比如 :有两个店,一个叫店A,一个叫店B,下面是表数据

    表table_a(店A)

       

       

       

    编号

    转账收入

    创建时间

    操作员

    Id

    amount

    create_date

    user

    1

    2000

    2014-01-16

    小张

    2

    3000

    2014-01-15

    小李

    3

    4000

    2014-01-14

    小样

         

    表table_b(店B)

       

       

    编号

    现金收入

    创建时间

    Id

    cash

    create_date

    1

    2000

    2014-01-15

    2

    3000

    2014-01-16

         

    现在有个需求,将店A表中的"收入" 和 店B 表中的"现金"统一列出来,那么我们的sql就是

    Select amount as money from table_a union all select cash as money from table_b

    结果就是

    结果

    Money

    2000

    3000

    4000

    2000

    3000

         

    如果我们去掉union all中的all,那么结果就是

    结果

    Money

    2000

    3000

    4000

         

    这里将会将2000这个重复的结果去掉。

    如果我将其他不同的字段也加到查询中来,我们来对比一下

    Select amount as money ,create_date as date from table_a union all select cash as money ,create_date as date from table_b

    money

    date

    2000

    2014-01-16

    3000

    2014-01-15

    4000

    2014-01-14

    2000

    2014-01-15

    3000

    2014-01-16

         

    Select amount as money ,create_date as date from table_a union select cash as money ,create_date as date from table_b

    money

    date

    2000

    2014-01-16

    3000

    2014-01-15

    4000

    2014-01-14

    2000

    2014-01-15

    3000

    2014-01-16

         

    从结果可以看出,如果不是两个字段同时相等,union 是不会去掉重复一个字段的,如果我想去掉重复的,怎么办,目前我只能提供的就是方法就是去掉重复结果,就只查那个字段。

    注意!

    1 如果是多个表查询,两个以上的表进行union all查询,如果全是union all,那还没什么问题,但中间如果出现了任意一个union,那结果全部都会去重!

    如果两个表union查询的时候,缺字段,怎么办?比如现在将店A,店B的所有"收入"和"操作员"全部列出来,这里店B表没有操作员这个字段,我这样操作,做个假的代替

    Select amount as money ,create_date as date ,USER_name as name from table_a

    union all

    select cash as money ,create_date as date,'店B员工' as name from table_b

         

    最后的结果就是这样

    money

    date

    name

    2000

    2014-01-16

    小张

    3000

    2014-01-15

    小李

    4000

    2014-01-14

    小样

    2000

    2014-01-15

    店B员工

    3000

    2014-01-16

    店B员工

    虽然这种办法不是很好,但确能实际解决问题,能解决问题的方法就是好方法。所以,一个小小的union关键字也还是有很多地方值得我们研究的。

       

    2 union与order by一起使用会出现错误

    比如这条语句:

    select amount as money ,create_date as date ,USER_name as name from table_a ORDER BY create_date desc

    union all

    select cash as money ,create_date as date,'店B员工' as name from table_b

    执行的时候就会报

    [Err] 1221 - Incorrect usage of UNION and ORDER BY

    其实报这个错也不难理解,在测试表中,首先union all就是指这两个表查询的结果联合组成的结果集,两个结果集都是相同的字段,如果一个结果集排序,那另一个集合是否也应该排序?就算排序了,本身两个就是各自排各自的序,然后汇总。而我们需要的是整体排序的结果,显然这不是我们期望的结果。所以各自排序根本就没意义。

    但如果我有这样的需求,是否能排序了,答案是肯定的

    我们知道,sql执行的顺序是先查from后面的表,再查where条件,再是select 字段,排序是最后自执行,所以当查出来所有结果以后我们再统一排序,那样就达到我们期望的结果了

    select amount as money ,create_date as date ,USER_name as name from table_a

    union all

    select cash as money ,create_date as date,'店B员工' as name from table_b

    ORDER BY date asc

    money

    date

    name

    4000

    2014-01-14

    小样

    3000

    2014-01-15

    小李

    2000

    2014-01-15

    店B员工

    3000

    2014-01-16

    店B员工

    2000

    2014-01-16

    小张

  • 相关阅读:
    POJ1064 浮点数二分答案
    2019牛客暑期多校训练营(第二场)H.Second Large Rectangle
    最大全1子矩阵的两种解法(例题:City Game HDU
    POJ
    Codeforces Round #588 (Div. 2) C
    1216E
    1221D
    BUY LOW, BUY LOWER, POJ
    Priest John's Busiest Day (2-sat)
    poj1080
  • 原文地址:https://www.cnblogs.com/wxwall/p/3523265.html
Copyright © 2020-2023  润新知