mysql中inner join和left join使用详解
区别
返回不同
1、inner join只返回两个表中联结字段相等的行
2、left join的数量小于等于左表和右表中的记录数量。
数量不同
1、inner join返回包括左表中的所有记录和右表中联结字段相等的记录。
2、left join的数量以左表中的记录数量相同
记录属性不同
1、inner join不足的记录属性会被直接舍弃
2、left join不足的记录属性用NULL填充
inner join 场景
设计两张表:
- channel 频道表:有频道id、频道name等
- module 模块表:模块id、模块name、channe_id。
页面展示频道时,可能会有新增了一个频道但是没有模块,此时不能用inner join 不然新增的模块查询不出来,所以用left join
select channel.* from channel left join modules on channel.id = modules.channel_id where page_id=1 group by channel.id order by channel.new_sort asc , channel.id desc
1、page_id是指在哪个页面类型下,在频道channel表中定义,用来区分哪个页面类型
2、一个频道id可能有多个模块去关联,所以需要按照频道id进行分组
3、new_sort可以设置频道的排序显示,另外排序相同应该让频道最先创建的显示在前面。
以下这种情况新创建的频道就不会显示,并且没有模块的频道也不会显示。
select channel.* from channel inner join modules on channel.id=modules.channel_id where page_id=1 group by channel.id order by channel.new_sort asc , channel.id desc
最后:有点疑问,频道只做显示频道相关信息,并没有用到关联的模块信息,所以感觉这样也能满足需求了。后续发现问题再更吧~
select channel.* from channel where page_id=1 order by channel.new_sort asc , channel.id desc
额~补充问题,上面遗留的问题是页面上需要查询module的id所以才关联了。
之前还遇到了个inner join 的场景,后续再补~
inner join 场景
新加一个策略表policy_lib 、然后再创建一个中间表channel_policy记录 channel频道和policy_lib策略表关联。
那么显然sql这样写
select policy_lib.id,channel_policy.policy_id,channel_policy.channel_id,channel.id from policy_lib inner join channel_policy on channel_policy.policy_id=policy_lib.id inner join channel on channel.id=channel_policy.channel_id
使用inner join 显然结果查询出来不会有空的情况,如果用left join 万一表中有脏数据,左边有数据右边时空的,在处理的时候还需要考虑是否有空的情况显然不合理。
到此这篇关于mysql中inner join和left join使用详解的文章就介绍到这了,更多相关mysql中inner join和left join内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
在SpringBoot中实现WebSocket会话管理的方案
在构建实时通信应用时,WebSocket 无疑是一个强大的工具,SpringBoot提供了对WebSocket的支持,本文旨在探讨如何在 Spring Boot 应用中实现 WebSocket 会话管理,我们将通过一个模拟的场景一步步展开讨论,需要的朋友可以参考下2023-11-11MySQL sum后再计算percentage的多种解决办法
这篇文章主要介绍了MySQL sum后再计算percentage的多种解决办法,over() 函数,Cross Join,Select 嵌套查询以及 with 函数处理,文中通过代码示例讲解的非常详细,需要的朋友可以参考下2024-06-06
最新评论