SQL入门教程第10课:什么是分组聚合

职场   职场   2024-11-28 07:50   福建  

HI,大家好,我是星光。


咱们今天讲分组聚合。


先说分组。


分组这个概念其实大家并不陌生,在日常生活和数据分析过程中经常遇到。比如说,把公司的员工按部门分组,把身边的朋友按男女分组(也就是你的男朋友和你的女朋友啦)……等等。

在SQL中,创建分组一般是使用GROUP BY子句。

举个例子,下图是一张表名为成绩表的表格。


如果按班级分组:

SELECT 班级FROM [成绩表$] GROUP BY 班级


结果如下:



如果按班级和学科两个类别进行分组:

SELECT 班级, 学科FROM [成绩表$] GROUP BY 班级, 学科


结果如下:


看到这儿,有朋友会说,什么分组,不就是去重查询吗?上面两个问题和去重查询没啥区别呀。

SELECT DISTINCT 班级, 学科 FROM [成绩表$]


……

是的,所谓分组,也就是去除重复值,把相同值归类保留唯一;因此GROUP BY也有去重复的疗……功效。


但分组通常并不是目的,目的是分组后的聚合。关于聚合,也就是聚合函数,我们上节分享过了,摊手,不知道你是否还记得?


……

陈独秀老师告诉我,分组+聚合=分组聚合。

比如……

如果我们需要查询每个班级的成绩总分;很明显,班级是需要分组的,总分是需要聚合的,因此语句如下:

SELECT 班级, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级


如果我们需要查询每个班级每个学科的成绩总分:

SELECT 班级, 学科, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级, 学科


……

……

是不是很简单?

但需要说明的是,SELECT后的字段,必须包含在分组子句中,例如上述示例中的班级和学科。如果不包含其中,比如成绩,则必须使用聚合函数。


例如,以下语句,学科既不存在GROUP BY子句中,也未使用聚合函数,则代码会得到错误的提示信息。


SELECT 班级, 学科 FROM [成绩表$] GROUP BY 班级


……

凡事最好有个条件,毕竟咱不是随便的人。


很多时候,用户并不需要所有的分组聚合的数据,只是需要其中一部分满足特定条件的;为此,SQL提供了HAVING子句。


比如,我们需要查询各个班级学科为语文的总分,以下代码第4行使用HAVING子句筛选学科。


SELECT 班级, 学科, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级, 学科 HAVING 学科 = '语文'


再比如,我们需要查询班级总分大于250的班级名单,以下代码第4行使用HAVING子句筛选总分。


SELECT 班级, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级 HAVING SUM(成绩) > 250


打个响指,这里需要说明的是,HAVING SUM(成绩)>250不能写成HAVING 总分>250,至于缘故,我们下期会讲到。


HAVING子句通常都是搭配GROUP BY分组语句出现的,在后者分组的基础上搜索相关条件,但这并不是说它只能依靠GROUP BY才能生存,它也可以单独存在。


例如,以下语句计算了‘插班生‘的总分数。


SELECT SUM(成绩) AS 总分 FROM [成绩表$] HAVING 班级 = '插班生'


当然,尽管HAVING可以单独生存,但在实际情况中却很少见;一方面,它单独出现时,能力非常有限,另一方面,我们还有WHERE子句。


……


摊手,问题来了。


同样都是用于条件筛选,既生瑜何生亮?HAVING子句和WHERE子句有
什么相同和不同之处?


相同之处在于,两则都可以定义搜索条件。


比如,前面讲的查询各个班级学科为语文的总分,既可以先分组后HAVING筛选,也可以先WHERE筛选后分组。


SELECT 班级, 学科, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级, 学科 HAVING 学科 = '语文'


也可以写成:


SELECT 班级, 学科, SUM(成绩) AS 总分 FROM [成绩表$] WHERE 学科 = '语文' GROUP BY 班级, 学科


此外,前面章节所介绍的WHERE所有操作技巧,比如使用连接符、通配符、函数等,HAVING也都可以使用。


不同之处……


首先,运算顺序不同,WHERE优先于HAVING。


其次,作用对象不同。WHERE只作用于表,而HAVING作用于GROUP BY子句的分组结果,如果不存在GROUP BY子句,则作用于WHERE子句的搜索结果,如果WHERE子句也不存在,才直接作用于表。


最后,最重要的是,计算对象不同。HAVING是用于组的计算,WHERE则计算指定字段的每条记录。


例如我们需要查询成绩大于90分的学员名单。


语句可以写成:


SELECT 班级, 姓名, 学科, 成绩 FROM [成绩表$] WHERE 成绩 > 90


但不能写成:


SELECT 班级, 姓名, 学科, 成绩 FROM [成绩表$] HAVING 成绩 > 90


后者会出现错误提示:



同样的道理,我们要查询班级总分大于250的班级名单。


语句可以写成:


SELECT 班级, SUM(成绩) AS 总分 FROM [成绩表$] GROUP BY 班级 HAVING SUM(成绩) > 250


但不能写成:


SELECT 班级, SUM(成绩) AS 总分 FROM [成绩表$] WHERE SUM(成绩) > 250 GROUP BY 班级


后者会出现错误提示:



……

……


没了,挥挥手,咱们下期再见。




需要系统学习Excel却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?


加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道


🚂>>~

加入我的付费会员,全面学习Excel

透视表 函数 图表 VBA PQ想学啥学啥

👀


本文由公众号“Excel星球”首发。
点击阅读原文系统学习Excel!

Excel星球
微软全球最有价值专家(Excel MVP),上千篇原创图文和视频教程随学随用,随用随查,建议常用Excel的职场人关注。
 最新文章