2015-11-08 70 views
1

我新的MySQL和我想问的是这条SQL语句的问题,当我想找到一个国家Mysql的MAX()内置函数

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

这是最大的预期寿命结果:

enter image description here

然而,当我键入下面的SQL和做排序,最高LifeExpectancy是不是我期待的塔。

SELECT * From world.country Order By LifeExpectancy Desc; 

abc

那么,什么是我的第一次查询的问题?

我可以得到我期待从这个查询。

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

回答

1

在第一个查询中,列name没有包含在聚合函数,也不是一个组的,因此MySQL选择一个随机值它。这就是为什么你得到不正确的结果。从mysql文档为Group by handling

如果​​被禁用,一个MySQL扩展到使用 GROUP BY的是允许选择列表,HAVING条件,或ORDER BY 列表指非聚合列,即使列不是 在功能上依赖于GROUP BY列。这导致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时,它从不使用不带组的列,也不使用聚合函数。所以,你应该包括一组列continent或具有聚合函数,以获得正确的价值观:

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

你并不需要一个汇聚此查询的。在MySQL正确的查询是:

Select continent, name, LifeExpectancy 
From statworld.country 
Order By LifeExpectancy Desc 
Limit 1; 

(这将是其他数据库中的十分相似的变化将是limit的ANSI标准的制定是fetch first 1 row only。)

如果你能有联系,并希望所有国家,然后使用:

select sc.continent, sc.name, sc.LifeExpectancy 
from statworld.country sc 
where sc.LifeExpectancy = (select max(sc2.LifeExpectancy) from statworld.country sc2);