IN 与 EXISTS

17 Mar 2025 | 4 分钟阅读

本文解释了 IN 和 EXISTS 子句的完整概述。这是编写 SQL 查询以筛选特定值的开发人员最常问的问题之一。它们之间的主要区别在于 IN 选择匹配值的列表,而 EXISTS 返回布尔值 TRUE 或 FALSE。在进行比较之前,我们将首先了解这些 SQL 子句。

IN vs. EXISTS

IN 运算符

IN 运算符用于当指定值与值集中的任何值匹配或由子查询返回时检索结果。此运算符允许我们 along with the WHERE 子句 指定多个值。它减少了在 SELECTINSERTUPDATEDELETE 查询中使用多个 OR 条件;因此,它也被称为多个 OR 条件的简写。

在此运算符中,内部查询首先执行,然后将获得的结果用于外部查询以显示输出。应记住,内部查询仅执行一次。IN 运算符的语法如下:

让我们举一个例子来理解这个运算符。假设我们有一个名为 customer 的表,其中包含以下数据:

IN vs. EXISTS

如果我们想获取职业是医生、工程师或科学家之一的所有客户详细信息,则可以使用以下语句:

这是输出

IN vs. EXISTS

EXISTS 运算符

EXISTS 是一个布尔运算符,它检查子查询结果并返回 TRUE 或 FALSE 值。它与子查询结合使用,并检查是否通过此子查询返回行。如果子查询返回一个或多个记录,则此运算符返回 TRUE。否则,当没有记录返回时,它会给出 FALSE 结果。

当 EXISTS 运算符检测到第一个 true 事件时,它会自动终止进一步处理。此功能提高了查询的效率。我们可以将 EXISTS 运算符与 SELECT、UPDATE、DELETE 和 INSERT 语句一起使用。以下是 EXISTS 运算符的语法

让我们举一个例子来理解这个运算符。假设我们有一个名为 customerorder 的表,其中包含以下数据:

IN vs. EXISTS

如果我们想获取已下过至少一个订单的所有客户姓名和职业,则可以使用以下语句:

这是输出

IN vs. EXISTS

IN 和 EXISTS 运算符之间的主要区别

以下几点解释了 IN 和 EXISTS 子句之间的主要区别:

  • IN 子句扫描从给定的子查询列中获取的所有记录,而 EXISTS 子句评估 true 或 false,并且 SQL 引擎在找到匹配项后会停止扫描过程。
  • 当子查询结果很大时,EXISTS 运算符提供更好的性能。相反,当子查询结果很小时,IN 运算符比 EXISTS 快。
  • IN 运算符始终选择匹配值的列表,而 EXISTS 返回布尔值 TRUE 或 FALSE。
  • EXISTS 运算符只能与子查询一起使用,而我们可以将 IN 运算符用于子查询和值。
  • EXISTS 子句可以与 NULL 进行所有比较,而 IN 子句无法与 NULL 进行任何比较。
  • IN 运算符在 IN 关键字之前指定的列与子查询结果之间执行直接匹配。相反,EXISTS 运算符不检查匹配项,因为它只验证子查询中的数据存在性。

IN 与 EXISTS 比较图

以下比较图快速解释了它们的主要区别

序号IN 运算符EXISTS 运算符
1.它用于最小化多个 OR 条件。它用于检查子查询中的数据是否存在。换句话说,它确定是否将返回值。
2.它比较子查询(子查询)和父查询之间的值。它不比较子查询和父查询之间的值。
3.它扫描 IN 块内的所有值。一旦满足单个正向条件,它就会停止进一步执行。
4.它可以返回 TRUE、FALSE 或 NULL。因此,我们可以使用它来比较 NULL 值。它返回 TRUE 或 FALSE。因此,我们不能使用它来比较 NULL 值。
5.我们可以将其用于子查询以及值。我们只能将其用于子查询。
6.当子查询结果较小时,它的执行速度更快。当子查询结果较大时,它的执行速度更快。它比 IN 更高效,因为它处理布尔值而不是值本身。
7.
Syntax to use IN clause:
SELECT col_names 
FROM tab_name 
WHERE col_name IN (subquery);
Syntax to use EXISTS clause:
SELECT col_names
FROM tab_name
WHERE [NOT] EXISTS (subquery);

结论

在本文中,我们对 IN 和 EXISTS 运算符进行了比较。在此,我们得出结论,这两个子句的工作目的是相同的,但它们的内部工作方式不同。换句话说,它们在逻辑工作方式上有所不同。我们可以根据需要选择其中任何一个,但如果有一个表包含多条记录(大量数据),最好使用 EXISTS 而不是 IN 运算符。