MySQL Aggregate函数没有GROUP BY子句

时间:2015-02-13 10:08:46

标签: mysql sql-server

在MySQL中,我观察到虽然没有GROUP BY子句,但仍会执行在SELECT列表中使用AGGREGATE FUNCTION的语句。如果我们这样做,其他像SQL Server这样的RDBMS产品会抛出错误。

例如,SELECT col1,col2,sum(col3) FROM tbl1;执行时没有任何错误,并返回col1,col2的第一行值和col3的所有值的总和。上述查询的结果是单行。

有人可以告诉我为什么会发生这种情况吗?

提前致谢!!

3 个答案:

答案 0 :(得分:3)

它的设计 - 它是MySQL允许的标准的许多扩展之一。

对于SELECT name, MAX(age) FROM t;之类的查询,参考文档会说:

  

没有GROUP BY,只有一个组,它是不确定的   要为组选择哪个名称值

有关详情,请参阅处理小组the documentation

设置ONLY_FULL_GROUP_BY控制此行为,请参阅5.1.7 Server SQL Modes启用此选项将禁止具有缺少group by语句的聚合函数的查询,并且默认情况下从MySQL版本5.7.5启用它

答案 1 :(得分:1)

来自MySQL文档的引用,关于aggregate functions的页面:

  

如果在不包含GROUP BY子句的语句中使用组函数,则它等同于对所有行进行分组。

如果您想在查询中使用GROUP BY子句,请将GROUP BY NULL附加到其中。我无法告诉其他RDBMS-es,但在MySQL上这是有效的语法。它的工作方式与没有它的查询相同。

关于您的查询的备注

你问题的引用:

"例如,SELECT col1,col2,sum(col3)FROM tbl1;执行时没有任何错误,并返回col1,col2的第一行值和col3的所有值的总和。"

"第一行"不是可以依赖的东西。在大多数情况下,你会得到第一行。

您的查询选择的列col1col2既不是聚合值,也不是函数依赖于GROUP BY子句中的列。根据SQL标准,查询无效。 MySQL允许它,但它的执行是未定义的行为,关于handling of GROUP BY的文档明确指出:

  

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

答案 2 :(得分:0)

你的问题有两点:

  1. 选择混合聚合列而非聚合列(未在GROUP BY中显示)
  2. 选择不带GROUP BY的聚合列。
  3. 第一个在@jpw answer中描述得很好。

    第二个是SQL标准。此查询的结果由一行组成。

            a) If T is not a grouped table, then
    
              Case:
    
              i) If the <select list> contains a <set function specifica-
                 tion> that contains a reference to a column of T or di-
                 rectly contains a <set function specification> that does
                 not contain an outer reference, then T is the argument or
                 argument source of each such <set function specification>
                 and the result of the <query specification> is a table con-
                 sisting of 1 row. The i-th value of the row is the value
                 specified by the i-th <value expression>.
    

    设置功能表示聚合功能。

    P.S。结果是对空表的查询由一行包含空值组成(这是GROUP BY NULL查询和查询之间的差异,而不包括GROUP BY。