为什么在SQL连接语句中使用Group By而在子查询中使用Order By?

时间:2018-12-22 10:39:16

标签: sql sql-server

我正在看一个T-SQL教程,该教程将子查询转换为JOIN语句以获得相同的结果。指导员要做的一件事是将子查询语句中的ORDER BY子句替换为GROUP BY子句。我搜索了这样做的原因,但找不到任何东西

修改 子查询

Select Name,
(Select SUM(QunatitySold) from tblproductSales where ProductId=tblProducts.Id) as QtySold
from tblProducts
order by Name

加入

Select Name, SUM(QuantitySold) as QtySold
from tblProducts
left join tblProductSales
on tblProducts.Id= tblProductSales.ProductId
Group by Name

这两个产生相同的结果。为什么不能同时使用“分组依据”或“订购依据”?

2 个答案:

答案 0 :(得分:0)

在第二个查询中,Instructor使用SUM(QuantitySold),它是对表的聚合。

SELECT SUM(QuantitySold) FROM Table1不需要Group By运算符,因为它没有分组分隔符列。在哪里

SELECT Name, SUM(QuantitySold) FROM Table1需要Group by,因为QuantitySold的总和将按名称分组。

Order by可与Group by一起使用,仅用于订购输出。

我希望对你很清楚。

答案 1 :(得分:0)

在大多数情况下,当您汇总列(例如,总和,计数,平均等)时,您将希望放入“ group by”语句,以便可以针对每个分组进行汇总。在上面的第二个查询中,您希望每个产品“名称”的销售数量。为此,第二个查询是更好的形式。

如果要聚合整个数据集,则可以省略“ group by”子句。上面的第一个查询避免了在子查询中使用group by子句,因为子查询的“整个数据集”是已经按“名称”过滤的结果集。但是,在主查询中仅使用“ group by”而不是创建子查询会更直接(并且可能会更高效)。

'order by'子句与'group by'子句无关,在任何情况下都不能替代。实际上,假设首先需要订购,则讲师忽略它是错误的。他之所以这样做,是因为分组过程产生的结果集碰巧按名称顺序返回。但这不能保证,并且不应该依赖分组来修复订单。

但是请再次观看视频。讲师有意省略了它是很合理的,但出于不同的原因。我继承了喜欢子查询的开发人员的工作。他们还倾向于过度使用顺序(在其他情况下使用不足,例如在“最高”查询中省略它)。通常最好在业务或应用程序的表示层中处理订单。您的教练可能已经对此做了简短说明。