在工作中彻底理解mysql inner join和left join的区别

本文是在视频的文稿,如果想边看视频的解说的,边阅读该文稿,欢迎到B站观看,点击以下链接即可跳转到视频所在地:

https://www.bilibili.com/video/BV1YW4y1q7Et?is_story_h5=false&share_from=ugc&share_medium=android&share_plat=android&share_source=WEIXIN&share_tag=s_i&timestamp=1662093859&unique_k=ZANrjxM

sql脚本原料准备如下:

①准备三个表。

订单表、快递表、物流记录表,关系如下:

一个订单有可能会被拆分为多个物流快递(当一个订单太大的时候,根据大小和重量选择不同的快递)

一个快递有多个物流记录。

②给三个表加上记录

1、含义解释和区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

inner join(等值连接) 只返回两个表中连接字段相等的行

通俗话语区别:

Inner join 就是取两个表共有的行记录

Left join 就是取左表+共有

-这个结果给大家留下一个猜想,猜对结果大家就可以看出来两者的区别了。

       -如果想边看这篇文章,边实际操作sql脚本的话,可关注“大宝宏说java”公众号,回复“内连接”关键字即可领取。

2、工作中的理解

上面的解释可能你觉得很简单,其实在工作中会没有这么简单的,例如当有3个或者3个以上的表进行连接的时候,使用不同的链接不知道你会不会迷糊。

1、问题

①查找到有物流记录的所有订单信息、快递信息、物流记录。

-为什么第一条语句是错误的,第二条语句正确?结果我这边就不发上来了,我这边直接说结论:

第一条语句有两个left join会以

t1,t2表为主表,找出所有的记录,所以会显示出没有物流记录的所有的订单信息和快递信息。

第二条语句都是inner join会得到以最后的t3表行记录为准的记录,所以只会查出有物流记录信息的所有的信息。

②查找到订单2021年到2022的所有订单信息、快递信息、物流信息。

-由于语句较多,这里就不一一写出具体的结果,感兴趣的同学可以拿到sql脚本去体会一下不同sql语句得到的结果,纸上得来终觉浅,绝知此事要躬行,如果同学可以理解这个结果的由来,你就会明白这两者在工作中使用的区别了,不会再纠结用inner还是left的了。

2、以上总结

①如果有3个表连接的话,都是inner join 产生的结果是以最后一个表的记录决定的,所以只能查出最后一个表的全部信息,1,2表的没有相连接的id将会被淹没,无法找到相关的信息。

②使用left join是会保留1,2表的信息的。

3、工作最佳实践

①当多表连接需要1表的全部记录,则使用left join,不需要的话,则建议使用inner join。

②在工作中4个表以上的连接不建议这样使用,1方面是性能有问题,可能会使索引失效,2方面就是关联太紧密了,对后续的迁移可能会不良的影响。

最后

这是一道高频初级面试题,建议大家像我目录那样说,一方面体现你的基础知识,另一方面体现你在工作中实践过,有自己的体会,是值得加分的。

如果需要相关的上述的相关的sql语句脚本和文本稿件,欢迎关注“大宝宏说java”公众号,回复“内连接”关键字即可领取,如果在学习的过程中有什么疑问,欢迎发消息给我公众号后台哦,有消息必回复。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值