本SQL教程解释了如何使用SQL EXISTS条件和语法和示例。
如果子查询返回至少一行,则SQL EXISTS条件与子查询结合使用并被视为满足。它可以在SELECT,INSERT,UPDATE或DELETE语句中使用。
SQL中EXISTS条件的语法是:
WHERE EXISTS ( subquery );
子查询
该子查询是一个SELECT语句。如果子查询在其结果集中返回至少一个记录,则EXISTS子句将计算为true,并且将满足EXISTS条件。如果子查询未返回任何记录,则EXISTS子句将评估为false,并且不会满足EXISTS条件。
如果您想要学习本教程,请使用DDL创建表,使用DML填充数据。然后在您自己的数据库中尝试示例!
让我们首先看一个示例,该示例演示如何将SELECT语句与EXISTS条件一起使用。
在此示例中,我们有一个包含以下数据的customers表:
顾客ID | 姓 | 名字 | favorite_website |
---|---|---|---|
4000 | 杰克逊 | 乔 | techonthenet.com |
5000 | 工匠 | 简 | digminecraft.com |
6000 | 弗格森 | 萨曼莎 | bigactivities.com |
7000 | 雷诺兹 | 艾伦 | checkyourmath.com |
8000 | 安德森 | 佩奇 | 空值 |
9000 | 约翰逊 | 德里克 | techonthenet.com |
还有一个名为orders的表,其中包含以下数据:
ORDER_ID | 顾客ID | 订购日期 |
---|---|---|
1 | 7000 | 2016年4月18日 |
2 | 5000 | 2016年4月18日 |
3 | 8000 | 2016年4月19日 |
4 | 4000 | 2016年4月20日 |
现在让我们找到customers表中的所有记录,其中orders表中至少有一条记录具有相同的customer_id。输入以下SELECT语句:
SELECT *
FROM customers
WHERE EXISTS
(SELECT *
FROM orders
WHERE customers.customer_id = orders.customer_id);
将选择4条记录。这些是您应该看到的结果:
顾客ID | 姓 | 名字 | favorite_website |
---|---|---|---|
4000 | 杰克逊 | 乔 | techonthenet.com |
5000 | 工匠 | 简 | digminecraft.com |
7000 | 雷诺兹 | 艾伦 | checkyourmath.com |
8000 | 安德森 | 佩奇 | 空值 |
在此示例中,客户中有4条记录,其中customer_id值显示在orders表中。
让我们看一个在UPDATE语句中使用EXISTS条件的示例。
在这个例子中,我们有一个名为products的表,其中包含以下数据:
PRODUCT_ID | 产品名称 | CATEGORY_ID |
---|---|---|
1 | 梨 | 50 |
2 | 香蕉 | 50 |
3 | 橙子 | 50 |
4 | 苹果 | 50 |
五 | 面包 | 75 |
6 | 火腿切片 | 25 |
7 | 薄纸 | 空值 |
还有一个名为summary_data的表,其中包含以下数据:
PRODUCT_ID | current_category |
---|---|
1 | 10 |
2 | 10 |
3 | 10 |
4 | 10 |
五 | 10 |
现在让我们使用products表中的值更新summary_data表。输入以下SQL语句:
UPDATE summary_data
SET current_category = (SELECT category_id
FROM products
WHERE products.product_id = summary_data.product_id)
WHERE EXISTS (SELECT category_id
FROM products
WHERE products.product_id = summary_data.product_id);
将有5条记录更新。再次从summary_data表中选择数据:
SELECT * FROM summary_data;
这些是您应该看到的结果:
PRODUCT_ID | current_category |
---|---|
1 | 50 |
2 | 50 |
3 | 50 |
4 | 50 |
五 | 75 |
8 | 10 |
此示例将使用product_id值匹配的products表中的category_id更新summary_data表中的current_category字段。summary_data表中的前5个记录已更新。
提示:如果我们没有包含EXISTS条件,则UPDATE查询会在summary_data表的第6行中将current_category字段更新为NULL (因为products表没有product_id = 8 的记录)。
让我们看一个在DELETE语句中使用EXISTS条件的示例。
在这个例子中,我们有一个名为customers的表,其中包含以下数据:
顾客ID | 姓 | 名字 | favorite_website |
---|---|---|---|
4000 | 杰克逊 | 乔 | techonthenet.com |
5000 | 工匠 | 简 | digminecraft.com |
6000 | 弗格森 | 萨曼莎 | bigactivities.com |
7000 | 雷诺兹 | 艾伦 | checkyourmath.com |
8000 | 安德森 | 佩奇 | 空值 |
9000 | 约翰逊 | 德里克 | techonthenet.com |
还有一个名为orders的表,其中包含以下数据:
ORDER_ID | 顾客ID | 订购日期 |
---|---|---|
1 | 7000 | 2016年4月18日 |
2 | 5000 | 2016年4月18日 |
3 | 8000 | 2016年4月19日 |
4 | 4000 | 2016年4月20日 |
五 | 空值 | 2016年5月1日 |
输入以下DELETE语句:
DELETE FROM orders
WHERE EXISTS
(SELECT *
FROM customers
WHERE customers.customer_id = orders.customer_id
AND customers.last_name = 'Jackson');
将删除1条记录。再次从订单表中选择数据:
SELECT * FROM orders;
这些是您应该看到的结果:
ORDER_ID | 顾客ID | 订购日期 |
---|---|---|
1 | 7000 | 2016年4月18日 |
2 | 5000 | 2016年4月18日 |
3 | 8000 | 2016年4月19日 |
五 | 空值 | 2016年5月1日 |
此示例将删除orders表中的所有记录,其中customers表中的记录包含last_name的'Jackson'和两个表中匹配的customer_id值。在此示例中,删除了order_id = 4 的记录。
如果要确定要删除的行数,可以在执行删除之前运行以下SELECT语句。
SELECT COUNT(*) FROM orders
WHERE EXISTS
(SELECT *
FROM customers
WHERE customers.customer_id = orders.customer_id
AND customers.last_name = 'Jackson');
这将返回执行DELETE语句时将删除的记录数。
计数(*) |
---|
1 |
最后,NOT条件可以与EXISTS条件组合以创建NOT EXISTS条件。让我们看一个示例,说明如何在SQL中使用NOT EXISTS条件。
在这个例子中,我们有一个名为customers的表,其中包含以下数据:
顾客ID | 姓 | 名字 | favorite_website |
---|---|---|---|
4000 | 杰克逊 | 乔 | techonthenet.com |
5000 | 工匠 | 简 | digminecraft.com |
6000 | 弗格森 | 萨曼莎 | bigactivities.com |
7000 | 雷诺兹 | 艾伦 | checkyourmath.com |
8000 | 安德森 | 佩奇 | 空值 |
9000 | 约翰逊 | 德里克 | techonthenet.com |
还有一个名为orders的表,其中包含以下数据:
ORDER_ID | 顾客ID | 订购日期 |
---|---|---|
1 | 7000 | 2016年4月18日 |
2 | 5000 | 2016年4月18日 |
3 | 8000 | 2016年4月19日 |
4 | 4000 | 2016年4月20日 |
五 | 空值 | 2016年5月1日 |
输入以下SQL语句:
SELECT *
FROM customers
WHERE NOT EXISTS
(SELECT *
FROM orders
WHERE customers.customer_id = orders.customer_id);
将选择2条记录。这些是您应该看到的结果:
顾客ID | 姓 | 名字 | favorite_website |
---|---|---|---|
6000 | 弗格森 | 萨曼莎 | bigactivities.com |
9000 | 约翰逊 | 德里克 | techonthenet.com |
这个例子将返回从所有记录的客户表,其中有没有在记录订单表给出CUSTOMER_ID。