**左外链接:**以左表为主,返回左表中的全部数据,在返回右表与共有键关联的数据,若右表中无数据则返回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里面指定两表的关联键,只要符合键值相等的都会出现在结果里,一对一,一对多,多对多等几种情况
- 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条件在on后面执行,对on筛选的结果记录再做筛选
由此得出结论:
1.ON条件是在生成临时表的时候使用,不管ON中的条件是否为真,都会返回左表的记录
2.WHER条件是在临时表生成好之后,再对临时表进行过滤,这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
推荐做法: on只进行连接操作,where只过滤中间表记录
- 有 is null和is not null的情况
(1)当条件写在on中


(2)当条件写在where中


where …IS NULL…子句将从匹配阶段后的数据中过滤掉不满足匹配条件的数据行,is null否定匹配条件,is not null肯定匹配条件
本文详细介绍了MySQL中的LEFT JOIN操作,包括左外连接的一对一、一对多和多对多情况,并探讨了ON与WHERE子句的使用区别。在LEFT JOIN中,左表过滤应放在WHERE条件,右表过滤应在ON条件,以确保结果准确。同时讨论了IS NULL和IS NOT NULL在条件中的应用。
406

被折叠的 条评论
为什么被折叠?



