2016-05-16 67 views
1

我想要返回一個列表,其中每個國家的人口數大於世界平均人口的名稱,以及世界平均值與該國家人口數據庫的差異:所有行的MySQL AVG()函數

國家數據庫的形式爲: 代碼,名稱,大陸地區,表面積,IndepYear,人口,LifeExpectancy,國民生產總值,GNPOld,的localName,GovernmentForm,HeadOfState,資本,代碼2

到目前爲止,我已經來了用此代碼輸出:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER 
VIEW `average_population` AS 
    SELECT 
     `country`.`Code` AS `code`, 
     `country`.`Name` AS `name`, 
     `country`.`Continent` AS `continent`, 
     `country`.`Region` AS `region`, 
     `country`.`Population` AS `population` 
    FROM 
     `country` 
    GROUP BY code 
    HAVING AVG(population) > (SELECT AVG(Population) 
           FROM country) 

如果我在第一個選擇語句中設置AVG(人口),這隻返回一條記錄?

我怎樣才能得到每個國家的人口數量都大於世界平均人口的名稱,以及世界平均水平與我國人口數據庫的差異?

+0

向我們展示樣本數據和願望輸出。 \t \t請仔細閱讀[**如何對向**](http://stackoverflow.com/help/how-to-ask) \t \t \t \t這裏是一個偉大的地方[**開始* *](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)瞭解如何提高您的問題質量並獲得更好的答案。 –

+2

'GROUP BY代碼'意味着你的表格有重複代碼的行。也就是說,不止一個國家​​有相同的代碼。這對我沒有意義。它對你的數據有意義嗎? –

+0

您是否在尋找該國在所有時間段內的平均水平(IndepYear)是否高於所有時間段內所有國家的平均水平? – Ben

回答

0

如果你需要在一行中做,你可以使用嵌套選擇。

SELECT Name, (Population - (SELECT AVG(Population) FROM country)) as 'OverAverage' 
FROM country 
WHERE Population > (SELECT AVG(Population) FROM country) 

如果可能的話,如果您事先計算並存儲平均值,效率會更高。這樣你就不需要爲每一行運行平均函數。

+0

@Juan卡洛斯偉大的信息@鄧肯偉大的答案。有用! – blueGOLD

+0

是的,嵌套選擇通常效率低下,更好地計算值並執行交叉連接。 –

0

嘗試計算分隔的查詢中的世界人口。

SELECT 
    `country`.`Code` AS `code`, 
    `country`.`Name` AS `name`, 
    `country`.`Continent` AS `continent`, 
    `country`.`Region` AS `region`, 
    `country`.`Population` AS `population` 
FROM 
    `country` 
CROSS JOIN (SELECT AVG(Population) AS everyone FROM country) as World 
GROUP BY code  
HAVING AVG(population) > World.everyone