Sql查询统计时,很多时候用到了union 和 union all,union与union all的区别就是联合查询的时候union会去重,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 |
User_name |
2000 |
2014-01-16 |
小张 |
3000 |
2014-01-15 |
小李 |
4000 |
2014-01-14 |
小样 |
2000 |
2014-01-15 |
店B员工 |
3000 |
2014-01-16 |
店B员工 |
虽然这种办法不是很好,但确能实际解决问题,能解决问题的方法就是好方法。所以,一个小小的union关键字也还是有很多地方值得我们研究的。