前面我们介绍了mysql数据库中的建表导表的步骤以及基础的SELECT语句,本篇再基于第一篇文章的数据基础上我们梳理下聚合和分组。
对表进行聚合学习重点
使用聚合函数对表中的列进行计算合计值或者平均值等的汇总操作。
通常,聚合函数会对NULL以外的对象进行汇总。但是只有COUNT函数例外,使用COUNT(*)可以查出包含NULL在内的全部数据行数。
使用DISTINCT关键字删除重复值。
通过SQL对数据进行某种操作或计算时需要使用某种函数,如:计数count函数,求和sum函数等。
以下是5个最常用的函数:
count:计算表中的记录数(行数)
sum:计算表中数值列中数据的合计值
avg:计算表中数值列中数据的平均值
max:求出表中任意列中数据的最大值
min:求出表中任意列中数据的最小值
用于汇总的函数称为聚合函数,所谓聚合,就是将多行汇总为一行,实际上,所有的聚合函数都是这样,输入多行输出一行。
例如我们将上面的第2题改一改
查询1990年出生的学生人数
select
count(s_id)
from
student
where
year(s_age)='1990';
运行结果如下:(这里由原来的5行记录汇总聚合成了一行)
查询"李"姓老师的数量
select
count(t_id) as "李"姓老师的数量
from
teacher
where
t_name like '李%'
group by
t_id;
运行结果如下:(这里由原来的5行记录汇总聚合成了一行)
select count(t_id) as ‘"李"姓老师的数量’ from teacher where t_name like ‘李%’ group by t_id;
对表进行分组学习重点
使用GROUP BY子句可以像切蛋糕那样将表分割。通过使用聚合函数和GROUP BY子句,可以根据某个分组依据将表分割后再进行汇总。
聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。
使用聚合函数和GROUP BY子句时需要注意以下4点。1.只能写在SELEC子句之中2.GROUP BY子句中不能使用SELECT子句中列的别名3.GROUP BY子句的聚合结果是无序的。4.WHERE子句中不能使用聚合函数。
如果只使用聚合函数,则是针对表中的所有数据进行汇总处理,如果我们想把表中的数据按某种划分方式划分成几组,再看每组的汇总结果,比如我们想看一下每门课程的学生人数该怎样去处理呢?那就需要加入GROUP BY子句。
语法6. GROUP BY子句
SELECT ,...
FROM
GROUP BY ,...;
下面我们来练习一下
查询每门课程被选修的学生数
select
c_id,
count(s_id) as '选修学生数'
from
stu_sco
group by
c_id;
运行结果如下:
可以看出在未使用GROUP BY子句时,结果只有一行,使用GROUP BY子句后,将表中的数据按照c_id进行了切分处理,然后返回每组的聚合结果。
查询同名同姓学生名单,并统计同名人数
select
s_name,
count(s_name)-1 as num
from
student
group by
s_name;
运行结果如下:
这里我们可以看数据中并没有重名的人。
这里我们思考一个问题:
那么分组和聚合的关系是什么呢?是有聚合就一定有分组呢?还是有分组就一定有聚合呢?再或者是两者必须同时出现缺一不可呢?
这里小编给出的答案是:这里并没有什么绝对的情况。
当然一般情况下两者是同时出现的。(我们既然进行了分组,是想看分组后返回的每组的聚合结果)
有聚合没有分组的情况:例如我们题3中,只有count(*)并没有group by ,是因为这里我们查的是where条件筛选后的全部行的计数,只有一组的情况下,就不需要group by啦。
有分组没有聚合的情况:当按照主键进行分组时,select子句中没有聚合函数代码也不会报错,但这样的分组也基本没有意义,基本不会这样去写,这里只是举个小栗子。
完 谢谢观看