MYSQL - IN和EXIST之间的区别

时间:2010-10-22 17:59:40

标签: sql mysql database exists

MySql问题:

在MySql中进行子查询时,[NOT] IN和[NOT] EXIST之间有什么区别。

2 个答案:

答案 0 :(得分:11)

EXISTS

EXISTS字面意思是检查是否存在指定的标准。在当前的标准SQL中,它允许您指定多个标准进行比较 - IE如果您想知道col_a和col_b何时匹配 - 这使得它比IN子句强一点。 MySQL IN支持元组,但语法不可移植,因此EXISTS是可读性和可移植性的更好选择。

EXISTS要注意的另一件事是它如何操作 - EXISTS返回一个布尔值,并在第一个匹配时返回一个布尔值。因此,如果您正在处理重复/倍数,EXISTS将比IN或JOIN更快地执行,具体取决于数据和需求。

IN

IN是OR子句的语法糖。虽然它非常适应,但是在处理这种比较的许多值时存在问题(在1000之下)。

不是

NOT运算符只是反转逻辑。

子查询与JOIN

“总是使用连接”的口头禅是有缺陷的,因为如果父项有多个子记录,JOIN可能会使结果集膨胀。是的,你可以使用DISTINCT或GROUP BY来处理这个问题,但这很可能会带来使用JOIN的性能优势。了解您的数据以及您对结果集的要求 - 这些是编写表现良好的SQL的关键。

重申知道何时以及为何知道使用什么 - 如果比较的列不可为空 ,LEFT JOIN IS NULL是MySQL 上最快的排除列表,否则不是IN / NOT EXISTS是更好的选择。

参考:

答案 1 :(得分:3)

他们的工作方式截然不同:

  • EXISTS接受一个应该是子查询(派生表)的参数,并检查子查询是否返回了至少一行。
  • IN有两个参数,第一个应该是单个值(或元组),第二个是子查询或元组,并检查第一个值是否包含在第二个。

然而,两者都可用于检查表A中的行是否在表B中具有匹配的行。除非您小心并且知道您在做什么,否则我将在MySQL中保持清除,因为它通常会使性能更差。更复杂的查询。使用NOT EXISTS或LEFT JOIN ... WHERE ... IS NULL。