SQL聚集函数
聚集函数是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。通常我们可以利用聚集函数汇总表的数据,如果稍微复杂一些,我们还需要先对数据做筛选,然后再进行聚集,比如先按照某个条件进行分组,对分组条件进行筛选,然后得到筛选后的分组的汇总信息。
聚集函数都有哪些
SQL 中的聚集函数一共包括 5 个,可以帮我们求某列的最大值、最小值和平均值等,它们分别是:
COUNT() 总行数
MAX() 最大值
MIN() 最小值
SUM() 求和
AVG() 平均值
使用示例:
查询最大生命值大于 6000 的英雄数量
SELECT COUNT(*) FROM heros WHERE hp_max > 6000;
COUNT(*) 只是统计数据行数,不管某个字段是否为 NULL。
查询最大生命值大于 6000,且有次要定位的英雄数量
SELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000;
查询射手(主要定位或者次要定位是射手)的最大生命值的最大值是多少
SELECT MAX(hp_max) FROM heros WHERE role_main ='射手' or role_assist = '射手';
一条SELECT语句中可以使用了多项聚集函数查询
AVG、MAX、MIN 等聚集函数会自动忽略值为 NULL 的数据行,MAX 和 MIN 函数也可以用于字符串类型数据的统计。
如果是英文字母,则按照 A—Z 的顺序排列,越往后,数值越大。如果是汉字则按照全拼拼音进行排列。
需要注意的是,针对中文字符使用聚集函数需要使用CONVER(name USING gbk)转化为gbk类型。
也可以对数据行中不同的取值进行聚集,先用 DISTINCT 函数取不同的数据,然后再使用聚集函数,查询不同的生命最大值的英雄数量是多少:
SELECT COUNT(DISTINCT hp_max) FROM heros
对数据进行分组,并进行聚集统计
分组后只可以查询GROUP BY的列和聚集函数
做统计的时候,可能需要先对数据按照不同的数值进行分组,然后对这些分好的组进行聚集统计。
比如我们想按照英雄的主要定位进行分组,并统计每组的英雄数量:
SELECT COUNT(*), role_main FROM heros GROUP BY role_main;
如何使用 HAVING 过滤分组,HAVING与WHERE的区别
查询按照英雄的主要定位、次要定位进行分组,并且筛选分组中英雄数量大于 5 的组,最后按照分组中的英雄数量从高到低进行排序。
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC;
HAVING 的作用和 WHERE 一样,都是起到过滤的作用,只不过 WHERE 是用于数据行,而HAVING 则作用于分组。(where执行顺序先于group by)
对于分组的筛选,要用HAVING,HAVING 支持所有 WHERE 的操作,因此所有需要 WHERE 子句实现的功能,你都可以使用 HAVING 对分组进行筛选。
eg:
SELECT COUNT(*) as num, role_main, role_assist FROM heros WHERE hp_max > 6000 GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC
先增加了一个过滤条件,即筛选最大生命值大于 6000 的英雄。这里我们就需要先使用 WHERE 子句对最大生命值大于 6000 的英雄进行条件过滤,然后再使用 GROUP BY 进行分组,使用 HAVING 进行分组的条件判断,然后使用 ORDER BY 进行排序。