【问题标题】:MySQL AVG() function for all rows所有行的 MySQL AVG() 函数
【发布时间】:2016-05-17 03:14:25
【问题描述】:

我正在尝试从我的数据库中返回一个列表,其中列出了每个人口大于世界平均人口的国家的名称,以及世界平均水平与该国家人口之间的差异:

国家数据库的格式为: 代码、名称、大陆、地区、SurfaceArea、IndepYear、人口、预期寿命、GNP、GNPOld、LocalName、GovernmentForm、HeadOfState、Capital、Code2

到目前为止,我已经提出了以下代码:

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(population),这只会返回一条记录?

如何从我的数据库中获取人口超过世界平均人口的每个国家/地区的名称列表,以及世界平均水平与该国家/地区人口之间的差异?

【问题讨论】:

  • 向我们展示样本数据和期望输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • GROUP BY code 表示您的表中包含重复代码的行。也就是说,不止一个国家​​有相同的代码。这对我来说没有意义。它对您的数据有意义吗?
  • 您是否在寻找该国家/地区在所有时间段 (IndepYear) 的平均值高于所有国家/地区在所有时间段的平均值?

标签: mysql sql mysql-workbench


【解决方案1】:

如果您需要在一行中完成,您可以使用嵌套选择。

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

如果可能的话,如果您事先计算并存储平均值,效率会更高。这样您就不需要为每一行运行平均函数。

【讨论】:

  • @Juan Carlos 很好的信息@Duncan 很好的答案。它有效!
  • 是的,嵌套选择通常效率低下,最好计算值并执行交叉连接。
【解决方案2】:

尝试在单独的查询中计算世界人口。

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2015-06-30
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多