如果没有指定聚合函数,MySQL会怎么做?

时间:2016-07-12 10:51:48

标签: mysql sql group-by aggregate-functions

最近我发现,尽管我patientID表中的Samples重复,但以下查询有效

SELECT * FROM Samples GROUP BY patientID

并为多列返回多个值。

默认使用哪种聚合函数?

5 个答案:

答案 0 :(得分:3)

首先,这是一个结构糟糕的SQL,你应该不使用它。

但是它做了什么?它返回一个结果集,每行PatientId一行。 SELECT *指定的其他列来自数据中的 indeterminate 行。无法保证额外的列甚至来自同一行。

实际上,值似乎来自遇到的第一行。但是,MySQL非常明确,您不能依赖此行为。通常,您应该避免使用SELECT中不在GROUP BY中的未聚合列的聚合语句。其他数据库不支持此语法(除非GROUP BY键在聚合的数据上形成唯一/主键)。

答案 1 :(得分:1)

MySQL似乎根本没有使用聚合功能。在这种情况下选择的记录是不确定的,因为documentation状态:

  

在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。

但是你可能想知道为什么这个功能首先存在。如果您正在编写一个查询,其中您知道列中的所有值都相同,那么此功能可以通过不必编写连接或子查询来使GROUP BY严格符合,从而为您节省一些工作。< / p>

答案 2 :(得分:0)

您可以使用SUM,AVG,COUNT等聚合函数 dev.mysql GROUP BY

答案 3 :(得分:0)

无。如果未启用ONLY_FULL_GROUP_BY sql模式,则MySQL allows

  

对GROUP BY的标准SQL使用的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。

此sql模式仅在默认情况下为rom v5.7.5启用。

答案 4 :(得分:0)

由于您尚未指定MySQL服务器的版本,因此有两种可能的答案。

在MySQL 5.7.5之前,上述查询是有效的,但对于GROUP BY中未列出的所有列也没有聚合的以下注释:

  

服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。

https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

从MySQL 5.7.5开始,这种行为发生了变化,MySQL实现了SQL99标准:

  

SQL99及更高版本允许每个可选功能T301使用非聚合(如果它们在功能上依赖于GROUP BY

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

所以有些列可能有效,但查询本身无效,因为并非所有列都在功能上依赖于patientID列(可能有血液和皮肤样本)。

通常,使用SELECT *是一种不好的行为,并且没有定义如何处理聚合查询中的所有结果列。

TL; DR; MySQL之前的5.7.5将执行查询,结果是不可预测的,5.7.5之后的MySQL会抛出错误。