mysql为什么我的left join之后比查单表数据行更多?

 


【1】问题情况

  

 结果1:812815  结果2:812864    

为什么?不是 left join 怎么都会是左表的全集吗?怎么还能比全表多出来不少?

【2】解析

(2.1)当辅助表比 left join 主表匹配行多时

  很明显,这个问题是因为  on 中的条件 tv.ticket 与 tvr.ticket 并不是一一对应且唯一,辅助表 tvr.ticket 必定是有重复值多行存在。

   tv.ticket 1 对  tvr.ticket 多,甚至是多对多,所以左表会多出行来,不然匹配上的难道你哪一行不要吗?

不信?举个例子看看,如下图:

  

  我们可以看到,t1表是 left join 左表,那么它只有 1 2 3 ,3行,但在匹配过程中 t2 表有值 3个1

  3个1都匹配上了左表的,按照匹配上的笛卡尔积,每一次匹配都会对应生成一行,也就是生成 1*3 行

  最终结果当然是3个1。

要是再来一个,左表 t1 是2个1,右表 t2  还是3个1,那么就会配置后值笛卡尔积道理生成 2*3 的6行数据

  

(2.2)当辅助表比 left join 主表匹配行少时

我们改成 right join ,那么 t2为主表,如下图,我们发现情况还是一样的。

  

【3】结论

1、left join 时,只有当主表与辅助表的关联条件所在字段没有重复值时,即均为 1对1 或 1对0,那么显示的才是主表全表内容。

2、无论是 left join 还是 right join ,在关联条件所在值是 1 对 多、多对多时,那么针对匹配的该值,都是 1*N 或 N*N ;具体见(2.1)案例

 

posted @   郭大侠1  阅读(3699)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2021-09-01 kafka运维命令大全
2020-09-01 【等待优化】如何定位网络性能问题 ASYNC_NETWORK_IO 等待
2020-09-01 (4.48)sql server添加列并使用默认值填充已有记录
2020-09-01 【sql server安全】sql server列加密查询性能问题及解决方案
2020-09-01 【sql server安全】sql server使用混合密钥实现列加密
2020-09-01 【sql server安全】sql server使用非对称秘钥实现列加密
2020-09-01 【sql server安全】sql server使用对称秘钥实现列加密
点击右上角即可分享
微信分享提示