SQL连接过滤条件,mysql

时间:2012-02-23 19:19:20

标签: mysql sql join filter where-clause

我有两个看起来像这样的表(这是我实际拥有的一个例子)。

表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如何执行操作的更一般的问题。

1 个答案:

答案 0 :(得分:3)

这取决于您的表格的顺序和where的顺序。在这种情况下,之后执行的地方。因此,以相反的顺序声明表会更有效,因为你有table1的where子句。

你这样做的方式,table1中的所有行都使用on-clause与table2中的行连接,以缩小它。然后,最后,在连接的结果上使用where子句。但是,像这样:

   select avg(Value2) v2 
     from table1 
left join table2 on (year(dte)=yr) 
    where Value>1 
 group by ID;

首先在table1上执行where子句,然后使用on-clause执行连接。这是在已经减少的table1版本上完成的,因此效率更高。