SQL - IN 与 EXISTS



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

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 运算符返回真;否则,返回假。

示例

首先,让我们使用以下查询创建一个名为 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 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

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

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

输出

执行以上查询后,输出显示为:

姓名 薪资
Ramesh 2000.00
Khilan 1500.00
Kaushik 2000.00

SQL EXISTS 运算符

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

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

我们可以将 EXISTS 运算符与 **SELECT**、**UPDATE**、**INSERT** 和 **DELETE** 查询一起使用。

语法

以下是 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 );

该表将创建如下:

EID 姓名 年龄 城市 联系方式
1 Varun 32 Ahmedabad 12345
2 Mahesh 22 Kashmir 34235
3 Suresh 43 Kerala 12355

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

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

输出

以下是上述查询的输出:

姓名 年龄
Ramesh 32
Komal 22

IN 与 EXISTS

下表总结了 IN 和 EXISTS 之间的所有区别:

序号 IN EXISTS
1

它应用于 SQL 查询以删除多个 OR 条件。

它用于查找子查询中的数据是否真正存在。

2

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

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

3

它可用于比较空值,因为它返回真、假和空值。

它不能用于比较空值,因为它只返回真和假值。

4

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

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

5

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

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

广告