如何工作。我的嵌套查询只返回 3 个元组。但是当与外部查询结合使用时,它(外部查询(返回 736 个元组。如果我写一个查询,比如从中选择 p.height ,这是相同数量的元组......哪里是真的。
我读过那些说它只返回 true 的书,这在我的情况下是有道理的。另请阅读一些在线文章,其中存在返回 True,但外部查询仅从嵌套查询的结果中进行选择。
Mysql-workbench
select p.height
from world_cup.player as p
where Exists(select q.height from world_cup.player as q where q.height = 165)
order by p.height;
实际结果应该是这三个元组 165、165、165(根据书籍和在线资源(
是的,我必须测试自己,你说的是正确的。但是,从您在此处引用的链接 https://www.w3schools.com/sql/sql_exists.asp,您缺少一个条件,即您需要在q.height=165
之前有一个p.height=q.height
才能正确返回值。因此,您的查询假设如下所示:
SELECT p.height
FROM world_cup.player AS p
WHERE EXISTS (
SELECT q.height FROM world_cup.player AS q
WHERE p.height=q.height -- you're missing this condition
AND q.height = 165
)
ORDER BY p.height;
以下是参考:https://dev.mysql.com/doc/refman/8.0/en/exists-and-not-exists-subqueries.html
"对于前面的示例,如果 t2 包含任何行,即使是只有 NULL 值的行,则 EXISTS 条件为 TRUE。">
且仅当子查询返回至少一个元组时,EXISTS
为真。
因此,只要至少有一个高度为 165 的玩家,您的EXISTS
就会返回 true,对于外部查询的所有元组。如果没有这样的玩家,结果你有一个空集。所以你会看到你的使用是非常静态的,也许以这种方式使用没有太大意义,除非这是你想要的。
通常,EXISTS
的子查询是相关的,即外部查询的值出现在内部查询的WHERE
子句中,因此EXISTS
的结果可以因外部查询的元组而异。
如果您只想让身高为 165 的玩家,只需在 WHERE
子句中使用相等表达式即可。
SELECT p.height
FROM world_cup.player as p
WHERE p.height = 165;
ORDER BY p.height
也没用,因为它们都是一样的。