我昨天遇到了这个问题。我只是在寻找一个解释。
\n以下关于 SQL 查询的哪些说法是正确的?
\nP : SQL 查询可以包含 HAVING 子句,即使它没有 GROUP BY 子句
\n问:只有当 SQL 查询具有 GROUP BY 子句时,它才可以包含 HAVING 子句
\nR :GROUP BY 子句中使用的所有属性必须出现在 SELECT 子句中
\nS :并非 GROUP BY 子句中使用的所有属性都需要出现在 SELECT 子句中
\n(A)\xc2\xa0P 和 R。
\n(B)\xc2\xa0P 和 S。
\n(C)\xc2\xa0Q 和 R。
\n(D)\xc2\xa0Q 和 S。
我选择了A作为答案。但实际上B是正确答案。
\n我想知道有些网站说R是正确的,而另一些网站说S是正确的。最后两者之间哪种说法是正确的?
\n“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列表中。