SQL EXISTS运算符
SQL EXISTS运算符用于验证SQL表中是否存在特定记录。在使用此运算符时,我们需要使用子查询来指定要检查存在性的记录。
EXISTS运算符在SELECT语句的WHERE子句中使用,根据另一个表中相关记录的存在与否来过滤记录。
- 它是一个逻辑运算符。
-
它返回一个布尔值TRUE或FALSE。
-
如果子查询返回至少一条记录,它将返回TRUE。
-
如果EXISTS运算符返回TRUE,外部查询将被执行;否则不执行。
-
它可以在SELECT、UPDATE、DELETE或INSERT语句中使用。
EXISTS运算符比其他运算符(例如IN)更高效,因为它只需要确定子查询是否返回任何行,而不是实际返回数据。
在许多实际应用场景中,使用EXISTS运算符可以高效地过滤数据,包括根据相关数据的存在性过滤记录、根据相关记录的存在性聚合数据以及优化查询。
语法
SQL EXISTS运算符的基本语法如下:
WHERE EXISTS (subquery);
其中,使用了 子查询 的SELECT语句。如果子查询在其结果集中返回至少一条记录,则EXISTS运算符将评估为TRUE;否则为FALSE。
使用EXISTS运算符与SELECT语句
SQL中的SELECT语句用于从一个或多个数据库表中检索数据。我们可以使用EXISTS运算符与SELECT语句一起使用,以检查满足特定条件的行是否存在。
示例
为了更好地理解,让我们考虑包含客户个人详细信息(包括姓名、年龄、地址和薪水等)的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 (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (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 | MP | 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);
insert INTO CARS VALUES(4, 'VOLVO', 2250000);
insert INTO CARS VALUES(7, 'Toyota', 2400000);
如果你试图使用SELECT查询检索表的内容,表将如下所示显示−
+----+--------------+---------+
| 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);
输出
产生的结果如下:
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+
使用UPDATE语句使用EXISTS运算符
我们还可以在UPDATE语句中使用SQL EXISTS运算符。它可以根据另一个表中匹配行的存在来更新表中的行。
示例
假设我们想要在之前创建好的CUSTOMERS和CARS表中更改某些客户的名称,可以使用UPDATE语句来完成。在此示例中,我们使用EXISTS运算符将所有id与车辆表的id相等的客户的名称更改为’Kushal’,如下所示:
UPDATE CUSTOMERS
SET NAME = 'Kushal'
WHERE EXISTS (SELECT NAME FROM CARS WHERE CUSTOMERS.ID = CARS.ID);
输出
我们得到以下结果。我们可以观察到有3行被修改了 –
(3 rows affected)
验证
我们可以通过使用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 | MP | 4500.00 |
| 7 | Kushal | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
从上表中可以看出,‘Khilan’、‘Chaitali’和‘Muffy’的名字已经更新为‘Kushal’。
在DELETE语句中使用EXISTS操作符
在SQL中,可以使用EXISTS操作符与DELETE语句一起使用,根据子查询返回的行的存在来删除行。
示例
在这里,我们尝试删除CUSTOMERS表中id等于CARS表中价格等于‘2250000’的id的行。
DELETE FROM customers
WHERE EXISTS (SELECT * FROM cars WHERE cars.id = customers.id AND cars.price = 2250000);
输出
我们得到以下结果。我们可以观察到已经删除了1行-
(1 row affected)
验证
我们可以使用以下查询来纠正对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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
如上表所示,由于顾客表中Chaitali的id为‘4’,与车辆表中价格为‘2250000’的id相同,因此名为‘Chaitali’的行已被删除。
使用NOT运算符和EXISTS运算符
在SQL中,使用NOT EXISTS运算符可以从一个表中选择在另一个表中不存在的记录。
语法
以下是在SQL中使用NOT EXISTS运算符的基本语法:
WHERE NOT EXISTS (subquery);
其中,使用的子查询是SELECT语句。
示例
以下查询给出了没有购买任何汽车的客户的名称。
Select * from CUSTOMERS
WHERE NOT EXISTS (SELECT * FROM CARS WHERE CUSTOMERS.ID = CARS.ID);
输出
执行上述查询后,获得如下输出结果 –
+----+----------+-----+-----------+----------+
| 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 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
SQL EXISTS运算符的使用
在SQL中,EXISTS运算符被广泛用于根据另一个表中相关数据的存在来过滤记录的真实场景。一些常见的用例包括:
- 检查多对多关系中记录的存在 - EXISTS运算符可以用于检查多对多关系的连接表中是否存在记录,例如,找到购买了特定产品的所有客户。
-
根据相关记录的存在来筛选记录 - EXISTS运算符可以用于根据另一个表中相关记录的存在来筛选记录。例如,找到所有有关联订单明细的订单。
-
基于相关记录的存在对数据进行聚合 - EXISTS运算符可用于基于相关记录的存在对数据进行聚合。例如,找到已经下过订单的客户数量。
-
优化查询 - EXISTS运算符可以通过只返回必要的数据来优化查询。例如,找到每个客户的第一个订单,而不使用自连接。
这些只是现实场景中使用EXISTS运算符的一些例子。具体用例将取决于数据和查询的要求。