原创,请园长不要删

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

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

2014-01-16

小张

2

3000

2014-01-15

小李

3

4000

2014-01-14

小样

   
 

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

小张

Union 与 Union all 区别的更多相关文章

  1. Union和Union All到底有什么区别

    以前一直不知道Union和Union All到底有什么区别,今天来好好的研究一下,网上查到的结果是下面这个样子,可是还是不是很理解,下面将自己亲自验证: Union:对两个结果集进行并集操作,不包括重 ...

  2. union和union all的区别

    UNION 写一篇联合查询(把前后两个表的查询结果集合在前表中)首先有个为什么需要 相同记录数?? 记错了.应该是union两张表的查询字段数目要一致,字段类型要相似相同的数据类型,至少是相似,可转化 ...

  3. Oracle之Union与Union all的区别

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...

  4. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  5. union与union all的区别

    首先说下union与join的区别 1.union是以行增加的方式,进行连接:join是以列增加的方式进行连接: 2.union连接查询的两个表的字段必须要一一对应,数目相等:join则没有要求,但是 ...

  6. Ms SQLServer中的Union和Union All的使用方法和区别

    Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...

  7. union与union all 的区别

    Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...

  8. SQL Server函数​---Union与Union All的区别

    SQL Server函数---Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称 ...

  9. Oracle中Union与Union All的区别(适用多个数据库)

    Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...

随机推荐

  1. ArcGIS API for Silverlight 编辑Geometry

    概述 ArcMap的编辑功能是非常强大的,ArcEngine编写的CS程序也可以用到ArcMap中提供的编辑功能,那么ArcGIS API forSilverlight针对Geometry的编辑提供了 ...

  2. 当有多于64合乎逻辑的cpu时刻,Windows 下一个Oracle db 实例启动(startup)什么时候会hang(待定)

    Bug 9772171 - Database startup hangs on Windows when machine has more than 64 cores [ID 9772171.8] 该 ...

  3. AngulaJS实战

    AngulaJS实战总结, 带你进入AngularJS世界(待续)   使用AngularJS  进行Hybrid App 开发已经有一年多时间了,这里做一个总结. 一.AngularJS 初始化加载 ...

  4. ViewPaper实现轮播广告条

    使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...

  5. 命令行配置源和安装本地rpm包

    因为Firefox的在写博客时提交代码会丢失缩进,所以打算安装Chrome来写博,还不错,学到了两条命令- [shell] sudo yum-config-manager --add-repo=htt ...

  6. 解决Ubuntu Adobe Reader 菜单栏空白

    sudo gedit /usr/local/share/applications/AdobeReader.desktop将  ”Exec=acroread“ 用 ”Exec=env UBUNTU_ME ...

  7. MySQL之数据库结构优化

    1.选择合适的数据类型 一.选择能够存下数据类型最小的数据类型 二.可以使用简单的数据类型.int  要比varchar在MySQL处理上简单 三.尽可能的使用not null  定义字段 四.尽量少 ...

  8. 功能和形式的反思sql声明 一个

    日前必须使用sql语句来查询数据库 但每次你不想写一个数据库中读取所以查了下反射 我想用反映一个实体的所有属性,然后,基于属性的查询和分配值 首先,须要一个实体类才干反射出数据库相应的字段, 可是開始 ...

  9. Linux下PHP开发环境搭建

    平时写程序时都是在服务器已经搭建好的PHP环境进行的.出于对未知知识的好奇,这几天在自己的机器上搭建起了PHP开发环境.本想轻松顺利的看到phpinfo显示在我的页面上,没想到安装环境时一路的erro ...

  10. ASP.NET MVC项目里创建一个aspx视图

    先从控制器里添加视图 视图引擎选"ASPX(C#)",使用布局或模板页不要选. 在Views\EAV目录里,生成的aspx是个单独的页面,没有代码文件,所以代码也要写在这个文件里. ...