union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确。

先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同的(Schema of both sides of union should match.)。也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据。说明一下union 和union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合并相同的数据记录,该有多少条记录就会有多少条记录。例如在mysql下执行以下语句:

?select *from tmp_libingxue_a;name numberlibingxue 1001yuwen 1002select *from tmp_libingxue_b;name numberlibingxue 1001feiyao 1003select *from tmp_libingxue_aunion select *from tmp_libingxue_b;libingxue 1001yuwen 1002feiyao 1003select *from tmp_libingxue_aunion all select *from tmp_libingxue_b;libingxue 1001yuwen 1002libingxue 1001feiyao 1003

但是这样在hive里面是不能执行的,执行select * from tmp_libingxue_a union all select * from tmp_libingxue_b;会failed,hive中union必须在子查询中进行。如

?1select *from (select *from tmp_yuwen_aunion all select *from tmp_yuwen_b) t1;

注意,必须是union all,单独用union它会提示你缺少ALL,而且后面的t1必须写,你可以写成a或者b,但是一定要写,不写会出错。

而join则是偏于横向的联合,仅仅是偏向于,等下详细说明。join跟union比起来显得更宽松,对两个表的字段不做要求,没有限制条件的join等于两个表的笛卡尔乘积,所有join需要有限制条件来约束,经过限制的join就是横向的扩张了。对于满足限制条件的join会被提取出来,不满足的直接过滤掉。用法可以很灵活,下面有两个简单的例子:

?12select *from (select *from tmp_yuwen_a)t1join (select *from tmp_yuwen_b) t2;select *from tmp_yuwen_a t1join (select *from tmp_yuwen_b) t2;

left outer join和right outer join用法类似,区别就是left outer join会把左边表的字段全部选择出来,右边表的字段把符合条件的也选择出来,不满足的全部置空,也就是说以左边表为参照。right outer join同理以右边表为参照。这三个join之间的差别说过很多次,网上也有更详细的解释,不再赘述。

相同点:在某些特定的情况下,可以用join实现union all的功能,这种情况是有条件的,当出现这种情况的时候选择union all还是group by就可以看情况或者看两者的消耗而决定。sql虽然就在那么几个关键词,但变化多端、功能强大,只要能实现想要的功能,怎么用随便你。需求情况sql简单重现如下

?drop table tmp_libingxue_resource;create externaltable ifnot exists tmp_libingxue_resource(user_id string,shop_id string,auction_id  string,search_time  string)partitionedby (pt string)row format delimited fields terminatedby '\t'lines terminatedby '\n'storedas sequencefile; drop table tmp_libingxue_result;create externaltable ifnot exists tmp_libingxue_result(user_id string,shop_id string,auction_id  string,search_time  string)partitionedby (pt string)row format delimited fields terminatedby '\t'lines terminatedby '\n'storedas sequencefile; insert overwritetable tmp_libingxue_resultwhere(pt=20041104)select *from tmp_libingxue_resource;

?12sudo -u taobao hadoop dfs -rmr/group/tbads/warehouse/tmp_libingxue_result/pt=20041104sudo -u taobao hadoop jar/home/taobao/dataqa/framework/DailyReport.jar com.alimama.loganalyzer.tool.SeqFileLoader tmp_libingxue_resource.txt hdfs://v039182.sqa.cm4:54310/group/tbads/warehouse/tmp_libingxue_result/pt=20041104/part-00000

?1hive>select *from tmp_libingxue_resource;

?123OK2001 0  11  101  200411042002 0  11  102  20041104

?1hive>select *from tmp_libingxue_result;

?123OK2001 0  12  103  200411042002 0  12  104  20041104

?123456select user_id,shop_id,max(auction_id),max(search_time)from(select *from tmp_libingxue_resourceunion allselect *from tmp_libingxue_result )t1group by user_id,shop_id;

?122001 0  12  1032002 0  12  104

