【发布时间】:2011-04-29 07:32:48
【问题描述】:
MySql 问题:
在MySql中做子查询时[NOT] IN和[NOT] EXIST有什么区别。
【问题讨论】:
MySql 问题:
在MySql中做子查询时[NOT] IN和[NOT] EXIST有什么区别。
【问题讨论】:
EXISTS 字面意思是检查指定条件是否存在。在当前的标准 SQL 中,它将允许您指定多个比较标准 - IE,如果您想知道 col_a 和 col_b 何时都匹配 - 这使得它比 IN 子句强一点。 MySQL IN 支持元组,但语法不可移植,因此 EXISTS 是更好的选择,无论是可读性还是可移植性。
关于 EXISTS 需要注意的另一件事是它的操作方式 - EXISTS 返回一个布尔值,并将在第一次匹配时返回一个布尔值。因此,如果您正在处理重复/倍数,EXISTS 将比 IN 或 JOIN 更快地执行,具体取决于数据和需求。
IN 是 OR 子句的语法糖。虽然它非常适合,但在处理该比较的大量值时存在问题(1,000 以北)。
NOT 运算符只是反转逻辑。
“始终使用联接”的口头禅是有缺陷的,因为如果针对父项的子记录不止一个,则 JOIN 可能会夸大结果集。是的,您可以使用 DISTINCT 或 GROUP BY 来处理这个问题,但这很可能会带来使用 JOIN 的性能优势。了解您的数据以及您想要的结果集 - 这些是编写性能良好的 SQL 的关键。
重申知道何时以及为什么知道使用什么 - LEFT JOIN IS NULL 是 MySQL 上最快的排除列表如果比较的列不可为空,否则不IN/NOT EXISTS 是更好的选择。
参考:
【讨论】:
它们的工作方式非常不同:
但是,两者都可以用于检查表 A 中的行是否在表 B 中具有匹配的行。除非您小心并且知道自己在做什么,否则我会在 MySQL 中避免使用 IN,因为它通常在更复杂的查询。使用 NOT EXISTS 或 LEFT JOIN ... WHERE ... IS NULL。
【讨论】: