所有这些SQL连接在逻辑上是否相同?

时间:2009-02-23 17:08:53

标签: sql join

我只是想知道以下所有连接是否在逻辑上等效,如果没有,为什么不呢?

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a where t1.b=t2.b and t1.c = t2.c;

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b where t1.c = t2.c;

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;

我想我的真正问题是:将“where”与“on”结合起来做一些不同于只有多个条件的东西与“on”结合在一起吗?

我与MySQL合作,以防万一。

4 个答案:

答案 0 :(得分:5)

它们在逻辑上是等价的,应该产生相同的结果。但是,最后一个是首选的,因为它更准确地说明了查询的语义 - 即“连接表t1和t2”。

WHERE子句应该用于“过滤”连接的结果 - 例如

... WHERE t2.some_col > 10

另外,正如康斯坦丁在另一个答案中所说,如果连接是一个OUTER连接,则4个查询会有所不同。

答案 1 :(得分:2)

对于INNER JOIN,它没有任何逻辑差异,优化器应该生成相同的计划。但是对于OUTER连接,将条件放在WHERE或FROM ... JOIN子句中变得很重要。这是因为在WHERE子句之前处理FROM和ON子句: ANSI SQL logical query processing http://www.sqlmag.com/Files/09/94378/Figure_01.jpg

答案 2 :(得分:2)

是的,正如其他人所说,所有这些查询的结果都是一样的。

FWIW,当您对两个表中相同的列名进行等连接时,也可以使用此简写语法:

SELECT t1.x, t2.y from t1 join t2 using (a, b, c);

就优化而言,进行优化。也就是说,RDBMS应该足够智能,以便分析WHERE语法相同,并执行连接,而不是生成中间巨大的交叉连接结果并对其应用过滤条件。这是一种常见的查询类型,对于给定的RDBMS实现来说,识别和优化它也很常见。

在MySQL的情况下,加入和在哪里(种类)一起评估。尝试使用EXPLAIN分析您的查询。如果“type”列表示“eq_ref”,则表示它正在使用索引联接。这是关于优化的最佳连接类型。如果“type”为“ref”,那也很好。

无论是将条件放在JOIN...ON子句还是WHERE子句中,都可以获得这些连接优化类型。

答案 3 :(得分:1)

它们在逻辑上是等价的。但是,定义连接条件的位置会对应用了where子句的临时表中使用的记录数量产生影响。也就是说,

如果表t1,t2和t3各有10条记录,则声明

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;

产生1000条记录,表示三个表记录的排列,然后应用where子句。

有关

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;

在应用任何where子句(在本例中为none)之前,临时表中只有10条记录。使用大型表时,第二种方法要快得多。