?123456select t1.user_id,t1.shop_id,t2.auction_id,t2.search_timefrom(select *from tmp_libingxue_resource) t1join(select *from tmp_libingxue_result) t2on t1.user_id=t2.user_idand t1.shop_id=t2.shop_id;

?122001 0  12  1032002 0  12  104

通过前面的介绍,使用UNION对表的结果集进行并运算与使用JOIN对多表进行连接,二者有本质的不同。

下面给出一个使用UNION运算符连接二表记录的运算实例。

典型的二表记录的UNION运算

假定有两个表Table3和Table4,其包含的列和数据分别如下所示。

mysql join union_MySQL中union和join语句使用区别的辨析教程相关推荐

  1. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  2. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  3. 关于SQL中Union和Join的用法

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) 一直以来,对于数据库SQL方面都是半吊子水平,能写一些基本的增删改查的语句,大部分时间都是用下Where, ...

  4. mysql不支持union_MySQL中Union子句不支持order by的解决方法

    本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的, ...

  5. MySQL(7)数据库中的高级(进阶)语句:VIEW视图、联集和常见计算

    文章目录 一.VIEW(视图) 1.1 概念 1.2 创建.查看和删除视图 二.联集 2.1 UNION 2.2 UNION ALL 三.交集值 3.1 两表没有单独重复的行,并且确实有交集的时候用 ...

  6. MySql 替换字段中字符串的sql语句

    前言 打代码不耽误我 听歌,看小说,玩游戏.         //  代表注释,写习惯了,看着舒服,带有//的那一行是我写的理解,请不要搞错了 最终语句,可以自行修改使用      --------- ...

  7. mysql timestamp json_mysql中timestamp,datetime,int类型的区别与优劣

    mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mys ...

  8. idea 配置mysql逆向_IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    添加依赖 添加generatorConfig.xml文件 在maven的plugins中运行mybatis-generator插件 注意事项: (1).generatorConfig.xml文件需要放 ...

  9. mysql inner join where_mysql中,inner join和where的结合问题

    大家好.我在做作品的时候有个疑问想问下:我的这个页面是一个显示文章详细页面的third.php网页,是通过点击文章列表页second.php,然后根据点击获取到的id跳到这里来的,但问题是,我... ...

最新文章

  1. java spring 配置文件_[Java教程]Spring配置文件
  2. 移动中”的HTML5-开源图表库ichartjs-王鹤
  3. Java实现字符全阵列阵列
  4. Python Django 一对多逆向查询示例
  5. IDEA显示类的结构 Alt+F7
  6. 视觉编码(Visual Encoding)
  7. PackagesNotFoundError: The following packages are not available from current channels:
  8. ***error*** (zip#Browse) unzip not available on your system
  9. java random api_API中的Scanner、Random、ArrayList、String类
  10. linux之strings命令
  11. 南京航空航天大学计算机考研经验分享,南京航空航天大学计算机考研829大纲
  12. JS每日一题: Vue中mixin怎么理解?
  13. SpringBoot 集成ElasticSearch(二)分页查询
  14. [置顶] 63行代码完美实现html5 贪吃蛇游戏
  15. 值得投入精力的APP运营:用户、活动和数据!
  16. JAVA:实现crc校验算法(附完整源码)
  17. 锐捷交换机堆叠配置实例
  18. 【python】python基础与unittest基础
  19. selenium 模拟登陆豆瓣,爬取武林外传的短评
  20. win python虚拟环境安装

热门文章

  1. 三、python中最基础的文件处理汇总
  2. printf格式化输出几点注记
  3. Unity游戏开发大师班
  4. 设计模式 之美 -- 面向对象(C/C++分别实现)
  5. linux C 多线程编程
  6. 深入理解ceph-disk prepare 源码逻辑
  7. C++ 重载运算符简单举例
  8. Linux日常命令记录
  9. Android学习笔记进阶十一图片动画播放(AnimationDrawable)
  10. transition属性值