我已经针对MySQL良好的旧world
数据库编写了以下SQL查询:
SELECT Continent, Region, Name, MAX(SurfaceArea)
FROM world.country
GROUP BY Continent, Region;
country
表看起来像这样:
| Code | Name | Continent | Region | SurfaceArea | ...
| 'AFG' | 'Afghanistan' | 'Asia' | 'Southern and Central Asia' | 652090.00 |
| 'ALB' | 'Albania' | 'Europe' | 'Southern Europe' |'28748.00' |
...
我上面的查询在MySQL InnoDb v5.7.26中有效,并且根据MAX(SurfaceArea)
和Continent
发出正确的Region
。但是,发出的Name
是不正确的,因为它不是表面积最大的国家的名称。
例如,请注意此处的United Arab Emirates
行:
| Continent | Region | Name | MAX(SurfaceArea) |
| 'Asia' | 'Eastern Asia' | 'China' | '9572900.00' |
| 'Asia' | 'Middle East' | 'United Arab Emirates' | '2149690.00' |
...
这是因为选择不属于GROUP BY
子句的非聚合,非文字列没有太大意义。我相信MySQL会随意将其默认值设为该组中遇到的第一个值。
我的问题是-如何正确编写上述查询,最好不使用JOIN
?
也就是说,返回一个表格,其中包含国家的Name
和{{1},每个SurfaceArea
和MAX(SurfaceArea)
的{{1}}。