Sql 简明教程

SQL - IN vs EXISTS

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

The SQL IN Operator

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

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

Syntax

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

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

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

Example

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

NAME

AGE

ADDRESS

SALARY

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、2 或 3 的行检索 CUSTOMERS 表中的 NAME 和 SALARY 列。

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

Output

在执行上述查询后,输出显示为 −

Name

Salary

Ramesh

2000.00

Khilan

1500.00

Kaushik

2000.00

The SQL EXISTS Operator

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

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

我们可以在 SELECTUPDATEINSERTDELETE 查询中使用 EXISTS 运算符。

Syntax

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

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

Example

首先,考虑 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

NAME

AGE

CITY

CONTACT

1

Varun

32

Ahmedabad

12345

2

Mahesh

22

Kashmir

34235

3

Suresh

43

Kerala

12355

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

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

Output

以下是以上查询的输出:

NAME

AGE

Ramesh

32

Komal

22

IN vs EXISTS

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

S.No.

IN

EXISTS

1

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

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

2

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

如果值匹配,则显示给定值的数据。如果满足条件,则它将终止进一步的进程。

3

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

无法用于比较空值,因为它仅返回 true 和 false 值。

4

可与子查询和值一起使用。

只能与子查询一起使用。

5

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

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