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

标签 mysql sql performance inner-join

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

SELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'

但我不小心运行了这个查询

SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'

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

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

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

谢谢!

最佳答案

对于像这样的内部连接,它们在逻辑上是等价的。但是,您可能会遇到 join 子句中的条件与 where 子句中的条件含义不同的情况。

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

select x.id
from x
       left join y
         on x.id = y.id
;

这里我们从 x 中获取所有行,而不管 y 中是否有匹配的 id。现在假设我们的连接条件增长 - 我们不仅根据 id 还在 y 中寻找匹配项,而且还根据 id_type。

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

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

不过,这是非常不同的:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

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

长话短说:对于内部连接,条件去哪里并不重要,但对于外部连接,它可以。

关于mysql - WHERE 子句或 ON 子句中的 INNER JOIN 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196223/

相关文章:

mysql - 多个MySQL操作对表交互

使用 2 个内连接时 MySQL 查询未返回预期行数

php - 如何将博客从非 WordPress 迁移到 WordPress

SQL Server - 如果列以字符串开头,则选择 bool 值

Python Pandas Dataframe 有效地更新值

java - 为什么 Spring Boot MVC 总是从我的表单返回 null 值?

sql - 获取关联记录时如何减少 Ruby on Rails 3 中的 SQL 查询数量

mysql - 具有多个最终用户的 SQL 数据库体系结构

具有扩展状态对象的 C# A* 算法

java - 我想在 Windows 上的 ColdFusion 中使用 WMI 或 Java 来获取性能数据