IN 与 EXISTS区别

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

一、SQL IN 运算符

IN 运算符用于在指定值与一组值中的任何值匹配或由子查询返回时检索结果。该运算符允许我们与WHERE 子句一起指定多个值。它减少了在SELECTINSERTUPDATEDELETE

查询中使用多个 OR 条件;这就是为什么它也被称为多个 OR 条件的简写。

在这个算子中,内层查询首先执行,得到的结果被外层查询用来显示输出。应该记住,内部查询只执行一次。IN 运算符具有以下语法:

SELECT column_name(s)   
FROM table_name   
WHERE column_name IN (value1, value2, - - - - );  

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

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

mysql> SELECT * FROM customer    
WHERE occupation IN ('Doctor', 'Scientist', 'Engineer');  

输出结果为:

二、SQL EXISTS 运算符

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

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

SELECT col_names    
FROM tab_name    
WHERE [NOT] EXISTS (    
    SELECT col_names     
    FROM tab_name     
    WHERE condition    
);    

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

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

mysql> SELECT name, occupation FROM customer    
WHERE EXISTS (SELECT * FROM Orders     
WHERE customer.cust_id = Orders.cust_id);  

输出结果为:

三、IN 和 EXISTS 运算符的主要区别

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

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

四、IN 与 EXISTS 比较表 

以下比较图表快速解释了 IN 与 EXISTS 的主要区别:

IN EXISTS
IN用于最小化多个 OR 条件。 它用于检查子查询中是否存在数据。换句话说,它决定了该值是否会被返回。
IN比较子查询(子查询)和父查询之间的值。 它不比较子查询和父查询之间的值。
IN扫描 IN 块内的所有值。 一旦满足单个肯定条件,它就会停止以进一步执行。
IN可以返回 TRUE、FALSE 或 NULL。因此,我们可以使用它来比较 NULL 值。 它返回 TRUE 或 FALSE。因此,我们不能使用它来比较 NULL 值。
我们可以在子查询以及值上使用它。 我们只能在子查询上使用它。
当子查询结果较少时,它执行得更快。 当子查询结果很大时,它执行得更快。它比 IN 更有效,因为它处理布尔值而不是值本身。

使用 IN 子句的语法:
SELECT col_names
FROM tab_name
WHERE col_name IN (subquery);

使用 EXISTS 子句的语法:
SELECT col_names
FROM tab_name
WHERE [NOT] EXISTS (subquery);

五、结论

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

热门文章

优秀文章