Mysql 条件句在哪里或在哪里连接?

Mysql 条件句在哪里或在哪里连接?,mysql,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 =

假设我有以下查询:

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')

我的问题。真的有区别吗?一条路比另一条快吗?为什么我会选择一种方式而不是另一种方式?

对于
内部联接
,在
中设置条件与在
中设置条件在概念上没有区别。对于将一个表中的键连接到另一个表中的外键的情况,通常使用
ON
,例如
事件id
,以便维护代码的其他人可以查看表之间的关系

如果您怀疑您的数据库引擎错误地优化了查询计划,您可以尝试两种方法。确保对查询进行多次计时以隔离缓存的影响,并确保运行
分析表发生
分析表事件
以向优化器提供有关键分布的更多信息。如果发现差异,请让数据库引擎解释它生成的查询计划。如果存在严重的错误优化,您可以创建一个Oracle帐户并针对MySQL提交一个功能请求,以更好地优化特定查询

但是对于
左连接
,有很大的区别。如果存在详细信息,则通常使用
左联接
从单独的表中添加详细信息;如果不存在详细信息,则返回没有详细信息的行。如果
b
中没有一行符合以下两个条件,则此查询将返回
NULL
值为
b.*
的结果行:

SELECT a.*, b.*
FROM a
LEFT JOIN b
ON (condition_one
    AND condition_two)
WHERE condition_three
然而,这一项将完全忽略与条件二不匹配的结果:

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

此答案中的代码是双重许可的:或者。

如果数据库将向您显示差异,则对这两个查询执行一个执行计划!第二个更快。特别是如果在每次查询之前都有
event.event\u state
indexedad
EXPLAIN
。它将向您展示查询优化器如何运行它以及使用的索引。另外,我很确定这些是相同的。相关: