32

我知道我需要(尽管我不知道为什么)GROUP BY在使用任何聚合函数(如count, sum,avg等)的 SQL 查询末尾有一个子句:

SELECT count(userID), userName
FROM users
GROUP BY userName

还有GROUP BY什么时候有用,性能影响是什么?

4

5 回答 5

36

要从具有超过 5 个小部件的每个小部件类别中检索小部件的数量,您可以执行以下操作:

SELECT WidgetCategory, count(*)
FROM Widgets
GROUP BY WidgetCategory
HAVING count(*) > 5

“have”子句是人们经常忘记的东西,而是选择将所有数据检索到客户端并在那里迭代。

于 2008-08-05T19:32:03.360 回答
15

GROUP BY 与 DISTINCT 类似,因为它将多条记录组合为一个。

此示例从http://www.devguru.com/technologies/t-sql/7080.asp借用,在 Products 表中列出了不同的产品。

SELECT Product FROM Products GROUP BY Product

Product
-------------
Desktop
Laptop
Mouse
Network Card
Hard Drive
Software
Book
Accessory

GROUP BY 优于 DISTINCT 的优势在于,当与 HAVING 子句一起使用时,它可以为您提供精细控制。

SELECT Product, count(Product) as ProdCnt
FROM Products
GROUP BY Product
HAVING count(Product) > 2

Product      ProdCnt
--------------------
Desktop          10
Laptop            5
Mouse             3
Network Card      9
Software          6
于 2008-08-19T14:02:49.113 回答
4

Group By 强制在返回记录之前填充整个集合(因为它是隐式排序)。

出于这个原因(以及许多其他原因),切勿在子查询中使用 Group By。

于 2008-08-05T19:01:10.973 回答
2

计算使用标签的次数可能是一个谷歌示例:

SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed

如果您只是想要一个不同的标签值,我更愿意使用该DISTINCT语句。

SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC
于 2008-08-05T18:58:35.067 回答
0

当您想要生成一个平均或汇总一堆数据的报告时,GROUP BY 也有帮助。您可以按部门 ID 和 SUM 对每个月的所有销售收入或 AVG 进行分组。

于 2008-08-05T19:00:39.557 回答