mysql按照月份统计 mysql按照月份分组_mysql按月份分组的面试题

前面我们介绍了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行记录汇总聚合成了一行)

mysql按照月份统计 mysql按照月份分组_主键_02

查询"李"姓老师的数量

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;

运行结果如下:

mysql按照月份统计 mysql按照月份分组_数据_03

可以看出在未使用GROUP BY子句时,结果只有一行,使用GROUP BY子句后,将表中的数据按照c_id进行了切分处理,然后返回每组的聚合结果。

查询同名同姓学生名单,并统计同名人数

select

s_name,

count(s_name)-1 as num

from

student

group by

s_name;

运行结果如下:

mysql按照月份统计 mysql按照月份分组_主键_04

这里我们可以看数据中并没有重名的人。

这里我们思考一个问题:

那么分组和聚合的关系是什么呢?是有聚合就一定有分组呢?还是有分组就一定有聚合呢?再或者是两者必须同时出现缺一不可呢?

这里小编给出的答案是:这里并没有什么绝对的情况。

当然一般情况下两者是同时出现的。(我们既然进行了分组,是想看分组后返回的每组的聚合结果)

有聚合没有分组的情况:例如我们题3中,只有count(*)并没有group by ,是因为这里我们查的是where条件筛选后的全部行的计数,只有一组的情况下,就不需要group by啦。

有分组没有聚合的情况:当按照主键进行分组时,select子句中没有聚合函数代码也不会报错,但这样的分组也基本没有意义,基本不会这样去写,这里只是举个小栗子。

完 谢谢观看