一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论

一文搞懂两表关联时left join 与 on 以及where条件不同写法对结果的影响–文末有结论

1.数据准备(建议使用本地mysql)

a表:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第1张图片

b表:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第2张图片
建表语句:
Create EXTERNaL TabLE wlz_test_a(
id int,
name string,
grade int,
dept int
)
COMMENT ‘a’
ROW FORMaT DELIMITED
FIELDS TERMINaTED bY ‘\u0001’ ;
插入数据
insert into wlz_test_a(id,name,grade,dept) values(1,‘cid1’,100,10);
insert into wlz_test_a(id,name,grade,dept) values(2,‘cid2’,90,20);
insert into wlz_test_a(id,name,grade,dept) values(3,‘cid3’,60,10);
insert into wlz_test_a(id,name,grade,dept) values(4,‘cid4’,80,10);
insert into wlz_test_a(id,name,grade,dept) values(5,‘cid5’,70,10);

建表语句
CREaTE EXTERNaL TabLE wlz_test_b(
id int,
name string
)
COMMENT ‘a’
ROW FORMaT DELIMITED
FIELDS TERMINaTED bY ‘\u0001’ ;
插入数据:
insert into wlz_test_b(id,name) values(10,‘IT1’);
insert into wlz_test_b(id,name) values(20,‘IT2’);

2.数据查询

2.1 left join + on

根据定义使用left join会保留左表的完整性,即不论on条件后写了什么,结果一定是左表的全部数据
(1)全量匹配
select
a.id,a.name,a.grade,a.dept,b.id,b.name
from
hdp_lbg_supin_zplisting.wlz58_test_a a left outer join hdp_lbg_supin_zplisting.wlz58_test_b b
on
a.dept = b.id ;
结果:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第3张图片

(2)限定a.dept=10
select
a.id,a.name,a.grade,a.dept,b.id,b.name
from
hdp_lbg_supin_zplisting.wlz58_test_a a left outer join hdp_lbg_supin_zplisting.wlz58_test_b b
on
a.dept = b.id
and
a.dept=10;
结果:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第4张图片

(2)限定 b.id=10
select
a.id,a.name,a.grade,a.dept,b.id,b.name
from
hdp_lbg_supin_zplisting.wlz58_test_a a left outer join hdp_lbg_supin_zplisting.wlz58_test_b b
on
a.dept = b.id
and
b.id=10;
结果:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第5张图片

**结论:left join时不论on条件写了什么结果数据左表一定是完整的,on只限定了右表是值还是null。

2.2 配合where 使用left join**

(1)where过滤a.dept=10;
select
a.id,a.name,a.grade,a.dept,b.id,b.name
from
hdp_lbg_supin_zplisting.wlz58_test_a a left outer join hdp_lbg_supin_zplisting.wlz58_test_b b
on
a.dept = b.id
where a.dept=10;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOU2juz0-1621417760244)(https://img-结果blog.csdnimg.cn/20210519174908406.png)]
结果:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第6张图片

(2)where过滤b.id=10
select
a.id,a.name,a.grade,a.dept,b.id,b.name
from
hdp_lbg_supin_zplisting.wlz58_test_a a left outer join hdp_lbg_supin_zplisting.wlz58_test_b b
on
a.dept = b.id
where b.id=10;
结果:
一文搞懂两表关联时left join 、 on 以及where条件不同写法对结果的影响--文末有结论_第7张图片

结论:两种写法均有效,结果一致,使用了where条件后会先过滤再显示,即结果有可能表少(相对于不使用where条件过滤);

3.总结

使用left join时,如果想要的是只保留满足条件的数据,那么过滤条件写在where后;
如果想要的是左表完整,右表与左表匹配不上的部分使用null值表示,那么过滤条件可以写在on后(需要注意的是on后条件只支持等值对比,不支持其他)。

你可能感兴趣的:(hive)