假设我有以下问题:
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')
我的问题。有真正的区别吗?比另一个快一点吗?为什么我会选择另一种方式呢?
答案 0 :(得分:2)
对于INNER JOIN
,将条件放在ON
和WHERE
之间没有任何概念上的区别。通常的做法是将ON
用于将一个表中的键与另一个表中的外键(例如event_id
)连接起来的条件,以便维护代码的其他人可以查看表的关联方式
如果您怀疑数据库引擎错误地优化了查询计划,则可以双向尝试。确保对查询进行多次计时以隔离缓存的效果,并确保运行ANALYZE TABLE occurs
和ANALYZE 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.0或MIT License as published by OSI。