【发布时间】:2017-01-30 04:28:20
【问题描述】:
所以我正在测试 2 个查询,我得到了不同的结果。我想纠正/补充我的理解。这是两个通用 SQL 查询,据我了解,它们是相同的,但执行时会得到不同的结果。请注意,这不是关于 diff between ANSI and non-ANSI SQL 的问题。
查询 1(使用 LEFT JOIN):
SELECT * FROM person p LEFT JOIN person_log pl
ON p.person_id = pl.person_id
WHERE pl.person_id IS NULL
AND p.is_active = 1;
查询 2(使用 2 个查询):
SELECT * FROM person
WHERE person.is_active = 1
AND person_id NOT IN (SELECT person_id FROM person_log);
据我了解,两者都是represent this in venn diagram form。另外,一个比另一个更有效吗? JOIN 的查询结果与 2 个查询?
编辑:在查询 1 中将 = 更改为 IS。感谢 @Justin Samuel 发现导致不同结果的 = 错误!
【问题讨论】:
-
在没有优化器介入的情况下,在 lees 高级数据库上,#1 应该更快且可扩展。优化器应该将 #2 转换为 #1
-
连接不能用维恩图正确表示,只是直观解释的一种简化方式
-
@Bohemian 这并不总是正确的。如果
person_log表的person_id列中有NULLs,那么结果会完全不同 -
同意它们通常是相同的,但是正如 Lamak 指出的那样,如果 person_id 在 person_log 中可能为空,那么您将不会得到您想要的结果。 NOT EXISTS 可能比这两种方法都快。加上这种是重复的:stackoverflow.com/questions/173041/not-in-vs-not-exists
-
@Matt 您的链接适用于 SQL Server,如果我在 MySQL 中没记错的话,
NOT EXISTS解决方案通常比LEFT JOIN慢