sqlserver多表连接查询时and 和where的区别

沫林 2021-01-05 02:26:56
例:
1、select * from tab_1 a inner join tab_2 b on a.id = b.cid and b.name = '张'
2、select * from tab_1 a inner join tab_2 b on a.id = b.cid where b.name = '张'

第一种是在on后面写and,第二种直接写where,我感觉这两种查询出来的结果应该是一样的,都是对查询出来的结果进行筛选,但是执行之后差距很大,有没有大佬能解释一下呢?
...全文
281 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2021-01-12
  • 打赏
  • 举报
回复
你说的“执行之后差距很大”是指什么?
  • 打赏
  • 举报
回复
实际跑了才知道~ 不然都是推测
沫林 2021-01-12
  • 打赏
  • 举报
回复
你的意思是在on后面接and跟写where是一个意思?
晴天8 2021-01-05
  • 打赏
  • 举报
回复
1、select * from tab_1 a inner join tab_2 b on a.id = b.cid and b.name = '张' 如果 b.name 有合理的索引 on 是会在 join 之前筛选的。 比如会按照下列步骤查询: (1) select * from tab_2 b where b.name='张' 变成b表 (2)join on a.id = b.id 所以,如果and条件中有较好的索引可以大幅度去重,那么这种方法是会快很多的。 2、select * from tab_1 a inner join tab_2 b on a.id = b.cid where b.name = '张' 这种方式就是先 a 和 b的全表join,然后得出的结果集 再去筛选 b.name ='张',自然感觉就慢不少 理论是这样,但现在有些优化器非常强大,可能2的方式 也会被引用到1的执行计划方式去

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