GROUP BY 使用方法详解

文章介绍了SQL中的GroupBy语句用于数据分组统计的基本概念、语法,以及与聚合函数、Where和Having子句的配合使用。通过实例展示了如何根据不同的字段进行分组和筛选,同时提到了Count、Sum、Avg、Max和Min等聚合函数的运用。此外,还讨论了GroupBy的扩展功能,如Rollup、Cube和GroupingSets的用法。

概述

group by是开发中经常用到的SQL语句,从字面意思来看就是根据哪个字段或者哪几个字段对查询到的数据进行分组统计,既然是分组统计那如何分组呢?所以group by通常都是和聚合函数还有having一起使用。

一、语法

select 聚合函数(字段1),字段2 from 表名 where 条件 group by 字段2,字段3
或者
select 聚合函数(字段1),字段2 from 表名 where 条件 group by 字段2,字段3 having 过滤条件
使用了group by 后,要求select出的结果字段都是可汇总的,否则就会出错。
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

二、举个例子

CREATE TABLE Sales (commodity VARCHAR(50), region VARCHAR(50), salesVolume INT);

INSERT INTO Sales VALUES (N'电视机', N'河北省', 10000);
INSERT INTO Sales VALUES (N'电视机', N'山东省', 20000);
INSERT INTO Sales VALUES (N'电视机', N'山东省', 30000);
INSERT INTO Sales VALUES (N'冰箱', N'浙江省', 15000);

SELECT * FROM Sales

SELECT region,SUM(salesVolume) 销量 from Sales  GROUP BY region

返回结果如下:

SELECT region,commodity ,SUM(salesVolume) 销量 from Sales  GROUP BY region,commodity

返回结果如下:

SELECT region,commodity ,SUM(salesVolume) 销量 from Sales  GROUP BY region

这句代码则是会报错:

三、where和having的使用

1、where+group by

where 限定的条件查询会在group by 分组之前执行。

SELECT region,SUM(salesVolume) 销量 from Sales WHERE commodity='电视机' GROUP BY region

返回结果如下:

2、group by+having

having限定的条件查询会在group by分组之后查询。

SELECT region,SUM(salesVolume) 销量 from Sales GROUP BY region HAVING SUM(salesVolume)>10000

返回结果如下:

3、where+group by+having

where和having在一起使用的时候,会先执行where的限定条件查询,最后再执行having的限定条件查询。

SELECT region,SUM(salesVolume) 销量 from Sales WHERE commodity='电视机' GROUP BY region HAVING SUM(salesVolume)>10000

返回结果如下:

四、聚合函数

常用的聚合函数有:count() 计数, sum() 求和 , avg() 求平均值, max() 求最大值, min()求最小值。

实例如下:

1、count( )
SELECT region,COUNT(*) 记录数 FROM Sales GROUP BY region

返回结果:

2、avg( )
SELECT region,AVG(salesVolume) 平均销量 FROM Sales GROUP BY region 

返回结果:

3、max( )
SELECT region,MAX(salesVolume) 销售最多 FROM Sales GROUP BY region 

返回结果:

4、min( )
SELECT region,MIN(salesVolume) 销售最少 FROM Sales GROUP BY region 

返回结果:

还有一些不经常使用的:count_big()和count()相同作用但返回值的数据类型不同,count()返回 ‘int’ ,count_big()返回 ‘bigint’ ,stdev()求标准偏差,stdevp()求总体标准偏差,var()求方差,varp()求总体统计方差等等这里就不尽数了。

五、group by的其他可用参数。

1、group by rollup( )

SELECT region,SUM(salesVolume)销量 FROM Sales GROUP BY ROLLUP (region )

返回结果如下:

这里比不加 rollup()的查询结果多了一行总计。

2、group by cube( )

SELECT region,commodity,SUM(salesVolume)销量 FROM Sales GROUP BY CUBE (region,commodity )

返回结果如下:

添加cube()后不但增加了一行总计,还增加了每一组单项统计的合计。group by cube为所有可能的列组合创建组。 对于 group by cube (a, b),结果具有 (a, b)、(NULL, b)、(a, NULL) 和 (NULL, NULL) 唯一值的组。

3、group by grouping sets ( )

grouping sets选项可将多个 group by子句组合到一个 group by 子句中。 其结果与针对指定的组执行 union all运算等效。
例如:

SELECT region,commodity,SUM(salesVolume) 销量 FROM Sales
GROUP BY GROUPING SETS ( ROLLUP (region,commodity), CUBE (region,commodity) )

返回结果与两个 group by语句的联合查询相同。

