mysql 子关联查询之 EXISTS 和 NOT EXISTS(二)

SQL:EXISTS条件

本SQL教程解释了如何使用SQL EXISTS条件和语法和示例。

描述

如果子查询返回至少一行,则SQL EXISTS条件与子查询结合使用并被视为满足。它可以在SELECT,INSERT,UPDATE或DELETE语句中使用。

句法

SQL中EXISTS条件的语法是:

WHERE EXISTS ( subquery );

参数或参数

子查询

子查询是一个SELECT语句。如果子查询在其结果集中返回至少一个记录,则EXISTS子句将计算为true,并且将满足EXISTS条件。如果子查询未返回任何记录,则EXISTS子句将评估为false,并且不会满足EXISTS条件。

注意

  • 使用EXISTS条件的SQL语句效率非常低,因为子查询将重新运行外部查询表中的每一行。有更有效的方法来编写大多数查询,不使用EXISTS条件。

例子的DDL / DML

如果您想要学习本教程,请使用DDL创建表,使用DML填充数据。然后在您自己的数据库中尝试示例!

示例 - 将EXISTS条件与SELECT语句一起使用

让我们首先看一个示例,该示例演示如何将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订购日期
170002016年4月18日
250002016年4月18日
380002016年4月19日
440002016年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表中。

示例 - 将EXISTS条件与UPDATE语句一起使用

让我们看一个在UPDATE语句中使用EXISTS条件的示例。

在这个例子中,我们有一个名为products的表,其中包含以下数据:

PRODUCT_ID产品名称CATEGORY_ID
150
2香蕉50
3橙子50
4苹果50
面包75
6火腿切片25
7薄纸空值

还有一个名为summary_data的表,其中包含以下数据:

PRODUCT_IDcurrent_category
110
210
310
410
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_IDcurrent_category
150
250
350
450
75
810

此示例将使用product_id值匹配的products表中的category_id更新summary_data表中的current_category字段。summary_data表中的前5个记录已更新。

提示:如果我们没有包含EXISTS条件,则UPDATE查询会在summary_data表的第6行中将current_category字段更新为NULL (因为products表没有product_id = 8 的记录)。

示例 - 将EXISTS条件与DELETE语句一起使用

让我们看一个在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订购日期
170002016年4月18日
250002016年4月18日
380002016年4月19日
440002016年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订购日期
170002016年4月18日
250002016年4月18日
380002016年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

示例 - 在EXISTS条件下使用NOT

最后,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订购日期
170002016年4月18日
250002016年4月18日
380002016年4月19日
440002016年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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值