SQL IN和EXISTS的区别
总体上,为了使查询易于理解或避免在查询中使用多个OR条件,我们使用IN。 SQL中的IN运算符可以将表达式与值列表进行匹配。而EXISTS是用于返回布尔值(即真或假)的运算符。一般而言,如果EXISTS检查子查询中是否有一个或多个行可用,则返回true,否则返回false。
SQL IN
IN运算符用于检查指定值是否与值集中的任何其他值匹配。该值集可以通过单独指定或由任何子查询返回。
IN与WHERE子句一起使用,可以让我们使用多个值。它减少了在SELECT、UPDATE、INSERT和DELETE查询中使用多个OR条件语句的使用。
假设我们有一个名为Customers的表,我们想根据其ID查看客户的详细信息。在这种情况下,我们可以使用IN运算符和WHERE子句来获取这些ID的详细信息。
语法
以下是IN运算符的语法-
SELECT Columns_name FROM table_name WHERE column_name IN (val1, val2, …, valN);
在上述语法中,column_name与每个值(val1,val2,… valN)匹配。如果匹配发生,则IN的值为真,否则IN的值为假。
示例
在以下示例中,我们正在创建一个SQL查询,该查询将从ID为1、2或3的customers表中获取客户的姓名和工资。
以下是customers表的内容−
+------+----------+------+-----------+--------+
| ID | NAME | AGE | ADDRESS | SALARY |
+------+----------+------+-----------+--------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 3 | kaushik | 23 | Kota | 2000 |
| 4 | Chaitali | 25 | Mumbai | 6500 |
| 2 | Aman | 23 | Ranchi | 40000 |
+------+----------+------+-----------+--------+
以下是用于获取详细信息的SQL查询-
SELECT Name, Salary FROM customers WHERE ID IN(1, 2, 3);
输出
当我们执行上述的SQL查询语句时,我们得到了ID为1、2或3的客户的姓名和工资。
+---------+--------+
| Name | Salary |
+---------+--------+
| Ramesh | 2000 |
| kaushik | 2000 |
| Aman | 40000 |
+---------+--------+
SQL EXISTS
EXISTS操作符用于查找满足一组条件的给定表中的行的存在。它是一个布尔运算符,将子查询的结果与现有记录进行比较,并返回true或false。
如果子查询获取单个或多个记录,则返回值为true,如果没有匹配的记录,则返回false。它与子查询结合使用,检查通过此子查询是否返回了行。
EXISTS操作符遵循查询的效率特性。当检测到第一个真事件时,它将自动停止进一步处理。
我们可以将EXISTS操作符与SELECT、UPDATE、INSERT和DELETE查询一起使用。
语法
SELECT column_name FROM table_name
WHERE EXISTS(
SELECT column_name FROM table_name
WHERE condition );
示例
在以下的 SQL 查询中,我们正在从员工表中获取与年龄匹配的客户的姓名和年龄。
以下是客户表 –
+------+----------+------+-----------+--------+
| ID | NAME | AGE | ADDRESS | SALARY |
+------+----------+------+-----------+--------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 3 | kaushik | 23 | Kota | 2000 |
| 4 | Chaitali | 25 | Mumbai | 6500 |
| 2 | Aman | 23 | Ranchi | 40000 |
+------+----------+------+-----------+--------+
以下是员工表 –
+-----+-------+-----+--------+------------+
| EID | NAME | AGE | CITY | C_Phone |
+-----+-------+-----+--------+------------+
| 1 | Aman | 23 | Ranchi | 1122567800 |
| 2 | Vivek | 25 | Ranchi | 9304567890 |
+-----+-------+-----+--------+------------+
以下是显示记录的SQL查询语句:-
SELECT NAME, AGE FROM customers WHERE EXISTS( SELECT * FROM employeeS WHERE customers.AGE = employees.AGE);
输出
执行上述SQL查询时,如果两个表的年龄列匹配,使用exists运算符获得客户的姓名和年龄。
+----------+------+
| NAME | AGE |
+----------+------+
| kaushik | 23 |
| Chaitali | 25 |
| Aman | 23 |
+----------+------+
IN vs EXISTS
以下是IN与EXISTS的区别:
序号 | IN条件 | EXISTS条件 |
---|---|---|
1 | 用于SQL查询,删除多个OR条件。 | 用于判断子查询中的数据是否真正存在。 |
2 | 执行IN块中包含的所有值。 | 如果匹配该值,显示给定值的详细信息。如果条件满足,将终止进一步的处理。 |
3 | 可用于对null值进行比较,因为它返回true、false和null值。 | 不能用于对null值进行比较,因为它只返回true和false值。 |
4 | 可与子查询和值一起使用。 | 只能与子查询一起使用。 |
5 | 当子查询较小时执行较快。 | 当子查询较大时执行较快,因为它比IN更高效,只返回布尔值。 |