WHERE子句或ON子句中的INNER JOIN条件?

chi*_*NUT 6 mysql sql performance inner-join

我今天错误地输入了一个查询,但它仍然有效,并给出了预期的结果.我打算运行这个查询:

SELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'
Run Code Online (Sandbox Code Playgroud)

但我不小心跑了这个查询

SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'
Run Code Online (Sandbox Code Playgroud)

(注意AND而不是WHERE在最后一个子句中)

并且都从用户ID返回了正确的员工ID.

这两个查询有什么区别?第二种形式是否只加入满足条件的2个表的成员,而第一个表是否会加入整个表,然后运行查询?一个比另一个更有效还是更低效?这是我缺少的其他东西吗?

谢谢!

yie*_*ood 6

对于这样的内连接,它们在逻辑上是等价的.但是,您可以运行join子句中的条件意味着与where子句中的条件不同的情况.

作为一个简单的例子,假设您像这样进行左连接;

select x.id
from x
       left join y
         on x.id = y.id
;
Run Code Online (Sandbox Code Playgroud)

这里我们将从x中获取所有行,无论y中是否存在匹配的id.现在让我们假设我们的连接条件增长 - 我们不只是根据id而是在id_type上查找y中的匹配.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;
Run Code Online (Sandbox Code Playgroud)

无论y中是否存在匹配(id,id_type),这都会给出x中的所有行.

但这是非常不同的:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们选择x的所有行并尝试匹配y中的行.现在对于y中没有匹配的行,y.id_type将为null.因此,不满足y.id_type ='some type',因此丢弃那些没有匹配的行,这有效地将其转换为内连接.

长话短说:对于内连接而言,条件在哪里并不重要,但对于外连接它可以.