SQL ZOO列出每个大洲以及按字母顺序排在首位的国家/地区的名称

tea*_*g12 0 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
Run Code Online (Sandbox Code Playgroud)

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

小智 15

我尝试过这个,它也有效:

SELECT continent, MIN(name)
FROM world
GROUP BY continent
ORDER BY name
Run Code Online (Sandbox Code Playgroud)


OLI*_*KOO 5

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
Run Code Online (Sandbox Code Playgroud)

当您在子查询中执行不带WHERE子句的查询时:

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y)
ORDER BY name
Run Code Online (Sandbox Code Playgroud)

你得到这个

continent   name
Asia        Afghanistan
Run Code Online (Sandbox Code Playgroud)

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

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

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

但由于我们想获得每个大洲的第一个国家,因此我们将其添加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
Run Code Online (Sandbox Code Playgroud)

下面发生的是,如果它们共享同一个洲,那么现在我们仅将x中实例的国家名称与y中实例的国家名称进行比较。因此以亚洲大陆为例:

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

Taiwan <= All(Afghanistan,Taiwan,Japan)因为台湾不小于或等于阿富汗,台湾因虚假而被滤除 。

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

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

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