繁体   English   中英

为什么这个MySQL语句中的GROUP BY子句没有抛出错误?

[英]Why isn't the GROUP BY clause in this MySQL statement throwing errors?

我在这里使用w3s作为我的例子

SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders,
    Orders.OrderDate 
FROM Orders
LEFT JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID
GROUP BY ShipperName;

我很困惑为什么上面的陈述没有抛出错误。 当我们通过所有OrderID进行聚合时,MySQL如何知道要使用哪个OrderDate

当我们通过所有OrderID进行聚合时,mysql如何知道要使用哪个OrderDate?

它没有。 它只选择一个,因为它假定您将按所有必需的列进行分组,并且任何不在GROUP BY且不受任何聚合函数约束的列将为每个组具有相同的值。

这是非标准行为,可用作优化,允许服务器将源行中每个组的一个值“泄漏”到结果集中,从而减少GROUP BY必须管理的数据大小。 每个组使用哪个源行的值是未定义的,因此这仅用于非分组列在功能上依赖于分组列的查询...因为,在这种情况下,“哪个”行不会无所谓,因为他们在每个小组中都是一样的。

MySQL扩展了GROUP BY的标准SQL使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。 这意味着[不包括非聚合列的查询]在MySQL中是合法的。 您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。 但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,添加ORDER BY子句不会影响每个组中值的选择。 [强调补充]

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

您可以通过在@@ SQL_MODE中包含ONLY_FULL_GROUP_BY来禁用此行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM