SQL分组查询GROUP BY详解及示例

需积分: 10 16 下载量 46 浏览量 更新于2024-10-16 收藏 33KB DOC 举报
"GROUP BY是SQL查询中的一个关键部分,用于对数据进行分组,通常与聚合函数(如COUNT, SUM, AVG, MAX, MIN)结合使用。在使用GROUP BY时,你需要指定一个或多个列,数据库将根据这些列的值将数据分成不同的组。在每个分组内,你可以对数据应用聚合函数来获取特定的统计信息。 例如,假设我们有一个名为`table`的表,其中包含`A`和`B`两个字段。如果我们执行以下查询: ```sql SELECT A, B FROM table GROUP BY A ``` 这将返回每个不同`A`值的所有`B`值,但因为没有聚合函数,结果可能不明确。为了得到有意义的结果,我们可以使用聚合函数,如: ```sql SELECT A, COUNT(B) AS '数量' FROM table GROUP BY A ``` 这个查询会返回每个`A`值对应的`B`字段的计数,使得每个`A`值只有一行数据,`数量`列显示对应`B`的数量。 GROUP BY遵循一个原则,即在`SELECT`子句中未使用聚合函数的列必须出现在`GROUP BY`子句中。这是为了确保每个分组都有一个唯一的标识符。 在SQL Server中,GROUP BY支持一些高级用法。例如,`WITH CUBE`和`WITH ROLLUP`可以用于创建交叉分组和汇总。`CUBE`会生成所有可能的子集,包括空集;而`ROLLUP`则会产生层次化的子集,从最细粒度到最粗粒度的总和。 下面是一些示例: 1. 基本的GROUP BY用法: ```sql SELECT CategoryID, AVG(UnitPrice) AS '平均单价', COUNT(UnitPrice) FROM dbo.Products WHERE UnitPrice > 30 GROUP BY CategoryID ORDER BY CategoryID DESC ``` 此查询将返回每个类别ID的平均价格和价格计数,仅包括单价超过30的记录,并按CategoryID降序排序。 2. 使用DISTINCT的GROUP BY: ```sql SELECT CategoryID, AVG(DISTINCT UnitPrice) AS '平均单价', COUNT(DISTINCT UnitPrice) FROM dbo.Products WHERE UnitPrice > 30 GROUP BY CategoryID ORDER BY CategoryID DESC ``` 这里,`DISTINCT`关键字确保了在计算平均单价和计数时,排除了重复的UnitPrice值。 3. 在GROUP BY后添加过滤条件: ```sql SELECT CategoryID, SUM(UnitPrice) AS 'SumPrice' FROM dbo.Products GROUP BY CategoryID HAVING SUM(UnitPrice) > 1000 ORDER BY CategoryID DESC ``` 这个查询首先按CategoryID分组并计算每个组的UnitPrice总和,然后只保留那些总和大于1000的组。 在实际应用中,GROUP BY可以帮助我们分析数据的分布,找出各类别的总体趋势,或者统计特定条件下的数据特性。熟练掌握GROUP BY用法对于数据分析和报表生成至关重要。"