学会了如何查找数据后,接下来就要对数据进行分析处理,比如求和、平均值、加总等等。这些对数据的加工处理通过汇总函数来实现。汇总函数在之前的两篇文章中都有涉及,这里采用概念--案例--总结的方式,集中介绍一下。
![114373a8d238893b6a61356803417787.png](https://i-blog.csdnimg.cn/blog_migrate/3146e9358dca09a446f0034de3284759.jpeg)
1.什么是汇总函数?
函数是SQL里的关键字,是一种运算命令。
通常来说,函数与字段名称或表达式联合使用,处理输入的数据并产生结果。SQL包含多种类型函数,其中汇总函数为SQL提供合计信息,比如计数、总和、平均等。
常见的汇总函数有以下几种:
- count:求某一列的行数
- sum:对某列数据求和
- avg:求某列数据的平均值
- max:求某列数据的最大值
- min:求某列数据的最小值
注意:
1. 如果汇总函数后面有null(空值),那么都会把空值排除在外进行计算。
2.如果要计算所有的行(包括空值的行),一般用星号表示,例子如下:
select 姓名,count(*)
from student;
3.sum、avg函数,只能对数值类型的列进行计算,否则会报错。
count、max、min函数,可以对任何类型计算。
举个例子说明一下,这里有一张名为“student”的表,表里面的有一些学生和课程相关的信息,如下:
![d85d3f1dcfba9069132edf0dbefcbf15.png](https://i-blog.csdnimg.cn/blog_migrate/e8218efa2646610596a3d3770cd9cb12.jpeg)
1.你想计算姓名这一列都多少行,需要使用‘count’函数,写法如下:
select count(姓名)
from student;
2.计算成绩这一列总和,写法如下:
select sum(成绩)
from student;
3.计算成绩这一列平均值,写法如下:
select avg(成绩)
from student;
4.计算成绩这一列的最大值、最小值,写法如下:
select max(成绩),min(成绩)
from student;
可以发现汇总函数的写法基本相似。通常来说,汇总函数是一种比较简单的函数,不会单独使用,一般都要结合其他函数(group by等)才能更好的达到分析效果。
![d64396f74112568ca5088edf953aa60e.png](https://i-blog.csdnimg.cn/blog_migrate/b8926cce148c5849a61947300e656f93.jpeg)
2.数据分组函数
汇总函数是按照某一列对数据进行计算,比如计算【姓名】列的总数量,现在如果要看的细一点,分别计算男生、女生的总人数,怎么实现呢?这里就需要用到分组函数,看下面这张表:
![3e16646e242bbc8226258fa1de62a5d3.png](https://i-blog.csdnimg.cn/blog_migrate/dca55c02a816ed2d6e3d2d372210981b.jpeg)
上表一共有三行数据,通过分组函数(‘group by’)来实现分组统计。‘group by’函数一般和汇总函数一起使用。对应的写法如下:
select 性别,count(*)
from student
group by 性别;
注意:
1.上面语句的运行顺序是:第二行--第三行--第一行,也就是先选择表,再按照条件对数据分总,最后计总显示出来。
再举一个例子:
![2a800ff6acd76bd8cbbb822c75c7aad9.png](https://i-blog.csdnimg.cn/blog_migrate/a0f4c5881b15b8e027c09b8a0c83944b.jpeg)
你想统计出生日期大于‘1990-01-02’的男生总数、女生总数,该如何写SQL语句?先写出分析思路:
- 筛选出出生日期大于‘1990-01-02’的数据:where 出生日期 > 1990-01-02’
- 将数据按照性别分组:group by 性别
- 分别计算每一组的人数:count 性别
把上面的分析思路整理成SQL语句,如下:
select 性别,count(*) as 学生人数
from student
where 出生日期 > 1990-01-02’
group by 性别;
以上语句运行的结果如下:
![bb7aae5f8faba4f11c263060a715e587.png](https://i-blog.csdnimg.cn/blog_migrate/2afc8a5449b63d3b090726e5916b1637.jpeg)
3.对分组结果指定条件
上个栗子,你统计出了出生日期大于‘1990-01-02’的男生总数、女生总数后,只想显示男生的数据,该如何写语句呢?可以使用‘having’语句对分组结果,指定条件,写法如下:
select 性别,count(*) as 学生人数
from student
where 出生日期 > 1990-01-02’
group by 性别
having 性别 = 男;
注意:
这里为什么不用‘where’子句来指定条件?因为where只能指定行的原始数据。
‘having’,用于对分组以后数据,指定条件。
4.对查询结果排序
统计出数据后,为了方便观察,通常需要对数据进行排序,简单的排序有两种,升序、降序。我们在excel中都使用过类似的功能,那么在SQL中如何实现?
![c84a55141e885c41e64cba8b9c8fd59d.png](https://i-blog.csdnimg.cn/blog_migrate/262d7ee5c673ad78aa2aa262cf4eec3b.jpeg)
在SQL通过‘order by’函数来实现,一般有两种排序,降序(desc):从大到小,升序(asc):从小到大。
举个例子:
现在有一张成绩表‘score’,如下。现在你想计算出平均成绩大于80分的课程,并由高到低排列,该如何写函数?
![97093f75c21bf69b5d07827c9eab0e10.png](https://i-blog.csdnimg.cn/blog_migrate/fd92b8c038922f544d841bf9965bbc30.jpeg)
我们先写出分析思路,如下:
- 对成绩按照课程号分组:group by 课程号
- 求课程的平均值:avg (成绩) as 平均成绩
- 平均成绩大于80分: having 平均成绩 >80
- 由高到低排列(降序):order by 平均成绩 desc
把上面的分析思路整理成SQL语句,如下:
select 课程号,avg(成绩) as 平均成绩
from score
group by 课程号
having avg(成绩) > 80
oorder by 平均成绩 desc;
注意:
使用‘order by’语句的时候,如果查询的列包含空值,空值会在查询结果的开头展示。如果数据库有大量数据,你只想返回一部分数据的时候,该怎么办?可以使用limit,从查询结果中,展示指定行的数据。写法如下:
select *
from score
limit 2;
意思就是只取前两行数据。
汇总分析就到这里了,关于SQL的内容还有最后一节:复杂查询,讲完了会分享一案例和数据分析的基本思路。其实SQL学习来并不很很难,它就是一门工具,你使用的越多就会越熟练。要多多练习!
欢迎持续关注,公号:数据产品经理之路。