Have 和 Group By 子句

Sud*_*rma 0 group-by

我昨天遇到了这个问题。我只是在寻找一个解释。

\n

以下关于 SQL 查询的哪些说法是正确的?

\n

P : SQL 查询可以包含 HAVING 子句,即使它没有 GROUP BY 子句

\n

问:只有当 SQL 查询具有 GROUP BY 子句时,它才可以包含 HAVING 子句

\n

R :GROUP BY 子句中使用的所有属性必须出现在 SELECT 子句中

\n

S :并非 GROUP BY 子句中使用的所有属性都需要出现在 SELECT 子句中

\n

(A)\xc2\xa0P 和 R。
\n(B)\xc2\xa0P 和 S。
\n(C)\xc2\xa0Q 和 R。
\n(D)\xc2\xa0Q 和 S。

\n

我选择了A作为答案。但实际上B是正确答案。

\n

我想知道有些网站说R是正确的,而另一些网站说S是正确的。最后两者之间哪种说法是正确的?

\n

J.D*_*.D. 5

“R”是不正确的,因为这意味着分组的每个字段也需要选择,这绝对是不正确的。子句中的字段GROUP BY定义如何折叠与这些字段相关的一组行。但是您没有理由必须在列表中返回相同的字段SELECT。如果您想要聚合非分组字段,则不需要同时返回分组字段。例如,以下是有效的查询:

SELECT SUM(Price) AS TotalAmountSold
FROM SalesOrders
GROUP BY ProductName
Run Code Online (Sandbox Code Playgroud)

当然,该查询的结果没有多大意义,因为它只会返回一个总金额列表,而没有ProductName与其实际关联的金额。因此,无法确定哪个总额属于哪个产品。

GROUP BY但是子句中的字段可以添加到SELECT列表中(没有任何聚合函数),如下所示:

SELECT ProductName, SUM(Price) AS TotalAmountSold
FROM SalesOrders
GROUP BY ProductName
Run Code Online (Sandbox Code Playgroud)

这使得查询变得有意义。但总而言之,“R”不正确的原因是因为它说“必须”,这不是真的,而是它们可能出现在SELECT列表中。