在JOIN上过滤结果的最佳方法是什么(sql)

时间:2016-07-26 15:12:43

标签: mysql sql join

我从一段时间以来就有一个疑问...在sql join中过滤条目的最佳方法是什么....我的意思是,在WHERE子句或连接的ON上更好?

例如,哪个更好?这段代码使用WHERE

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON customer.users_id = visit.CustID
    WHERE visit.active = 1

或者另一种方式(在ON上过滤):

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1)

谢谢。

2 个答案:

答案 0 :(得分:1)

这取决于任何情况的类型。以下是两篇文章: -

第一个作为内部联接,不返回左表中的所有行,包括右表中的null。 where条件返回所有具有visit 1的行。意味着它会从结果中减少所有那些行,这些行具有除1 or null行之外的其他行与左表的对应

实施例: -

custome_id visit
1          1
2          1

第二个返回具有与右表对应的null个条目的行。

实施例: -

custome_id visit
1          1
2          1
3          null
4          null

注意: - 在您的两个语句中,customer_id不能为null,因为它只有左表的o / p。

答案 1 :(得分:1)

从历史上看,使用加入上的语句而不是将其添加到where子句会更有效。

SELECT 
customer.users_id AS CustID, 
FROM customer 
LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1)

在某些情况下,两种情况都可能更有效,但对我来说,我更喜欢在join语句中使用。我相信如果在查询运行时在 where 子句中使用它,则必须对访问表中的所有内容编制索引,然后根据 visit.active =过滤结果1 即可。根据我的经验,它更快地使用和语句以及性能与查询优化器如何索引数据有关。

更新:对于我处理数百万条记录时,我注意到上面提到的更好的性能。如果记录数量较小,则可能没有区别。