学习笔记—sql中常用的连接方式-left join、left anti join、inner join

sql中常用的连接方式

1、left join
left join 是sql 中使用频率最高的一种连接方式,但是也是比较容易出错的一种连接方式,最常见的出错方式便是因为关联条件出现多对多产生笛卡尔积,此外使用left join原则上并不会导致主表查询数据量缺失,但是如果在最后where条件中加入了join表后的一些字段和条件,就会导致主表数据缺失(此种在where里面加入join后限制条件的方式则等同于inner join)。

select 
        a.district_2,
        b.city_name,
        count(1) as cnt  
from sql_practice_1 as a 
left join (
    select 
            distinct 
            city_id,
            city_name 
    from dim_area_info
    where 
            city_name = '北京市'
    ) as b on a.district_2 = b.city_id
group by 
        a.district_2,
        b.city_name;

运行结果:主表里面的district_2能够完全查出,b表由于限制了北京市,所以匹配不上的以null代替
学习笔记—sql中常用的连接方式-left join、left anti join、inner join_第1张图片
但是如果代码改为:


select 
        a.district_2,
        b.city_name,
        count(1) as cnt  
from sql_practice_1 as a 
left join (
    select 
            distinct 
            city_id,
            city_name 
    from dim_area_info
    ) as b on a.district_2 = b.city_id
where 
            b.city_name = '北京市'
group by 
        a.district_2,
        b.city_name;

则结果为:
在这里插入图片描述
2、inner join
inner join 只会返回两个表的交集,其坑点没有left join 那么多,展示如下:

select 
        a.district_2,
        b.city_name,
        count(1) as cnt  
from sql_practice_1 as a 
inner join (
    select 
            distinct 
            city_id,
            city_name 
    from dim_area_info
    where 
            city_name = '北京市'
    ) as b on a.district_2 = b.city_id
group by 
        a.district_2,
        b.city_name;

结果如下:会发现结果和上面left join 后在where 限制 b.city_name = ‘北京市’ 输出结果一致,但是从查询效率上来讲,两种用法inner join 效率更高,因为left join 需要在表结果查询完毕后再去执行where 条件 ,而inner join 在连接过程中就对结果进行了限制。
在这里插入图片描述
3、left anti join
a left anti join b 的功能是在查询过程中,剔除a表中和b表有交集的部分,如下:

select 
        a.district_2,
        a.city_name,
        count(1) as cnt  
from sql_practice_1 as a 
left anti join (
    select 
            distinct 
            city_id,
            city_name 
    from dim_area_info
    where 
            city_name = '北京市'
    ) as b on a.district_2 = b.city_id
group by 
        a.district_2,
        a.city_name;

结果如下:输出的结果中没有北京市的数据
在这里插入图片描述
其实inner join 和 left anti join 的效果功能,都可以使用left join 最后在where中加以限制的方式进行实现,但是这样的做法会导致查询效率变低;以上便是我工作中经常使用的三种连接查询方式,大家有啥其他好的招式欢迎评论区留言。

你可能感兴趣的:(Hive,hive)