WHERE或JOINs的条件?

时间:2015-09-02 16:22:46

标签: mysql

假设我有以下问题:

SELECT occurs.*, events.*
FROM occurs
    INNER JOIN events ON (events.event_id = occurs.event_id)
WHERE event.event_state = 'visible'

执行相同查询并获得相同结果的另一种方法是:

SELECT occurs.*, events.*
FROM occurs
    INNER JOIN events ON (events.event_id = occurs.event_id
        AND event.event_state = 'visible')

我的问题。有真正的区别吗?比另一个快一点吗?为什么我会选择另一种方式呢?

1 个答案:

答案 0 :(得分:2)

对于INNER JOIN,将条件放在ONWHERE之间没有任何概念上的区别。通常的做法是将ON用于将一个表中的键与另一个表中的外键(例如event_id)连接起来的条件,以便维护代码的其他人可以查看表的关联方式

如果您怀疑数据库引擎错误地优化了查询计划,则可以双向尝试。确保对查询进行多次计时以隔离缓存的效果,并确保运行ANALYZE TABLE occursANALYZE TABLE events以向优化程序提供有关密钥分发的更多信息。如果确实发现了差异,请使用数据库引擎EXPLAIN生成它的查询计划。如果存在严重错误优化,您可以创建Oracle帐户并提交针对MySQL的功能请求,以更好地优化特定查询。

但是对于LEFT JOIN,有一个很大的区别。如果细节存在,LEFT JOIN通常用于从单独的表中添加详细信息,如果不存在,则返回没有详细信息的行。如果NULL的行没有匹配两个条件,则此查询将返回b.* b个值的结果行:

SELECT a.*, b.*
FROM a
LEFT JOIN b
ON (condition_one
    AND condition_two)
WHERE condition_three

虽然这个将完全省略与condition_two不匹配的结果:

SELECT a.*, b.*
FROM a
LEFT JOIN b ON some_condition
WHERE condition_two
  AND condition_three

此答案中的代码为双重许可:CC BY-SA 3.0MIT License as published by OSI