Hive中的join实操加补充MySQL中的exits/in

本文通过一张图清晰地概述了Hive中的各种JOIN操作,包括内连接、左连接、右连接和全连接。同时,还补充介绍了MySQL中的EXIST和IN条件在查询中的使用,帮助读者深入理解数据查询的原理。
摘要由CSDN通过智能技术生成
hive中的join有以下几类:
    inner join/left join/right join/full join/cross join/left semi join

测试数据:
    ja.txt
        1	zhang3
        2	li4
        3	wang5
    jb.txt
        1	19
        2	20
        4	21
==============================================================================
创建ja表:
    hive> create table ja(id int,name String) 
        >row format delimited fields terminated by '\t';
插入数据:
    hive> load data local inpath '/root/user.tmp/ja.txt' into table ja;
查看:
    hive> select * from ja;
    OK
    1	zhang3
    2	li4
    3	wang5

创建jb表:
    hive> create table jb(id int,age int) 
        >row format delimited fields terminated by '\t';
插入数据:
    hive> load data local inpath '/root/user.tmp/jb.txt' into table jb;
查看:
    hive> select * from jb;
    OK
    1	19
    2	20
    4	21


准备工作:
    hive> set hive.strict.checks.cartesian.product=false;
    hive> set hive.mapred.mode=nostrict;
===========================================================================
1、inner join:

    hive> select * from ja inner join jb on ja.id=jb.id;
    OK
    1	zhang3	1	19
    2	li4	2	20
=============================================================================    
2、left join:
    hive> select * from ja left join jb on ja.id=jb.id;
    OK
    1	zhang3	1	19
    2	li4	2	20
    3	wang5	NULL	NULL
    hive> select * from ja left join jb on ja.id=jb.id where jb.id is null;
    OK
    3	wang5	NULL	NULL

============================================================================
3、right join:
    hive> select * from ja right join jb on ja.id=jb.id;
    OK
    1	zhang3	1	19
    2	li4	2	20
    NULL	NULL	4	21
    hive> select * from ja right join jb on ja.id=jb.id where ja.id is null;
    OK
    NULL	NULL	4	21
==============================================================================
4、full join:
    hive> select * from ja full join jb on ja.id=jb.id;
    OK
    1	zhang3	1	19
    2	li4	2	20
    3	wang5	NULL	NULL
    NULL	NULL	4	21
    hive> select * from ja full join jb on ja.id=jb.id where ja.id is null or jb.id is null;
    OK
    3	wang5	NULL	NULL
    NULL	NULL	4	21
================================================================================
5、cross join:
    hive中不支持笛卡尔积操作,但任何join(除left semi join外)只要不写连接条件,就是笛卡尔积。
    
==================================================================================
6、left semi join
    用来替换SQL中的exists/in操作
    hive> select * from ja left semi join jb on ja.id=jb.id;
    OK
    1	zhang3
    2	li4
    以上的语句相当于MySQL中的:
        select * from ja where ja.id in(select jb.id from jb);
        select * from ja where exists(select jb.id from jb on ja.id=jb.id);
==============================================================================
7、补充MySQL中的exists/in操作

in:
    select * from ja where ja.id in(select jb.id from jb);
    流程:
        先执行子查询:select jb.id from jb;
            jb.id
            1
            2
            4
        再执行主查询:select * from ja;
            ja.id    ja.name
            1	zhang3
            2	li4
            3	wang5
        两个结果笛卡尔积:
            ja.id    ja.name    jb.id
            1	zhang3    1
            2	li4    1
            3	wang5    1
            1	zhang3    2
            2	li4    2
            3	wang5    2
            1	zhang3    4
            2	li4    4
            3	wang5    4
        执行on操作:
            ja.id    ja.name    jb.id
            1	zhang3    1        
            2	li4    2
        去除多余数据:
            ja.id    ja.name
            1	zhang3       
            2	li4



exists:
    select * from a where exists (select b.id from b where a.id=b.id);
    流程:
        执行主查询select * from a;
            ja.id    ja.name    
            1    zhang3       
            2    li4
            3    wang5 
        将主查询结果的每条记录执行a.id=b.id操作,成立返回true,留下该条记录,否则丢弃该条记录:
            ja.id    ja.name
            1	zhang3       
            2	li4


场景:
    子表较大用exists。
    not in 和no exists,无论哪种情况都用not exists。
    
    参考文章:
        https://www.cnblogs.com/liyasong/p/sql_in_exists.html
        https://blog.csdn.net/wqc19920906/article/details/79800374    

一张图总结join 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值