SQL IN和EXISTS区别

SQL IN和EXISTS区别

本文介绍了IN和EXISTS子句的完整概述。对于编写SQL查询以过滤特定值的开发人员来说,这是一个最常见的问题。

它们之间的主要区别在于,IN选择一系列匹配的值,而EXISTS返回布尔值TRUE或FALSE 。在进行比较之前,我们先了解这些SQL子句。

SQL IN和EXISTS区别

IN运算符

IN运算符用于在一组值中匹配任何值或由子查询返回的值时检索结果。该运算符允许我们在WHERE子句中指定多个值。它减少了在SELECT、INSERT、UPDATE和DELETE查询中使用多个OR条件的使用;这就是为什么它也被称为多个OR条件的简写形式。

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

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

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

SQL IN和EXISTS区别

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

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

这里是输出结果:

SQL IN和EXISTS区别

EXISTS运算符

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

当EXISTS运算符检测到第一个true事件时,它会自动终止进一步的处理。这个特性增强了查询的效率。我们可以在SELECT、UPDATE、DELETE和INSERT语句中使用EXISTS运算符。以下是EXISTS运算符的语法:

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

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

SQL IN和EXISTS区别

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

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

这里是输出结果:

SQL IN和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 vs. EXISTS比较表

以下比较表以简明的方式解释了它们的主要区别:

SN IN 运算符 EXISTS 运算符
1. 用于减少多个 OR 条件。 用于检查子查询中数据的存在性。换句话说,它确定是否返回值。
2. 比较子查询(子查询)和父查询之间的值。 不比较子查询和父查询之间的值。
3. 扫描 IN 块中的所有值。 在满足单个正条件后停止进一步执行。
4. 可以返回 TRUE、FALSE 或 NULL。因此,我们可以用它来比较 NULL 值。 只返回 TRUE 或 FALSE。因此,我们不能用它来比较 NULL 值。
5. 我们既可以在子查询中使用它,也可以与值一起使用。 只能在子查询中使用它。
6. 当子查询结果较少时执行速度更快。 当子查询结果较大时执行速度更快。它比 IN 更高效,因为它处理布尔值而不是值本身。

IN:

Syntax to use IN clause:
SELECT col_names 
FROM tab_name 
WHERE col_name IN (subquery);

EXISTS:

Syntax to use EXISTS clause:
SELECT col_names
FROM tab_name
WHERE [NOT] EXISTS (subquery);

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程