SQL - IN 与 EXISTS


在 SQL 中,我们使用 IN 运算符来简化查询并减少对多个 OR 条件的需要。它允许我们将一个值与一个值列表进行匹配。另一方面,EXISTS 运算符检查子查询中是否存在一行或多行,并根据此条件返回 true 或 false。如果子查询找到至少一行,则 EXISTS 运算符返回 true;否则,返回 false。

SQL IN 运算符

SQL 中的 IN 运算符用于检查特定值是否与给定集合中的任何值匹配。这组值可以单独指定或从子查询中获取。我们可以将 IN 运算符与 WHERE 子句结合使用来简化查询并减少多个 OR 条件的使用。

假设我们有一个名为 CUSTOMERS 的表,并且希望根据客户 ID 检索客户详细信息。在这种情况下,我们可以使用 IN 运算符和 WHERE 子句来获取这些特定 ID 的详细信息。

句法

以下是 SQL IN运算符的语法 -

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

在上面的语法中,column_name 匹配每个值(value1、value2、... valueN)。如果发生匹配,则 IN 运算符返回 true;否则为假。

例子

首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表 -

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

现在,使用 INSERT INTO 语句将记录添加到上面创建的表中,如下所示 -

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

该表将创建如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

以下查询从 CUSTOMERS 表中检索 ID 为 1、2 或 3 的行的 NAME 和 SALARY 列。

SELECT NAME, SALARY FROM CUSTOMERS WHERE ID IN(1, 2, 3);

输出

执行上面的查询时,输出显示为 -

姓名 薪水
拉梅什 2000.00
基兰 1500.00
考希克 2000.00

SQL EXISTS 运算符

EXISTS 运算符用于查找给定表中是否存在满足一组条件的行。它是一个布尔运算符,将子查询的结果与现有记录进行比较并返回 true 或 false。

如果子查询获取单个或多个记录,则返回值为 true;如果没有记录匹配,则返回 false。EXISTS运算符遵循查询效率的特点,即当检测到第一个真实事件时,它将自动停止进一步处理。

我们可以将 EXISTS 运算符与SELECTUPDATEINSERTDELETE查询一起使用。

句法

以下是 SQL EXISTS 运算符的基本语法 -

SELECT column_name FROM table_name
WHERE EXISTS (
   SELECT column_name FROM table_name
   WHERE condition 
);

例子

首先,考虑 CUSTOMERS 表,并使用以下查询创建另一个名为 EMPLOYEES 的表 -

CREATE TABLE EMPLOYEES (
   EID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   CITY CHAR (25),
   CONTACT INT,       
   PRIMARY KEY (EID)
);

现在,让我们使用 INSERT INTO 语句将一些记录插入到 EMPLOYEES 表中,如下所示 -

INSERT INTO EMPLOYEES VALUES 
(1, 'Varun', 32, 'Ahmedabad', 12345),
(2, 'Mahesh', 22, 'Kashmir', 34235 ),
(3, 'Suresh', 43, 'Kerala', 12355 );

该表将创建如下 -

伊德 姓名 年龄 城市 接触
1 瓦伦 32 艾哈迈达巴德 12345
2 马赫什 22 克什米尔 34235
3 苏雷什 43 喀拉拉邦 12355

在下面的查询中,我们使用 EXISTS 运算符来获取 AGE 与 EMPLOYEES 表中的 AGE 相同的 CUSTOMERS 的姓名和年龄。

SELECT NAME, AGE 
FROM CUSTOMERS 
WHERE EXISTS(
   SELECT * FROM EMPLOYEES 
   WHERE CUSTOMERS.AGE = EMPLOYEES.AGE
);

输出

以下是上述查询的输出 -

姓名 年龄
拉梅什 32
科马尔 22

IN 与 EXIST

下表总结了 IN 和 EXISTS 之间的所有差异 -

编号 存在
1

它应用于SQL查询中去除多个OR条件。

用于判断子查询中的数据是否真实存在。

2

它执行 IN 块中包含的所有值。

如果值匹配,则显示给定值的详细信息。如果满足条件,它将终止进一步的过程。

3

它可用于比较 null 值,因为它返回 true、false 和 null 值。

它不能用于比较 null 值,因为它仅返回 true 和 false 值。

4

它可以与子查询以及值一起使用。

它只能与子查询一起使用。

5

当子查询较小时,执行速度会更快。

当子查询较大时,执行速度会更快。因为它比 IN 更高效并且仅返回布尔值。