暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL-聚合函数

SQL数据分析 2021-04-29
365

MySQL
聚合函数

聚合函数也是函数的一种,比较常用,这里我们就单独拿出来介绍下。
聚合函数一般配合group by来使用,经常是用来对数据集中的数值求和、平均值啊这里类的。

聚合函数的默认特性

  • 忽略NULL值

  • 如果没有匹配的记录,返回NULL

  • 如果没有使用group by,则默认对所有字段进行group by

常用聚合函数

这里的测试数据依然使用前面的数据,可以参考前面的文章。

count

统计结果集的数量,没有结果时,返回0



-- 我们以学生表为例,来统计每个班级的学生人数
select 
    c_id,count(1),
    count(s_id),
    -- 这里学生ID是唯一的,所以是否使用distinct是一样的
    count(distinct s_id),
    -- 统计班级的个数
    count(distinct c_id)
from 
    t_student 
group by 
    c_id;


当我们只使用count,不使用group by的时候,相当于对所有字段进行group by

select 
    count(1)
from 
    t_student
;


这里,我们再来看下count对于null值得处理


select 
    -- count(*),是包括null值的
    count(*),
    -- count(1),也包括null值
    count(1),
    -- 指定字段的时候,是不包括null值的
    count(id),
    -- 同样也不包括null值
    count(DISTINCT id)
from (
    select 1 as id
    union select NULL
    union select 2
)x


avg、sum

计算结果集的平局值和结果集的累加和

-- 统计每个学生的平均分和总分
select 
    s_id,
    avg(score),
    sum(score) 
from 
    t_score
group by 
    s_id
;


我们再来看看avg和sum对null值的处理


select 
    -- count指定字段,是不包括null值的
    count(score),
    -- avg也是不包括null值的
    avg(score),
    -- 如果想要统计score的记录,需要使用ifnull进行判断
    avg(IFNULL(score,0)),
    -- 求和
    sum(score)
from (
    select 10 as score
    union select NULL
    union select 20
)x;


min、max

统计结果集的最小值和最大值

select 
    s_id,
    -- 最低分
    min(score),
    -- 最高分
    max(score)
from 
    t_score
group by 
    s_id
;



如果没有匹配的记录,则返回null;如果结果集中有null值,会忽略null

select 
    max(score),
    min(score)
from (
    select 10 as score
    union select NULL
    union select 20
)x;


group_concat

group_concat会将函数聚合后的所有值以逗号分隔,以字符串展现


GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC
] [,col_name ...]]
             [SEPARATOR str_val])


select 
    s_id,
    -- 将该学生所有的成绩以逗号分隔显示
    group_concat(score)
from 
    t_score
group by 
    s_id
;

having

在聚合函数的使用过程中,通常还会使用having来对聚合后的数据进行过滤


select 
    s_id,
    sum(score) sum_score
from 
    t_score
group by 
    s_id
-- 总分大于150分
having 
    sum_score > 150



文章转载自SQL数据分析,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论