+ -
当前位置:首页 → 问答吧 → join中on和where区别

join中on和where区别

时间:2011-11-12

来源:互联网

我在回答这个时候
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分.

作者: xiaolinyouni   发布时间: 2011-11-12

select a.*,
b.result 
from t1 a  
left join t2 b on a.uId=b.uId and a.class='1'
-------t1表全显示

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

t1表显示Class=1的全部数据

要限制T1表的结果集,可以在where后果加

在 left join后面加,只是根据条件显示T2是否null

作者: roy_88   发布时间: 2011-11-12

如果改为 inner join 时,结果集相同


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

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

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

作者: roy_88   发布时间: 2011-11-12

测试下就知道了

作者: myselfff   发布时间: 2011-11-12

SQL code
select a.*,b.result 
from 
t1 a 
left join t2 b on 1=0


SQL code
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表的显示

作者: roy_88   发布时间: 2011-11-12

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

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

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

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

作者: AcHerat   发布时间: 2011-11-12

引用 5 楼 acherat 的回复:

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

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

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

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


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

很不错,我先看看,如果我还不明白再回来问各位.

作者: xiaolinyouni   发布时间: 2011-11-12

引用 6 楼 xiaolinyouni 的回复:
引用 5 楼 acherat 的回复:

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

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

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

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


嗯,R神的回答比较宽泛,可叹我还是理解不能啊.
根据小……
不错

作者: ssp2009   发布时间: 2011-11-12

应该是检索的顺序不一样吧。
帮顶,mark下。

作者: tangguangqiang   发布时间: 2011-11-12

inner join 中的on条件
和where条件是一样的
left join 和right join 就不一样了

作者: pengxuan   发布时间: 2011-11-12