先 JOIN 还是先 WHERE?

颤菊大师 2010-12-30 10:49:19
SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%'


就这句,请问先 JOIN 表1和表2 还是,先过滤表1再关联?
...全文
6877 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
select a.*,b.* from a,b where a._=b._ 这个执行的时候就是一个inner join SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%' SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID and a.Name LIKE 'One%' 这俩个建议用第二个 where 是连接了再过滤,and 先过滤后连接
hughlaw 2012-07-19
  • 打赏
  • 举报
回复
对于inner join来说:
select * from a,b where a.id = b.id and b.id =3;

select * from a inner join b on a.id = b.id and b.id=3;
还有
select * from a inner join b on a.id = b.id where b.id = 3;
是一样嘀。
xzf_fancy 2011-01-02
  • 打赏
  • 举报
回复
先过滤再连接吧
jamk 2011-01-01
  • 打赏
  • 举报
回复

学习了~
zxc1989711 2011-01-01
  • 打赏
  • 举报
回复
SELECT b.* FROM Table1 a JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%
当然是join 在前了, where 在后
a78782295 2010-12-31
  • 打赏
  • 举报
回复
MARK了, 有所获
a635394554 2010-12-31
  • 打赏
  • 举报
回复
虽然说数据库会自动优化,但写的时候还是要注意的,不然又有人费解了。
vina 2010-12-31
  • 打赏
  • 举报
回复
一般情况先join
feilniu 2010-12-31
  • 打赏
  • 举报
回复
真是杯具。LZ看了回复的表情估计就跟头像一样。

首先明确一点:SQL查询的逻辑理解过程与实际的物理执行过程可能是完全不同的
fling_boy 2010-12-31
  • 打赏
  • 举报
回复
数据库会自动优化,两种都一样.
sych888 2010-12-30
  • 打赏
  • 举报
回复
先join再过滤
feilniu 2010-12-30
  • 打赏
  • 举报
回复
LZ要想不被网上的传言所误导,最好自己看书,研究执行计划,自己思考出结论。

《SQL Server 2005技术内幕:T-SQL查询》前两章,相信会对你有帮助。
gdk123 2010-12-30
  • 打赏
  • 举报
回复
先join
颤菊大师 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wwwwgou 的回复:]

顶11楼
#1. 看来INNER JOIN就无所谓了
#2. 其它JOIN的话,最好从小表联接到大表,先WHERE再JOIN为好
[/Quote]

我看完也是真么理解的。
感谢 11 楼的精辟解析!
Shawn 2010-12-30
  • 打赏
  • 举报
回复
顶11楼
#1. 看来INNER JOIN就无所谓了
#2. 其它JOIN的话,最好从小表联接到大表,先WHERE再JOIN为好
dawugui 2010-12-30
  • 打赏
  • 举报
回复
SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%'

SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID and a.Name LIKE 'One%'


/*
标题:SQL中on条件与where条件的区别
作者:爱新觉罗·毓华
时间:2008-07-14
地点:新疆乌鲁木齐
*/

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表1:tab1
id size
1 10
2 20
3 30
表2:tab2
size name
10 AAA
20 BBB
20 CCC

两条SQL:
1、select * from tab1 left join tab2 on tab1.size = tab2.size where tab2.name='AAA'
2、select * from tab1 left join tab2 on tab1.size = tab2.size and tab2.name='AAA'

第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2、再对中间表过滤
where 条件:
tab2.name='AAA'
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA

第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name='AAA'
(条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)

其实以上结果的关键原因就是left join,right join,full join的特殊性,
不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。
而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
andysun88 2010-12-30
  • 打赏
  • 举报
回复 1
我看了执行计划,
SELECT * FROM (SELECT * FROM Table1 WHERE Name LIKE 'One%') a JOIN Table2 b ON a.ID=b.ID

SELECT * FROM Table1 a JOIN Table2 b ON a.ID=b.ID AND a.Name LIKE 'One%'
两个的花销一样的,没有区别,两者都可以。


ohfox 2010-12-30
  • 打赏
  • 举报
回复
where能过滤表数据的话应该是先where把..能先过滤多少数据就过滤多少,至于最后是不是添加外部行,那是外连接干的事情.
不然2个狂大的表join还不崩溃了....
s85118629 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luckyrandom 的回复:]
扯。。。这个例子先Where再JOIN
除非Left Join / Right Join / Full Join 有条件在另一边时才先Join
[/Quote]
你是有点扯。。。
颤菊大师 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luckyrandom 的回复:]

扯。。。这个例子先Where再JOIN
除非Left Join / Right Join / Full Join 有条件在另一边时才先Join
[/Quote]

也就是说,只有 inner join 才是先 WHERE ?
加载更多回复(11)

34,576

社区成员

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

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