sql join子句位置问题

时间:2011-08-02 03:35:13

标签: mysql join

以下两个SQL之间有什么区别:

select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'

我发现当同一个子句放在不同位置时,结果有时可能会有所不同,甚至更多的sql性能可能会有很大差异。如果我在左连接之后立即使用额外条款或将其放在'where'之后有什么主要区别?

有人可以提供解释吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

让我们重写SQL:

select t1.id, t2.col1
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

select t1.id, t2.col1
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'

在表格中填写数据
t1(id,col2):
1 xxx
2 xxx
3 jjj

t2(col1,col2):
1 uuu
2 xxx
3 xxx

第一次查询的结果:
1 NULL
2 2
第二次查询的结果:
2 2

因此,如果您在'join'中添加任何条件,则可能无法连接连接线,并且连接的结果将为null。

请参阅this链接以了解

答案 1 :(得分:0)

性能肯定会有所不同,当mySQL执行select时,它首先从整个表开始,然后根据它取消某些结果的条件,因此你应该始终使用最具体的一个,即将留下最有可能结果的那个。

答案 2 :(得分:0)

您可以看到以下SQL之间的区别,只需在两个查询前添加“EXPLAIN”即可。即。

EXPLAIN select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

AND

EXPLAIN select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'