Sql 简明教程

SQL - EXISTS Operator

The SQL EXISTS Operator

SQL EXISTS 运算符用于验证特定记录是否存在于 MySQL 表中。使用此运算符时,我们需要使用子查询指定记录(你需要检查其是否存在)。

EXISTS 运算符用于 WHERE clauseSELECT 语句中,根据另一表中相关记录的存在来筛选记录。

  1. 这是一个逻辑运算符。

  2. 它返回一个布尔值 TRUE 或 FALSE。

  3. 如果子查询返回至少一条记录,它将返回 TRUE。

  4. 如果 EXISTS 运算符返回 TRUE,则将执行外部查询;否则不执行。

  5. 它可以用在 SELECT、UPDATE、DELETE 或 INSERT 语句中。

在许多实际场景中,使用 EXISTS 运算符是过滤数据的高效方式,包括根据相关数据的是否存在过滤记录,根据相关记录的存在汇总数据以及优化查询。

Syntax

SQL EXISTS 运算符的基本语法如下所示 −

WHERE EXISTS (subquery);

其中, subquery 是使用的 SELECT 语句。如果子查询在其结果集中返回至少一条记录,则 EXISTS 运算符将评估为 TRUE;否则为 FALSE。

EXISTS Operator with SELECT Statement

SQL中的SELECT语句用于从数据库中一张或多张表中检索数据。我们可以将 EXISTS 运算符与 SELECT 语句一起使用,以检查满足特定条件的行是否存在。

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 语句向此表中插入值:

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

让我们使用以下查询创建另一个表 CARS ,其中包含客户的 id、姓名和汽车价格等详细信息 −

create table CARS(
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   PRICE INT NOT NULL,
   PRIMARY KEY(ID)
);

使用 INSERT 语句,让我们将值插入此表 −

insert INTO CARS VALUES
(2, 'Maruti Swift', 450000),
(4, 'VOLVO', 2250000),
(7, 'Toyota', 2400000);

获得的“CARS”表如下 −

ID

NAME

PRICE

2

Maruti Swift

450000

4

VOLVO

2250000

7

Toyota

2400000

现在,我们正在检索汽车价格大于 2,000,000 的客户列表 −

SELECT * FROM CUSTOMERS WHERE
EXISTS (
   SELECT PRICE FROM CARS
   WHERE CARS.ID = CUSTOMERS.ID AND PRICE > 2000000
);

Output

产生的结果如下 −

ID

NAME

AGE

ADDRESS

SALARY

4

Chaitali

25

Mumbai

6500.00

7

Muffy

24

Indore

10000.00

EXISTS Operator with UPDATE Statement

我们还可以将 SQL EXISTS 运算符与 UPDATE 语句一起使用。它可以帮助我们会根据另一张表中匹配行的存在来更新表中的行。

Example

假设如果我们要更改之前创建的 CUSTOMERS 和 CARS 表中某些客户的姓名,则可以使用 UPDATE 语句来完成此操作。在此,我们正在修改所有 id 等于 CARS 表的 id 的客户的姓名“Kushal”,可以使用 EXISTS 运算符,如下所示 −

UPDATE CUSTOMERS SET NAME = 'Kushal'
WHERE EXISTS (
   SELECT NAME FROM CARS WHERE CUSTOMERS.ID = CARS.ID
);

Output

我们得到以下结果。我们可以观察到,已经修改了 3 行 −

Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0

Verification

我们可以使用 SELECT 语句检索表的內容,以此验证该更改是否反映在表中。下面是在 CUSTOMERS 表中显示记录的查询 −

SELECT * FROM CUSTOMERS;

该表显示如下:

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Kushal

25

Delhi

1500.00

3

Kaushik

23

Kota

2000.00

4

Kushal

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

7

Kushal

24

Indore

10000.00

正如我们在上表中看到的,“Khilan”、“Chaitali”和“Muffy”的 NAME 已更新为“Kushal”。

EXISTS Operator with DELETE Statement

EXISTS 运算符还可以与 DELETE 语句一起使用,以根据子查询返回的行是否存在来删除行。

Example

在此处,我们正在删除 CUSTOMERS 表中的行,该行的 id 等于 CARS 表的 id,且价格等于“2250000” −

DELETE FROM CUSTOMERS WHERE
EXISTS (
   SELECT * FROM CARS
   WHERE CARS.ID = CUSTOMERS.ID AND CARS.PRICE = 2250000
);

Output

我们得到以下结果。我们可以观察到,已经删除了 1 行 −

Query OK, 1 row affected (0.01 sec)

Verification

我们可以使用以下查询来纠正 CUSTOMERS 表中所做的更改:

SELECT * FROM CUSTOMERS;

该表显示如下:

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Khilan

25

Delhi

1500.00

3

Kaushik

23

Kota

2000.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00

正如我们在上表中所看到的,具有 NAME 'Chaitali' 的行已被删除,因为 Chaitali 在 CUSTOMERS 表中的 ID 是 '4',这等于 CARS 表中的 ID,其价格等于 '2250000'。

NOT Operator with EXISTS Operator

在 SQL 中,NOT EXISTS 运算符用于从一个表中选择不存在于另一个表中的记录。

Syntax

以下是 SQL 中 NOT EXISTS 运算符的基本语法:

WHERE NOT EXISTS (subquery);

其中,使用的 subquery 是 SELECT 语句。

Example

以下查询给出了未购买任何汽车的客户的名称:

SELECT * FROM CUSTOMERS WHERE NOT
EXISTS (
   SELECT * FROM CARS WHERE CUSTOMERS.ID = CARS.ID
);

Output

执行以上查询得到以下输出:

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

3

Kaushik

23

Kota

2000.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

Usage of SQL EXISTS Operator

SQL 中的 EXISTS 运算符在现实场景中广泛用于根据另一表中相关数据的存在过滤记录。一些常见的用例包括:

  1. Checking for the existence of records in a many-to-many relationship - EXISTS 运算符可用于检查记录是否存在于多对多关系的连接表中,例如,查找购买了特定产品的客户。

  2. Filtering records based on the existence of related records - EXISTS 运算符可用于根据另一表中相关记录的存在过滤记录。例如,查找具有关联订单详细信息的所有订单。

  3. Aggregating data based on the existence of related records - EXISTS 运算符可用于根据相关记录的存在聚合数据。例如,查找下了订单的客户人数。

  4. Optimizing queries - EXISTS 运算符可以只返回必要的数据来优化查询。例如,在不使用自连接的情况下查找每个客户的第一个订单。

这些只是 EXISTS 运算符在现实场景中如何使用的几个示例。具体用例将取决于数据和查询的要求。