为什么我只从下面的查询中获得一个结果?建议的“答案”的首字母名称为“苏珊”,而不是我在结果中得到的名称。
SELECT EmpFirstName, EmpLastName, p.ProductName as ProductName,
YEAR(c.OrderDate) AS Year,
SUM(o.QuotedPrice + o.QuantityOrdered) AS TotalValue
FROM Employees
NATURAL JOIN Products p
NATURAL JOIN Order_Details o
NATURAL JOIN Orders c
ORDER BY Year, TotalValue DESC
结果图片
表格结构图像
答案 0 :(得分:1)
因为您的查询中有一个Sum
答案 1 :(得分:0)
查询返回的结果与您的期望不符,因为查询无效。而你的期望是不正确的。
SELECT
子句的表达式中存在aggregate (GROUP BY
) function需要存在GROUP BY
子句。当这样的子句不存在时,SQL标准会自动添加一个GROUP BY 1
子句,该子句只生成所有选定行中的一个组。
SELECT
查询的GROUP BY
子句中出现的每个表达式必须遵循以下规则之一,才能拥有有效的SQL查询:
GROUP BY
子句中; GROUP BY
) function; GROUP BY
子句中出现的一列。由于您的查询没有GROUP BY
子句,因此EmpFirstName
,EmpLastName
,p.ProductName
和YEAR(c.OrderDate)
这两个表达式无效{{1 }。clause。
在5.7.5版本之前,MySQL曾经允许这样的无效SQL查询,但它保留了return indeterminate values对无效表达式的特权。
从版本5.7.5开始,MySQL正确处理这些查询并拒绝它们。其他RDBMS-es多年前就正确处理它们。
对不确定值的解释很简单:SELECT
和JOIN
子句从表中提取一些行。 (缺少)WHERE
子句只生成所有这些行中的一条记录。 GROUP BY
查询永远不会从表中返回行,生成它在结果集中放置的值。由于组中GROUP BY
有多个不同的值,因此SQL标准表示查询无效。 MySQL过去常常忽略标准,但它没有关于从EmpFirstName
子句中的EmpFirstName
表达式中选择什么值的有效规则。组中行的任何值都同样有效,并且它返回的是:组中的一个随机值。
为了获得您希望的结果,您必须按SELECT
和OrderNumber
(以及ProductNumber
对行进行分组以获得有效的SQL查询):