Mysql内部按教程问题加入组
大家好! 我想知道为什么我删除了Mysql内部按教程问题加入组,mysql,Mysql,大家好! 我想知道为什么我删除了groupbyordernumber后,它只获取一行: 这是他们的“教程”数据库错误还是MySQL行为正确?如果它是正确的,那么为什么它会产生这样的结果呢?SQL包括SUM()、COUNT()、MIN()、MAX()等等,都需要一个帧来聚合。通常,这是一个或多个要应用SUM()或其他聚合的其他列,而GROUP BY是指定该帧的方式 没有GROUP BY的聚合查询意味着您正在获取查询的WHERE子句筛选器所匹配的所有行的SUM() MySQL与大多数其他RDBMS
groupbyordernumber
后,它只获取一行:
这是他们的“教程”数据库错误还是MySQL行为正确?如果它是正确的,那么为什么它会产生这样的结果呢?SQL包括SUM()、COUNT()、MIN()、MAX()
等等,都需要一个帧来聚合。通常,这是一个或多个要应用SUM()
或其他聚合的其他列,而GROUP BY
是指定该帧的方式
没有GROUP BY
的聚合查询意味着您正在获取查询的WHERE
子句筛选器所匹配的所有行的SUM()
MySQL与大多数其他RDBMS不同,它允许您在选择中删除带有未聚合列的GROUP BY
,并从查询中返回一些行集。在Oracle、MS SQL Server或Postgresql中,没有分组依据的查询将是语法错误。如果您在选择
列表中仍包含状态
时使用了按医嘱编号分组
,他们也会将其视为错误。分组依据
应包括选择
列表中未在聚合总和()、计数()、最小()、最大()中使用的每一列
但MySQL对它的存在持宽容态度,相反,它会尝试猜测在哪个帧上应用您的SUM()
聚合。有时它可以得到您实际期望的答案,但大多数时候它为非聚合列提供的值基本上是不确定的。它会将几个可能的值压缩为一个,而您无法选择得到哪一个
这就是您看到的查询结果。MySQL选择了orderNumber=10100
和status='Shipped'
来处理您的SUM()
,即使它们与该总和没有明确的关系。结果9604190.61
中的总和是该表中所有行的quantityOrdered*priceEach
总和,不管orderNumber
怎么说
因此,您的查询的最可靠版本,也是唯一一个可以在MySQL之外工作的版本,您可以实际预测结果的版本是:
SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders AS T1
INNER JOIN
orderdetails AS T2 ON T1.orderNumber = T2.orderNumber
GROUP BY
orderNumber,
status /* added */
;
请注意,本教程从分组依据
中省略了状态
,即使它位于选择
。这在大多数其他RDBMS中都是一个错误
MySQL对这种错误特性的默认处理方式随着最新版本的出现而改变。在5.7之前,默认情况下禁用了模式,这可能会导致许多开发人员依赖于分组行为。在最新版本中,默认情况下只启用了完整的\u GROUP\u BY
,并防止查询缺少或不完整的GROUP BY
,只是为了观察链接引用了5.7文档,就上述参数而言,该文档是正确的,但这一论点略微忽略了当前版本。@草莓谢谢-链接指向8,并添加了一点关于当代defaultsWow的内容。非常感谢你,迈克尔!你在回答我的问题上付出了巨大的努力,我现在开始看得更清楚了,谢谢@SergejFomin很乐意帮忙,祝你好运。