我知道只有当包含Group By
的{{1}}后,才允许使用聚合函数后面的普通列
但是,为什么以下工作呢?
mysql> select payee,sum(amount) from checks;
+---------+-------------+
| payee | sum(amount) |
+---------+-------------+
| Ma Bell | 893.76 |
+---------+-------------+
1 row in set (0.00 sec)
答案 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子句的结果?