代码之家  ›  专栏  ›  技术社区  ›  Paulo Coghi

mysql-存在与存在的区别

  •  9
  • Paulo Coghi  · 技术社区  · 14 年前

    MySQL问题:

    在MySQL中进行子查询时,[not]in和[not]之间的区别是什么?

    2 回复  |  直到 14 年前
        1
  •  11
  •   OMG Ponies    14 年前

    存在

    字面上的存在是为了检查特定标准的存在。在当前的标准SQL中,它将允许您指定多个比较标准-例如,如果您想知道col_a和col_b何时匹配-这使得它比in子句更强一些。mysql-in支持元组,但语法不可移植,所以exists是可读性和可移植性的更好选择。

    与exists一起要注意的另一件事是它如何操作-exists返回一个布尔值,并在第一次匹配时返回一个布尔值。因此,如果您处理的是重复/多个,那么exists的执行速度将比in或join快,这取决于数据和需要。

    in是or子句的句法糖。虽然它非常适合,但在处理该比较的大量值方面存在问题(以北1000)。

    不是

    not运算符只是反转逻辑。

    子查询与联接

    “总是使用连接”这句咒语是有缺陷的,因为如果一个父级存在多个子级记录,则连接会增加结果集的风险。是的,您可以使用distinct或group by来处理这个问题,但这很可能会使使用join moot的性能受益。了解您的数据,以及您对结果集的需求——这些是编写性能良好的SQL的关键。

    重申知道何时和为什么要使用左连接是空的,这是MySQL上最快的排除列表。 如果比较的列不可为空 否则不在/不存在是更好的选择。

    参考文献:

        2
  •  3
  •   Mark Byers    14 年前

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

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

    但是,这两种方法都可以用来检查表A中的一行是否在表B中有匹配的行。除非您小心并且知道您在做什么,否则我将在MySQL中避开它,因为它在更复杂的查询中通常会提供更差的性能。使用不存在或左联接…在哪里?为空。