MySQL 中 EXISTS 的使用

Posted

技术标签:

【中文标题】MySQL 中 EXISTS 的使用【英文标题】:Usage of EXISTS in MySQL 【发布时间】:2015-03-27 20:28:39 【问题描述】:

编辑 2: 我想问的是:如果我理解正确,EXISTS 语句不会过滤关系中的任何元组。那么它的用途是什么,因为它不过滤任何元组?

编辑: 为了详细说明,在第一个示例中,子查询中存在以下内容:

cities_stores.store_type = stores.store_type

但据我了解,如果子查询计算结果为TRUE,那么将返回的是all DISTINCT store_types FROM stores,对吗?如果是这样,那有什么用?


Here,声明[NOT] EXISTS 语句将评估为TRUEFALSE。在链接中存在的两个示例中,如果我假设第一个示例的EXISTS 语句和第二个示例的NOT EXISTS 语句将评估为TRUE,那么这些示例应该等同于以下内容:

示例 1:

SELECT DISTINCT store_type FROM stores
  WHERE TRUE;

示例 2:

SELECT DISTINCT store_type FROM stores
  WHERE TRUE;

如果是这种情况,那么两个查询是等效的,前提是它们的 [NOT] EXISTS 语句的计算结果为 TRUE。所以我的问题是,使用[NOT] EXISTS 语句有什么用?它们是如何工作的?如果我说的有误,请您指出错误的地方并解释[NOT] EXISTS 语句是如何工作的?

【问题讨论】:

根据他们的例子,力量是子查询正在做的事情 获取所有没有链接到另一个表的记录。这是一个有用的不存在查询 你在做某事。当 EXISTS 从外部 SELECT 引用列时,它似乎确实有一些魔力。 In 宁愿选择看起来更干净的 JOIN。 @Biscuits 谢谢。实际上,如果您有时间详细说明答案,我会很高兴。 @Utku 我不确定我是否有答案。然而,如果我们假装它是一个正常的标量函数,它被多次调用,外部 SELECT 中的每一行调用一次,它返回一个布尔值来指示外部行是保持还是下降,那么与它和平相处会更容易。然后,为了解释逻辑结果,SQL Server 在内部对其进行优化以使其行为类似于 JOIN 的事实应该是微不足道的。 【参考方案1】:

您所指的示例使用相关的子查询。 http://en.wikipedia.org/wiki/Correlated_subquery

这是一个很好的答案,解释了它背后的机制。 https://***.com/a/11592277/2707705

【讨论】:

请记得为您认为有用的答案投票。【参考方案2】:

Exist 语句的作用与

相同
select * from mainTable
Where (select count(*) from subTable where related condition) > 0

但有一个例外,它在第一场比赛后停止

不存在是这句话的自然延伸

【讨论】:

谢谢。实际上我想我无法清楚地说明我想问什么。我想知道的是,据我了解,EXISTS 语句不会过滤 任何元组。那么它如何以及在哪里有用呢? 实际示例,您是bookings.com,用户为您提供了城市和日期范围,您的任务是仅列出那个时代的酒店,一种方法是从city_ID = :CITY_ID 且存在的酒店(从可用性中选择 *,其中 hotel_ID = hotel_FR 和日期介于 :START_DATE 和 :END_DATE 之间),这将仅列出酒店【参考方案3】:

注意子查询"WHERE cities_stores.store_type = stores.store_type" 中的这条语句。它是内表检查外表的地方。在示例中,cities_stores 是内部表,stores 是主查询中的外部表。

编辑 2:我想问的是:如果我理解正确,EXISTS 语句不会从关系中过滤任何元组。那么它的用途是什么,因为它不过滤任何元组?

您要查找的过滤器在子查询中 - "WHERE cities_stores.store_type = stores.store_type"。并非表“商店”中的每条记录都会从子查询中返回 true。

【讨论】:

以上是关于MySQL 中 EXISTS 的使用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中 EXISTS 的使用

MySQL中exists和in的区别及使用场景

在 MySQL 中使用 EXISTS 进行查询的两个条件

浅析MySQL中exists与in的使用 (写的非常好)

mysql exists 的使用

MySQL EXISTS 怎么用呢?