MySQL语句使用之LEFT JOIN(1)

本文详细介绍了MySQL中的LEFT JOIN操作,包括左外连接的一对一、一对多和多对多情况,并探讨了ON与WHERE子句的使用区别。在LEFT JOIN中,左表过滤应放在WHERE条件,右表过滤应在ON条件,以确保结果准确。同时讨论了IS NULL和IS NOT NULL在条件中的应用。

**左外链接:**以左表为主,返回左表中的全部数据,在返回右表与共有键关联的数据,若右表中无数据则返回NULL

select * from 表1 Left JOIN 表2 ON 表1.字段 = 表2.字段 	-- 

以下有两个表数据
在这里插入图片描述
在这里插入图片描述
一对一
对t_name和t_age表进行left_join操作,关键键为id, t_name表有6条记录,t_age有3条记录,且关键的键是唯一的,因此最终结果以t_name表为准有6条记录,t_age表有3条记录关联不上,相应的记录中,t_age表所有的字段都为空。
一对多

一对多
以t_age为左表,关联条件为dt,基础表有三条数据,但是与dt为2019-09-05相等的右表有3条数据满足条件,因此最终结果会有3条2019-09-05的记录,同理2019-09-06会有4条记录满足条件,而2019-09-07没有条件满足,则返回NULL即可
在这里插入图片描述
多对多
以t_name为左表,关联条件为dt, t_age为右表,2019-09-06的记录最终有4条,同样是因为满足了条件,最终记录也会包括2019-09-07,对应的右表中没有对应这条记录的返回NULL即可
多对多

右外链接:以左表为主,返回右表中的全部数据,若左表中无数据则返回NULL,

select * from 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段 	where条件 -- 

.1.在on里面指定两表的关联键,只要符合键值相等的都会出现在结果里,一对一,一对多,多对多等几种情况

  1. ON和Where的区别
    如果想对右表进行限制,则一定要在on条件中进行,若在where中进行则可能导致数据缺失,导致左表在右表中无匹配的行在最终结果中不出现。
    如果没有where条件,无论on条件对左表进行怎样的限制,左表的每一行都至少会有一行的合成结果,对左表而言,若右表没有对应的行,则右表遍历结束后,会用一行NULL来生成数据,而这个数据是多余的。所以对左表进行过滤必须用where

结论
在left join语句中,左表过滤必须放where条件中,右表过滤必须放在on条件中,这样结果中才能不多不少,刚刚好

(1)只有一个on的条件
一对一就是只有一个on的条件,最终输出以左表为准,右表匹配不上补null,但可能会有多对多情况
(2)有两个on的条件
在这里插入图片描述
上图是在关联条件中增加了b.tage = 24输出的结果,由于对b表进行了限制,满足条件的只有一个,由于没有where条件,因此依然要以左表为准,又因为是一对一,所以输出的还是左表的数据。
(3)有where的情况
有where的情况
从上图可知where条件在on后面执行,对on筛选的结果记录再做筛选
由此得出结论:
1.ON条件是在生成临时表的时候使用,不管ON中的条件是否为真,都会返回左表的记录
2.WHER条件是在临时表生成好之后,再对临时表进行过滤,这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

推荐做法: on只进行连接操作,where只过滤中间表记录

  1. 有 is null和is not null的情况
    (1)当条件写在on中
    在这里插入图片描述
    在这里插入图片描述
    (2)当条件写在where中
    在这里插入图片描述
    在这里插入图片描述
    where …IS NULL…子句将从匹配阶段后的数据中过滤掉不满足匹配条件的数据行,is null否定匹配条件,is not null肯定匹配条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸宁七s

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值