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_type
s FROM stores
,对吗?如果是这样,那有什么用?
Here,声明[NOT] EXISTS
语句将评估为TRUE
或FALSE
。在链接中存在的两个示例中,如果我假设第一个示例的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 的使用的主要内容,如果未能解决你的问题,请参考以下文章