1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 一文搞懂两表关联时left join on 以及where条件不同写法对结果的影响--文末有结论

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

时间:2019-10-02 19:57:38

相关推荐

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

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

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

a表:

b表:

建表语句:

Create EXTERNaL TabLEwlz_test_a(

idint,

namestring,

gradeint,

deptint

)

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 TabLEwlz_test_b(

idint,

namestring

)

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 ;

结果:

(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;

结果:

(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条件写了什么结果数据左表一定是完整的,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-结果/0519174908406.png)]

结果:

(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;

结果:

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

3.总结

使用left join时,如果想要的是只保留满足条件的数据,那么过滤条件写在where后;

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。