【问题标题】:MYSQL - Difference between IN and EXISTMYSQL - IN 和 EXIST 的区别
【发布时间】:2011-04-29 07:32:48
【问题描述】:

MySql 问题:

在MySql中做子查询时[NOT] IN和[NOT] EXIST有什么区别。

【问题讨论】:

    标签: sql mysql database exists


    【解决方案1】:

    存在

    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 是更好的选择。

    参考:

    【讨论】:

      【解决方案2】:

      它们的工作方式非常不同:

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

      但是,两者都可以用于检查表 A 中的行是否在表 B 中具有匹配的行。除非您小心并且知道自己在做什么,否则我会在 MySQL 中避免使用 IN,因为它通常在更复杂的查询。使用 NOT EXISTS 或 LEFT JOIN ... WHERE ... IS NULL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2015-12-25
        • 2022-10-18
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        相关资源
        最近更新 更多