MySQL为啥在使用聚合函数时自动求和

Posted

技术标签:

【中文标题】MySQL为啥在使用聚合函数时自动求和【英文标题】:MySQL Why automatically sum when using aggregate functionMySQL为什么在使用聚合函数时自动求和 【发布时间】:2015-06-07 05:32:59 【问题描述】:

我正在尝试编写一个 mysql 查询来计算数值列的标准偏差,而不使用 STD()。我的工作查询如下:

SELECT sqrt(power((amount-avg(amount)),2)/count(amount))
FROM Orders;

请将“金额”视为列名,将“订单”视为表名。我的问题是为什么不使用 sum 函数会自动对所有 power((amount-avg(amount)),2) 结果求和?

谢谢!

【问题讨论】:

【参考方案1】:

您正在使用 count() 函数,它是一个聚合函数,因此您将所有行分组。在您的查询中,金额不是作为总和计算的,它仅使用一些行的值(不确定使用哪一行的值),因为 MySQL 允许将非分组列与分组列结合使用。

在这里阅读更多: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

如果您只想自己实现,可以尝试这样的查询:

SELECT @avg:=(SELECT avg(amount) FROM Orders), @cnt:=(SELECT count(*) FROM Orders), 
       SQRT(SUM(POWER(amount-@avg,2)/@cnt)) as std
FROM Orders

这将执行两个快速查询,平均并只计数一次(因为这些对于每一行仍然相同),然后它将总结您的公式并将其 sqrt 作为标准返回。

【讨论】:

是的。但它仍然只计算第一条记录的数量,对吧?虽然聚合函数将每条记录作为一个组,但它仍然需要像 for 循环那样对每条记录的计算结果求和。我认为 imran 的回答是正确的。 不,情况不是将每一行单独视为一个组。相反,情况恰恰相反:所有行都被视为一个大组,数据通过这个大组聚合 - count() 将为您提供所有行数。 “金额”会给你一些随机金额,它不会每次都给你第一行的金额,这取决于你的数据。 现在对我来说很有意义。似乎每次我运行此查询时,它都会返回计算第一行金额的所有内容的结果。我猜这可能是 MySQL 的默认设置。在这种情况下,如何在不使用 STD() 的情况下编写查询来计算 std?谢谢! 一旦你已经从不正确的人那里选择了“获胜”答案,在评论中回答你的问题是没有意义的。 好吧,我可以帮助您处理 SQL 语句,但我不知道应该如何计算标准偏差。你有什么理由不想使用 STD() 吗?【参考方案2】:

您的amount 列不计算总和。它是您表的某些行的值。

【讨论】:

谢谢!所以这个查询不是计算可变数量的标准吗?它只是计算第一条记录金额的公式。对吗? 不,它不是第一行值!好吧,它可以是,但不一定是。 在 MySQL 中,没有第一行或第二行。通常,行被视为行,没有人能分辨出哪一个先行。表格的物理顺序可能与您插入行的顺序不同。您甚至可以稍后通过 ALTER TABLE tbl ORDER BY col 重新排序行的物理顺序。 不会是随机行。这将是一些行的值,但不会是随机的。这将取决于 SQL 如何获取数据、表的物理结构是什么等。没有指定它将是哪个值。

以上是关于MySQL为啥在使用聚合函数时自动求和的主要内容,如果未能解决你的问题,请参考以下文章

为啥聚合函数不能放在where后面?

mysql之聚合函数

R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和使用tapply函数按组聚合求和按组聚合求和(使用dplyr包)

求SQL的聚合函数的定义,特点,注意事项等

在sql数据库中,我用聚合函数sum,为啥显示操作数据类型varchar对于sum运算符无效啊?

MySQL聚合函数