2015-11-08 112 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);