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

标签 mysql sql correlated-subquery

我很困惑为什么不能

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/

相关文章:

sql-server - 我可以从子查询中获取逗号分隔值吗?如果没有,如何完成这项工作?

c# - This.controls.find()[0] 错误 : Index was outside the bound of array

PHP mysql如何关联三个表显示不同表的输出

sql - PostgreSQL 中的相关 SERIAL 列

java - 使用 JdbcTemplate 将值传递给 sql IN

python - 如何从输入列表/数组创建单列 SQL 表?

mysql - MySQL CASE 语句中的相关子查询

mysql - 获取三级子查询中的父列

MySQL - 在插入之前用单引号包围预先计算的变量

php - 如何将日期格式 yyyy-mm-dd 更改为 dd-mm-yyyy