正常列后跟聚合函数,但不在group by中

时间:2013-02-13 21:43:15

标签: mysql sql group-by aggregate-functions

我知道只有当包含Group By的{​​{1}}后,才允许使用聚合函数后面的普通列 但是,为什么以下工作呢?

mysql> select payee,sum(amount) from checks;  
+---------+-------------+  
| payee   | sum(amount) |  
+---------+-------------+  
| Ma Bell |      893.76 |  
+---------+-------------+  
1 row in set (0.00 sec)  

2 个答案:

答案 0 :(得分:7)

This behavior is an "extension" to MySql

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   到未在GROUP BY子句中命名的非聚合列。

然而,This behavior is actually a configurable setting in MySql

  

ONLY_FULL_GROUP_BY

     

不允许查询选择列表或(从MySQL开始)   5.1.10)HAVING list是指未在GROUP BY子句中命名的非聚合列。

最好尊重 group by并添加所有非聚合列,尤其是如果您有可能有一天迁移到已ONLY_FULL_GROUP_BY转的服务器上。

答案 1 :(得分:3)

编辑手动参考,比我更好地解释并注明细节:http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

这是为了正常工作。如果没有聚合函数,它会在查询中返回的所有行上执行此操作。我认为你没有看到这一点的原因是,这很少是你实际想要完成的事情。当你有一个where子句时,你经常会删除该组,你知道它只会返回你计划分组的东西。即如果您查询是:

select payee,sum(amount) from checks where payee = 'Ma Bell'

下面的小组在技术上是多余的:

select payee,sum(amount) from checks where payee = 'Ma Bell' group by payee

个人 - 我通常包含GROUP BY子句,因为我 THINK 它更加一致地支持跨平台......但不是100%肯定。但是,

同样,在上面的查询中,我会再次询问 - 即使它在技术上有效,你是否得到了没有where子句的结果?