SQL IN和EXISTS区别
本文介绍了IN和EXISTS子句的完整概述。对于编写SQL查询以过滤特定值的开发人员来说,这是一个最常见的问题。
它们之间的主要区别在于,IN选择一系列匹配的值,而EXISTS返回布尔值TRUE或FALSE 。在进行比较之前,我们先了解这些SQL子句。
IN运算符
IN运算符用于在一组值中匹配任何值或由子查询返回的值时检索结果。该运算符允许我们在WHERE子句中指定多个值。它减少了在SELECT、INSERT、UPDATE和DELETE查询中使用多个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');
这里是输出结果:
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
);
让我们通过一个例子来理解这个操作符。假设我们有一个名为 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子句评估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运算符。