SELECT region,commodity,SUM(salesVolume) 销量
FROM Sales GROUP BY ROLLUP (region,commodity)
UNION ALL
SELECT region,commodity,SUM(salesVolume) 销量 
FROM Sales GROUP BY CUBE (region,commodity)

返回结果如下:

SQL 不会合并为 grouping sets 列表生成的重复组。 上例中,GROUPING SETS ( ROLLUP (region,commodity), CUBE (region,commodity) ),两个元素都返回总计行并且这两行都会列在结果中。

<think>我们正在讨论GROUP BY使用方法。根据用户的问题,他之前询问了关于SUM(CASE WHEN ...)的用法,现在转向GROUP BY。根据引用[1][2][3],GROUP BY通常用于分组统计,并与聚合函数(如SUM, COUNT, AVG等)一起使用。同时,引用[2][3]提到GROUP BY ALL在SQL Server中已被弃用,而Access中不支持GROUP BY ALL,但支持多列分组。 因此,我将围绕以下结构组织回答: 1. GROUP BY的基本语法和用途 2. 与聚合函数的结合使用 3. 多列分组 4. HAVING子句的使用 5. 注意事项(如GROUP BY ALL的弃用) 6. 示例演示 同时,我会根据引用[4]提到可以通过字典或Series进行分组(虽然这是Python pandas中的用法,但这里用户问的是SQL),所以重点放在SQL上。 注意:用户引用的[4]是Python pandas的groupby,但用户当前问题明确是SQLGROUP BY,所以主要参考引用[1][2][3]。</think>### GROUP BY 使用方法详解 #### 一、基本概念与语法 **GROUP BY** 用于将查询结果按指定列分组,通常与聚合函数(SUM, COUNT, AVG, MAX, MIN)配合使用[^1][^2]: ```sql SELECT 分组列, 聚合函数(列) FROM 表名 GROUP BY 分组列; ``` #### 二、核心功能解析 1. **单列分组** 统计各部门员工数量: ```sql SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department; ``` **结果示例**: | department | employee_count | |------------|----------------| | A | 15 | | B | 22 | | C | 8 | 2. **多列分组** 统计各部门+职级的平均薪资(Access/SQL通用写法): ```sql SELECT department, job_level, AVG(salary) AS avg_salary FROM employees GROUP BY department, job_level; -- 多列分组[^2][^3] ``` 3. **与聚合函数组合** ```sql SELECT department, SUM(salary) AS total_salary, AVG(salary) AS avg_salary, MAX(salary) AS max_salary FROM employees GROUP BY department; ``` #### 三、HAVING 子句的用法 用于对分组结果进行过滤(WHERE 不能用于聚合结果): ```sql SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 50000; -- 筛选平均薪资>5万的部门[^1] ``` #### 四、注意事项与技巧 1. **SELECT 列的限制** SELECT 中的非聚合列必须出现在 GROUP BY 中: ```sql -- 正确 SELECT department, job_title, SUM(salary) GROUP BY department, job_title -- 错误(job_title未在GROUP BY中) SELECT department, job_title, SUM(salary) GROUP BY department ``` 2. **GROUP BY ALL 的弃用** SQL Server 的 `GROUP BY ALL` 已被标记为弃用,应避免使用[^2][^3]: ```sql -- 不推荐(未来版本移除) SELECT department, SUM(salary) GROUP BY ALL department -- 替代方案 SELECT department, SUM(salary) GROUP BY department ``` 3. **NULL 值处理** GROUP BY 会将所有 NULL 值归为一组: ```sql SELECT department, COUNT(*) FROM employees -- NULL部门会被单独分组 GROUP BY department; ``` #### 五、完整示例 ```sql -- 统计2020年后入职的各部门员工数及平均薪资 SELECT department, COUNT(*) AS headcount, ROUND(AVG(salary), 2) AS avg_salary FROM employees WHERE hire_date >= '2020-01-01' GROUP BY department HAVING COUNT(*) > 5 ORDER BY avg_salary DESC; ``` #### 六、性能优化建议 1. **索引优化** 为分组列创建索引: ```sql CREATE INDEX idx_dept ON employees(department); ``` 2. **减少分组列数量** 不必要的分组列会增加计算开销 3. **先过滤再分组** 使用 WHERE 提前过滤数据: ```sql SELECT department, AVG(salary) FROM employees WHERE salary > 30000 -- 先过滤 GROUP BY department; ``` > 💡 **典型应用场景**:销售报表、用户行为分析、库存统计等需要分组汇总的场景[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵润强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值