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

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

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

a表:
在这里插入图片描述

b表:
在这里插入图片描述
建表语句:
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 ;
结果:
在这里插入图片描述

(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-结果blog.csdnimg.cn/20210519174908406.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后条件只支持等值对比,不支持其他)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
熵 (Entropy) 是信息论中的一个概念,用来衡量随机变量的不确定性。在机器学习中,我们通常使用交叉熵 (Cross-Entropy) 作为损失函数,用来衡量模型预测结果与实际结果之间的差异。 以下是一些关于熵和交叉熵的基本概念和公式。 ## 熵 (Entropy) 熵是一个概率分布的度量,它表示随机变量的不确定性。对于一个离散的随机变量 $X$,其熵的数学定义为: $$H(X)=-\sum_{x\in X}p(x)\log_2p(x)$$ 其中,$p(x)$ 表示随机变量 $X$ 取值为 $x$ 的概率,$\log_2$ 表示以 2 为底的对数。 可以看出,当 $p(x)$ 的分布越均匀(即所有 $x$ 的概率都相等),熵的值最大,达到 $H(X)=\log_2|X|$;当 $p(x)$ 的分布越集中在某些特定的取值上,熵的值越小。 ## 交叉熵 (Cross-Entropy) 交叉熵是用来衡量模型预测结果与实际结果之间的差异的一种损失函数。对于一个离散的随机变量 $Y$,其真实分布为 $p(Y)$,模型预测的分布为 $q(Y)$,则交叉熵的数学定义为: $$H(p,q)=-\sum_{y\in Y}p(y)\log_2q(y)$$ 可以看出,当模型的预测结果与真实结果越接近,交叉熵的值越小。 ## 交叉熵在机器学习中的应用 在机器学习中,我们通常使用交叉熵作为分类模型的损失函数。对于一个分类问题,我们需要将输入 $x$ 分类到 $k$ 个类别中的一个,并且每个类别都对应一个概率值 $p_i$,表示输入 $x$ 属于第 $i$ 个类别的概率。设模型的预测结果为 $q_1,q_2,...,q_k$,表示输入 $x$ 属于每个类别的概率预测值,则其交叉熵的数学定义为: $$H(p,q)=-\sum_{i=1}^kp_i\log_2q_i$$ 我们的目标是最小化交叉熵,使得模型的预测结果尽可能接近真实结果,从而提高模型的准确率。 以上就是关于熵和交叉熵的基本概念和公式,希望能对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值