【发布时间】:2012-03-14 06:02:45
【问题描述】:
我有两个看起来像这样的表(这是我实际拥有的一个示例)。
表 1:
Yr, Value
1990, 1
1990, 2
1991, 2
1992, 3
表 2:
Dte, Value2, ID
1/1/1990, 10, 1
1/2/1990, 11, 1
1/3/1990, 12, 2
1/1/1991, 20, 1
1/2/1991, 21, 2
我想先使用左连接连接两个表,然后丢弃连接集中的一些值,然后按ID 分组。我写的代码是这样的:
select avg(Value2) v2
from table2
left join table1 on (year(dte)=yr)
where Value>1
group by ID;
是先执行联接,然后where 语句中的过滤条件丢弃合并表中的行,还是先评估 where 条件,然后再评估联接?上面的例子只是为了说明,这是一个关于 SQL 如何进行操作的更普遍的问题。
【问题讨论】:
-
它们在某种程度上是同时完成的,基本逐行操作。实际顺序可能取决于 DBMS 的优化器 - 有时执行 where first 以减少实际需要连接的行数是有意义的。在其他情况下,先加入然后执行 where 过滤器更有意义。
-
只是一个意见,但是您可以通过自己测试轻松找到这种东西。运行带有和不带有 WHERE 子句的查询并比较结果。
-
@MarcB 问题是关于mysql的优化。
-
我很抱歉,因为我认为我不清楚:我对优化不感兴趣,而是对评估顺序感兴趣。我需要先加入,我想知道如何做到这一点。
-
我不具体了解 MySQL,但通常我相信大多数 RDBMS DO NOT 保证订单,因为这可能会限制语句的优化。无论如何最好不要依赖这个。你想要完成什么,你需要
JOIN'首先执行'?或者,也可以将WHERE子句中的条件放入JOIN中(……嘿,值得一试)。
标签: mysql sql join filter where-clause