3

Group By我知道只有在包含它们的情况下才允许使用聚合函数后跟的普通列。
但是为什么以下工作?

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

2 回答 2

7

这种行为是对 MySql 的“扩展”

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

但是,此行为实际上是 MySql 中的可配置设置

ONLY_FULL_GROUP_BY

不允许选择列表或(自 MySQL 5.1.10 起)HAVING 列表引用未在 GROUP BY 子句中命名的非聚合列的查询。

It is best to respect the group by and add all non-aggregated columns, especially if there's the possibility that you might someday migrate to a server that has ONLY_FULL_GROUP_BY turned on.

于 2013-02-13T21:55:25.440 回答
3

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

这是为了正常工作。如果没有聚合函数,它会对查询中返回的所有行执行此操作。我认为您对此几乎看不到的原因是,这很少是您真正想要完成的事情。当您有一个 where 子句时,您经常放弃 group by,您知道该子句只会返回您计划分组的内容。即,如果您查询的是:

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

下面的 group by 在技术上是多余的:

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

就个人而言 - 我通常包括 GROUP BY 子句,因为我认为它更一致地支持跨平台......虽然不是 100% 肯定。

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

于 2013-02-13T21:48:22.377 回答