概述

在 SQL 中有一种函数叫做聚集函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。通常我们可以利用聚集函数汇总表的数据,如果稍微复杂一些,我们还需要先对数据做筛选,然后再进行聚集,比如先按照某个条件进行分组,对分组条件进行筛选,然后得到筛选后的分组的汇总信息。

聚合函数

SQL 中的聚集函数一共包括 5 个,可以帮我们求某列的最大值、最小值和平均值等,它们分别是:
image.png
我们来看一些简单的示例:

  1. // 查询最大生命值大于 6000 的英雄数量
  2. SELECT COUNT(*) FROM heros WHERE hp_max > 6000;
  3. // 查询最大生命值大于 6000,且有次要定位的英雄数量
  4. SELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000;

PS:

  • COUNT(role_assist)会忽略值为 NULL 的数据行,而 COUNT(*) 只是统计数据行数,不管某个字段是否为 NULL。
  • AVG、MAX、MIN 等聚集函数会自动忽略值为 NULL 的数据行,MAX 和 MIN 函数也可以用于字符串类型数据的统计,如果是英文字母,则按照 A—Z 的顺序排列,越往后,数值越大。

我们来看一个示例:

  1. SELECT MIN(CONVERT(name USING gbk)), MAX(CONVERT(name USING gbk)) FROM heros;

针对汉字,需要先把 name 字段统一转化为 gbk 类型,使用CONVERT(name USING gbk),然后再使用 MIN 和 MAX 取最小值和最大值。

数据的分组聚合

在做统计的时候,可能需要先对数据按照不同的数值进行分组,然后对这些分好的组进行聚集统计。对数据进行分组,需要使用 GROUP BY 子句。
比如我们想按照英雄的主要定位进行分组,并统计每组的英雄数量:

  1. SELECT COUNT(*), role_main FROM heros GROUP BY role_main

image.png
PS:需要注意的是,如果字段为 NULL,也会被列为一个分组。
我们也可以使用多个字段进行分组,这就相当于把这些字段可能出现的所有的取值情况都进行分组,示例代码如下:

  1. SELECT
  2. COUNT(*) as num, role_main, role_assist
  3. FROM heros
  4. GROUP BY role_main, role_assist
  5. ORDER BY num DESC;

分组过滤

当我们创建出很多分组的时候,有时候就需要对分组进行过滤。过滤分组我们使用的是 HAVING。
HAVING 的作用和 WHERE 一样,都是起到过滤的作用,只不过 WHERE 是用于数据行,而 HAVING 则作用于分组。
比如我们想要按照英雄的主要定位、次要定位进行分组,并且筛选分组中英雄数量大于 5 的组,最后按照分组中的英雄数量从高到低进行排序:

  1. SELECT
  2. COUNT(*) as num, role_main, role_assist
  3. FROM heros
  4. GROUP BY role_main, role_assist
  5. HAVING num > 5
  6. ORDER BY num DESC;

image.png
PS:HAVING 支持所有 WHERE 的操作,因此所有需要 WHERE 子句实现的功能,你都可以使用 HAVING 对分组进行筛选。
我们可以来看一个 WHERE 和 HAVING 的组合示例如下:

  1. SELECT
  2. COUNT(*) as num, role_main, role_assist
  3. FROM heros
  4. WHERE hp_max > 6000
  5. GROUP BY role_main, role_assist
  6. HAVING num > 5
  7. ORDER BY num DESC;

image.png