Union 与 Union all 区别
原创,请园长不要删
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 区别的更多相关文章
- Union和Union All到底有什么区别
以前一直不知道Union和Union All到底有什么区别,今天来好好的研究一下,网上查到的结果是下面这个样子,可是还是不是很理解,下面将自己亲自验证: Union:对两个结果集进行并集操作,不包括重 ...
- union和union all的区别
UNION 写一篇联合查询(把前后两个表的查询结果集合在前表中)首先有个为什么需要 相同记录数?? 记错了.应该是union两张表的查询字段数目要一致,字段类型要相似相同的数据类型,至少是相似,可转化 ...
- Oracle之Union与Union all的区别
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...
- 转 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 ...
- union与union all的区别
首先说下union与join的区别 1.union是以行增加的方式,进行连接:join是以列增加的方式进行连接: 2.union连接查询的两个表的字段必须要一一对应,数目相等:join则没有要求,但是 ...
- Ms SQLServer中的Union和Union All的使用方法和区别
Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...
- union与union all 的区别
Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...
- SQL Server函数---Union与Union All的区别
SQL Server函数---Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称 ...
- Oracle中Union与Union All的区别(适用多个数据库)
Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...
随机推荐
- javascript and dom1
<script type="text/javascript"> //数组 var beatles=Array(4); var beatles=Array(); cons ...
- vim打开出现的文档^M什么
网上公开的一些代码,发现里面多^M符号.这是什么? 我搜索^M没有效果,这应该是一个特殊的控制字符.找换行的结果是不.在每一行的末尾是回车,代替它周围包裹,对于由线定义不同的编码系统是不一样的. li ...
- ANDROID定义自己的观点——模仿瀑布布局(源代码)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候,事实上非常easy,仅仅须要知道3步骤: 1.測量- ...
- PHP 7: PHP 变量和常量的定义
原文:PHP 7: PHP 变量和常量的定义 本章说说变量的定义.如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到: 如何定义变量,它和C# 等语言有什么不同呢? 变量区分大小写吗? PHP ...
- 探秘IntelliJ IDEA 13中的版本控制——Subversion 1.8
IntelliJ IDEA 中引入的重要特性就是版本控制,而在IntelliJ IDEA 13中的体现便是支持最新的Subversion 1.8. 相对于之前版本对Subversion的支持,Subv ...
- [DevExpress]利用LookUpEdit实现类似自动提示效果
原文:[DevExpress]利用LookUpEdit实现类似自动提示效果 关键代码: public static void BindWithAutoCompletion(this LookUpEdi ...
- 专业MySQL数据库管理专家SQL Manager for MySQL发布5.4版本
SQL Manager for MySQL是一款针对MySQL数据库服务器系统的管理工具.深受数据库管理员的喜欢,其富有艺术感的图形用户界面,即使新手也可以不会为如何使用而感到困扰.近日EMSSoft ...
- less 命令
每天一个linux命令(13):less 命令 less 工 具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有 ...
- 解决Github使用Fastly CDN而导致不能加载网页的方法
Github现在基本属于“安全”网站,但 Github使用fastly.net的CDN服务后,其网站在国内经常不能正常加载网页.github.global.ssl.fastly.net的亚洲IP一般为 ...
- 分享一个C#自定义事件的实际应用
在C#.NET的开发中,事件是经常接触到的概念,比如为按钮添加点击事件,并写入点击按钮触发事件要运行的代码.不管是ASP.NET还是WinForm等各种形式的应用程序,最经常是为系统生成的事件写具体代 ...