join中on和where区别

苦苦的潜行者 2011-11-12 02:42:08
我在回答这个时候
http://topic.csdn.net/u/20111112/13/d57807be-ae58-4fdd-8477-a6b559103d23.html
遇到了left join中on和where的区别问题,而且我也在这迷惑了.
select a.*,b.result from t1 a
left join t2 b on a.uId=b.uId and a.class='1'
-------
select a.*,b.result from t1 a
left join t2 b on a.uId=b.uId where a.class='1'
我上网查了一下,说法各不相同.
都说inner join中on和where是效果一样的,但是和其他join情况效果不一样
能不能给个比较准确的说法,说明inner join和outer join情况下on和where的筛选过程

囧,最多只能给100分.
...全文
2429 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦苦的潜行者 2011-11-15
  • 打赏
  • 举报
回复
结贴,
虽然大家都能说个差不多,但是还是我在6楼的搜到的两篇文章说的比较详细,如果你也比较模糊地话不妨去看一下。多谢大家喽
禁用F3 2011-11-13
  • 打赏
  • 举报
回复
加深了我的印像了,顶楼主
我一直是这样理解的
where过滤,ON连接条件,left,right以哪个表为主表.
大力水手 2011-11-13
  • 打赏
  • 举报
回复
出了连接条件和过滤条件的区别!还有就是执行顺序的先后不一样..on在前.where在后.意识就是先按on的条件把两张表连接..然后where去除不符合条件的项
Rotel-刘志东 2011-11-13
  • 打赏
  • 举报
回复
where是过滤的条件,on连接的条件。
yubofighting 2011-11-13
  • 打赏
  • 举报
回复
where是筛选条件,处理顺序在on和join之后

对于外连接肯定是不一样的
koumingjie 2011-11-13
  • 打赏
  • 举报
回复
假如a表有100条记录,class='1' 的有五十条记录
left on a.class='1' 就是用a表的五十条记录关联b表

而where a.class='1'时,是先用a表的100条记录关联b表后,在从中筛选出a.class='1'
我腫了 2011-11-13
  • 打赏
  • 举报
回复
on是过滤被联接的表的结果集
where 是过滤整个查询语句的结果集
叶子 2011-11-12
  • 打赏
  • 举报
回复
on是连接的条件
where是过滤的条件。
shanguotao20 2011-11-12
  • 打赏
  • 举报
回复
如何可以,请不要在join中加入非连接条件 如 on x=x and y=1这样的语句,
Join时有个隐含的算法join 这三个分别是loop, hash 和merge 在你研究了这三个算法对join的影响以后,在对索引连接表时的性能有一定的把握以后,你就能更加明白where中放入限制语句的和join中放入限制语句的性能上的巨大差异。
-晴天 2011-11-12
  • 打赏
  • 举报
回复
我记得2000的联机丛书还有这样一句话,意思是说不推荐使用 where 作为联结的查询方式,因为在有时候它可能会产生二义性.
-晴天 2011-11-12
  • 打赏
  • 举报
回复
如果你查一下SQL2000的联机丛书,它里面就有这样一段话:
在 ON 子句中可能有仅涉及一个联接表的谓词。这样的谓词也可能出现在查询中的 WHERE 子句中。尽管这种谓词的放置在 INNER 联接中不会产生差别,但是在涉及 OUTER 联接时可能会导致不同的结果。这是因为 ON 子句中的谓词在应用于联接之前先应用于表,而 WHERE 子句在语意上应用于联接结果。

--小F-- 2011-11-12
  • 打赏
  • 举报
回复
ON... AND...这样是把AND连接的两个条件都作为了过滤条件

ON...WHERE 这样是先用ON后面的条件过滤 再与WHERE 后的匹配 执行顺序都不一样了
pengxuan 2011-11-12
  • 打赏
  • 举报
回复
inner join 中的on条件
和where条件是一样的
left join 和right join 就不一样了
习惯性蹭分 2011-11-12
  • 打赏
  • 举报
回复
应该是检索的顺序不一样吧。
帮顶,mark下。
快溜 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaolinyouni 的回复:]
引用 5 楼 acherat 的回复:

直接是join的话ON后的条件写到where后边是没错的。

如果是 left join right join 的话,楼主要多注意些:

看看你left join后的表是先筛选还是和主表连接后再进行筛选,一个逻辑的先后顺序问题。

你可以去看看SQL查询的执行顺序就了解了。


嗯,R神的回答比较宽泛,可叹我还是理解不能啊.
根据小……
[/Quote]不错
苦苦的潜行者 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acherat 的回复:]

直接是join的话ON后的条件写到where后边是没错的。

如果是 left join right join 的话,楼主要多注意些:

看看你left join后的表是先筛选还是和主表连接后再进行筛选,一个逻辑的先后顺序问题。

你可以去看看SQL查询的执行顺序就了解了。
[/Quote]

嗯,R神的回答比较宽泛,可叹我还是理解不能啊.
根据小三的提示我找到如下两篇文章,很不错
T-SQL查询处理执行顺序(一)
T-SQL查询执行顺序(二)

很不错,我先看看,如果我还不明白再回来问各位.
AcHerat 元老 2011-11-12
  • 打赏
  • 举报
回复
直接是join的话ON后的条件写到where后边是没错的。

如果是 left join right join 的话,楼主要多注意些:

看看你left join后的表是先筛选还是和主表连接后再进行筛选,一个逻辑的先后顺序问题。

你可以去看看SQL查询的执行顺序就了解了。
中国风 2011-11-12
  • 打赏
  • 举报
回复
select a.*,b.result 
from
t1 a
left join t2 b on 1=0


select a.*,b.result 
from
t1 a
left join t2 b on a.uId=1 and a.uId=b.uId



楼主在原贴这样查看结果集,left join t2...条件是限制t2表的列用不用显示,条件成立时显示,不成立时显示null,不影响t1表的显示
学习中------- 2011-11-12
  • 打赏
  • 举报
回复
测试下就知道了
中国风 2011-11-12
  • 打赏
  • 举报
回复
如果改为 inner join 时,结果集相同


LEFT JOIN 或 LEFT OUTER JOIN。
左向外部联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某一行在右表中没有匹配行,则在关联的结果集行中,来自右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN
右向外部联接是左向外部联接的反向联接。将返回右表的所有行。如果右表的某一行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN
完整外部联接将返回左表和右表中的所有行。当某一行在另一个表中没有匹配行时,另一个表的选择列表列将包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
加载更多回复(1)

34,590

社区成员

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

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