内连接:ON子句与where子句中的过滤条件不同

时间:2015-03-10 06:52:58

标签: mysql inner-join

我执行了这些查询

SELECT *
FROM A
INNER JOIN B ON coalesce(A.a1,'') = coalesce(B.a1,'') and A.a1 <> '';
                                                       /\
                                                       ||
                                              Condition in On Clause

SELECT *
FROM A
INNER JOIN B ON coalesce(A.a1,'') = coalesce(B.a1,'') WHERE A.a1 <> '';
                                                       /\
                                                       ||
                                              Condition in Where Clause

并得到不同的结果?

我想了解将过滤条件置于开启条款与 条款中的条件

之间的区别是什么

哪一个在性能方面更好?

更新

示例数据

两个表中的

a1为空''

Now with 1st Query i am getting no Rows --> 0 Rows

but with my 2nd Queries i am getting multiple Rows --> 1251 Rows

2 个答案:

答案 0 :(得分:0)

他们不一样。

考虑以下问题:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID AND Orders.ID=12345

第一个将返回订单及其行(如果有),订单号为12345.第二个将返回所有订单,但只有订单12345将包含与之关联的任何行。

使用INNER JOIN,子句有效等效。然而,仅仅因为它们在功能上是相同的,因为它们产生相同的结果,并不意味着这两种从句具有相同的语义。

我的意思是:

- 内连接无关紧要

- 外连接的数据

一个。 &#39;其中&#39;条款:加入后。加入后的记录将被过滤。

湾&#39;上&#39;条款 - 加入之前。记录(来自右表)将在加入之前进行过滤,结果可能最终为null(因为OUTER join)。

请参阅这些文章: http://weblogs.sqlteam.com/jeffs/archive/2007/05/14/criteria-on-outer-joined-tables.aspx

https://sites.google.com/site/nosuchmethodexception/database/join/join-vs-where-clause

答案 1 :(得分:0)

在您的第一个查询中,条件&#34;和A.a1&lt;&gt;&#39;&#39; &#34;仅应用于表B.但是,第二个查询中的where条件将应用于A和B.

它对内部连接没有任何影响,但它影响了左连接