我从一段时间以来就有一个疑问...在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)
谢谢。
答案 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 即可。根据我的经验,它更快地使用和语句以及性能与查询优化器如何索引数据有关。
更新:对于我处理数百万条记录时,我注意到上面提到的更好的性能。如果记录数量较小,则可能没有区别。