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 订购日期
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表中。

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

让我们看一个在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 的记录)。

示例 - 将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 订购日期
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

示例 - 在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 订购日期
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

你可能感兴趣的:(mysql)