我是MySQL的新手,我想问一下,当我想找到一个国家的最大预期寿命时,这个SQL语句的问题是什么?

SELECT Name, Max(LifeExpectancy) From world.country;

这就是结果:
mysql - Mysql Max()内置函数-LMLPHP
但是,当我在下面键入SQL并进行排序时,最大的子表达式不是我期望的列。
SELECT * From world.country Order By LifeExpectancy Desc;

mysql - Mysql Max()内置函数-LMLPHP
那么我的第一个问题是什么?
我可以从这个查询中得到我期望的结果。
Select continent, name, max(LifeExpectancy) As max
From statworld.country
Group By name
Order By max Desc
Limit 1;

您可以从以下位置下载示例世界数据库:
https://dev.mysql.com/doc/index-other.html

最佳答案

在第一个查询中,columnname不包含在聚合函数或group by中,因此MySQL为它选择一个随机值。这就是为什么你会得到不正确的结果。来自Mysql文档中的Group by handling
如果禁用ONLY_FULL_GROUP_BY,则使用
GROUPBY允许选择列表、有条件或按顺序
列表以引用未聚合的列,即使这些列不是
功能上依赖于按列分组。这导致MySQL
接受前面的查询。在这种情况下,服务器可以自由选择
每个组中的任何值,因此除非它们相同,否则
选择是不确定的,这可能不是你想要的。
除了第二个查询中从continent列返回的值的相同行为之外:

Select continent, name, max(LifeExpectancy) As max
From statworld.country
Group By name
Order By max Desc
Limit 1;

您应该遵循其他RDBMS(如Oracle和SQL Server)所遵循的推荐标准,在使用GROUP BY时,这些RDBMS从不使用没有group by或聚合函数的列。因此,您应该在group by或aggregate函数中包含continent列,以获得正确的值:
Select continent, name, max(LifeExpectancy) As max
From statworld.country
Group By name, continent
Order By max Desc
Limit 1;

09-11 12:23
查看更多