sql 中的left join 的坑请大家绕着走
背景:
最近工作中一直和sql 打交道,由于平时用的少,也不怎么写多表联查的情况,但是最近项目中存在大量的多表联查的sql,让自己走了一些小坑
- A left join B 中未必A就是小表,或者说A未必是1:N中的 N
A表
name | code |
---|---|
张三 | 001 |
B表
core | code |
---|---|
23 | 001 |
234 | 001 |
select * from a left join B on a.code = b.code
结果 不是一条数据而是2条数据
这个比较好理解,自己当时思维定势导致的 主观认为, 都是小表 left join 大表,
- on 和 where 写条件区别
条件on 和 where 后面写条件有区别吗? 原来只记得 条件尽可能早写,减少数据的过滤
所以经常经条件提前写在on里面 这种未必符合实际条件
A表
name | code | yn |
---|---|---|
张三 | 001 | 1 |
李四 | 002 | 1 |
B表
core | code | yn |
---|---|---|
23 | 001 | 1 |
24 | 001 | 0 |
25 | 002 | 1 |
27 | 002 | 0 |
sql1
select * from b left join a on a.code = b.code
where a.yn = 1 and b.yn = 1
sql2
select * from b left join a on a.code = b.code and b.yn = 1
where a.yn = 1
这2个sql执行的结果是不一样的,自己去验证,这里我说下理论:
on比where起作用更早,,先根据on条件进行多表的连接操作,生成一个临时表再通过where来筛选
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2020-03-27 innodb和myisam对比及索引原理区别