在MySQL中,我观察到虽然没有GROUP BY子句,但仍会执行在SELECT列表中使用AGGREGATE FUNCTION的语句。如果我们这样做,其他像SQL Server这样的RDBMS产品会抛出错误。
例如,SELECT col1,col2,sum(col3) FROM tbl1;
执行时没有任何错误,并返回col1,col2的第一行值和col3的所有值的总和。上述查询的结果是单行。
有人可以告诉我为什么会发生这种情况吗?
提前致谢!!
答案 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的所有值的总和。"
"第一行"不是可以依赖的东西。在大多数情况下,你会得到第一行。
您的查询选择的列col1
和col2
既不是聚合值,也不是函数依赖于GROUP BY
子句中的列。根据SQL标准,查询无效。 MySQL允许它,但它的执行是未定义的行为,关于handling of GROUP BY的文档明确指出:
...服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的......
答案 2 :(得分:0)
你的问题有两点:
第一个在@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。