登录
首页精彩阅读mysql面试经典50题:带你从聚合和分组开始
mysql面试经典50题:带你从聚合和分组开始
2020-06-09
收藏

前面我们介绍了mysql数据库中的建表导表的步骤以及基础的SELECT语句,本篇再基于第一篇文章的数据基础上我们梳理下聚合和分组。

对表进行聚合学习重点

  • 使用聚合函数对表中的列进行计算合计值或者平均值等的汇总操作。
  • 通常,聚合函数会对NULL以外的对象进行汇总。但是只有COUNT函数例外,使用COUNT(*)可以查出包含NULL在内的全部数据行数。
  • 使用DISTINCT关键字删除重复值。

通过SQL对数据进行某种操作或计算时需要使用某种函数,如:计数count函数,求和sum函数等。

以下是5个最常用的函数:

  • count:计算表中的记录数(行数)
  • sum:计算表中数值列中数据的合计值
  • avg:计算表中数值列中数据的平均值
  • max:求出表中任意列中数据的最大值
  • min:求出表中任意列中数据的最小值

用于汇总的函数称为聚合函数,所谓聚合,就是将多行汇总为一行,实际上,所有的聚合函数都是这样,输入多行输出一行。

例如我们将上面的第2题改一改

  1. 查询1990年出生的学生人数
select 
		count(s_id)
from 
		student 
where 
		year(s_age)='1990';

运行结果如下:(这里由原来的5行记录汇总聚合成了一行)

  1. 查询"李"姓老师的数量
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 <列名>,...;

下面我们来练习一下

  1. 查询每门课程被选修的学生数
select 
		c_id,
		count(s_id) as '选修学生数' 
from 
		stu_sco 
group by 
		c_id;

运行结果如下:

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

  1. 查询同名同姓学生名单,并统计同名人数
select 
		s_name,
    count(s_name)-1 as num 
from 
		student 
group by 
		s_name;

运行结果如下:

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

这里我们思考一个问题:

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

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

  1. 当然一般情况下两者是同时出现的。(我们既然进行了分组,是想看分组后返回的每组的聚合结果)
  2. 有聚合没有分组的情况:例如我们题3中,只有count(*)并没有group by ,是因为这里我们查的是where条件筛选后的全部行的计数,只有一组的情况下,就不需要group by啦。
  3. 有分组没有聚合的情况:当按照主键进行分组时,select子句中没有聚合函数代码也不会报错,但这样的分组也基本没有意义,基本不会这样去写,这里只是举个小栗子。

数据分析咨询请扫描二维码

客服在线
立即咨询