我很困惑为什么不能
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 吗?
最佳答案
当您使用 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/