gpt4 book ai didi

mysql - SQL ZOO 按字母顺序列出每个大洲和国家名称

转载 作者:行者123 更新时间:2023-12-01 00:37:27 26 4
gpt4 key购买 nike

我很困惑为什么不能

Select x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.name=y.name)
ORDER BY name

任何人都可以向我解释为什么它必须是 x.continent=y.continent 而不是 x.name=y.name 吗?

Table

最佳答案

当您使用 x.name=y.name 时如果两个实例具有相同的国家/地区名称,则您正在将 x 中的国家/地区名称与 y 中的国家/地区名称进行比较。这基本上只会返回完整的表 x。

您想使用 x.continent=y.continent因为您只想比较来自 x 的实例的国家名称和来自 y 的实例的国家名称,如果它们共享同一大陆。

让我用一个例子一步一步地说明这一点:这里我们有一个表格世界,我填充了一些数据:

world: 

Select x.continent, x.name
From world x
ORDER BY name

continent name
Asia Afghanistan
Europe Albania
Africa Algeria
Europe Andorra
Africa Angola
SouthAmerica Bolivia
SouthAmerica Brazil
Europe Hungary
Asia Japan
Africa Nigeria
SouthAmerica Peru
Asia Taiwan

当您在子查询中没有 WHERE 子句的情况下执行此查询时:

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y)
ORDER BY name

你明白了

continent   name
Asia Afghanistan

这是因为 where 子句过滤掉了除一个国家以外的所有国家

where x.name <= (Afghanistan,Taiwan,Japan,
Albania,Hungary,Algeria,Nigeria,Andorra,
Angola,Bolivia,Peru,Brazil)

即按字母顺序排在首位的国家名称是阿富汗。

但由于我们想要获得每个大陆中的第一个国家/地区,我们将添加 x.continent=y.continent到我们的子查询

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.continent=y.continent)
ORDER BY name

下面发生的事情是,现在我们只比较来自 x 的实例的国家名称和来自 y 的实例的国家名称,如果它们共享同一大陆。因此,以亚洲大陆为例:

Japen 被过滤掉是因为 Japan <= All(Afghanistan,Taiwan,Japan)是错误的,因为日本不小于或等于阿富汗(A 在 J 之前)

台湾被过滤掉是因为 Taiwan <= All(Afghanistan,Taiwan,Japan)是错误的,因为台湾不小于或等于阿富汗。

阿富汗没有被过滤掉,因为 Afghanistan <= All(Afghanistan,Taiwan,Japan)是真的,因为阿富汗等于阿富汗

但是,如果您使用 x.name=y.name在您的子查询中,您实际上是在将每个国家与其自身进行比较,它们都将包含在您的最终结果集中,因为所有国家名称都等于其自身的国家名称。

希望对您有所帮助,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。”

关于mysql - SQL ZOO 按字母顺序列出每个大洲和国家名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44897979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com