SQL 必知必会
陈旸
清华大学计算机博士
73337 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?

筛选最大生命值与最大法力值之和大于7000的英雄并进行分组
筛选最大生命值大于6000的英雄并进行分组
筛选分组英雄数量大于5的分组
按照分组的英雄数量进行排序
统计每组的英雄数量
按照主要定位和次要定位进行分组
按照次要定位进行分组
按照主要定位进行分组
使用DISTINCT函数进行聚集
在一条SELECT语句中使用多个聚集函数
统计不同生命最大值英雄的平均生命最大值
统计不同生命最大值的英雄数量
查询射手英雄的最大生命值的最大值
查询最大生命值大于6000的英雄数量
SUM
MIN
MAX
AVG
COUNT
对分组进行过滤的例子
HAVING与WHERE的区别
对分组进行聚集统计
使用GROUP BY进行数据分组
聚集函数的使用技巧
使用聚集函数的例子
聚集函数的种类
聚集函数的作用
使用HAVING过滤分组
数据分组和聚集统计
SQL的聚集函数

该思维导图由 AI 生成,仅供参考

我们上节课讲到了 SQL 函数,包括算术函数、字符串函数、日期函数和转换函数。实际上 SQL 函数还有一种,叫做聚集函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。通常我们可以利用聚集函数汇总表的数据,如果稍微复杂一些,我们还需要先对数据做筛选,然后再进行聚集,比如先按照某个条件进行分组,对分组条件进行筛选,然后得到筛选后的分组的汇总信息。
有关今天的内容,你重点需要掌握以下几个方面:
聚集函数都有哪些,能否在一条 SELECT 语句中使用多个聚集函数;
如何对数据进行分组,并进行聚集统计;
如何使用 HAVING 过滤分组,HAVING 和 WHERE 的区别是什么。

聚集函数都有哪些

SQL 中的聚集函数一共包括 5 个,可以帮我们求某列的最大值、最小值和平均值等,它们分别是:
这些函数你可能已经接触过,我们再来简单复习一遍。我们继续使用 heros 数据表,对王者荣耀的英雄数据进行聚合。
如果我们想要查询最大生命值大于 6000 的英雄数量。
SQLSELECT COUNT(*) FROM heros WHERE hp_max > 6000
运行结果为 41。
如果想要查询最大生命值大于 6000,且有次要定位的英雄数量,需要使用 COUNT 函数。
SQLSELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000
运行结果是 23。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SQL聚集函数是对数据进行汇总的重要工具,能够帮助我们求取最大值、最小值和平均值等统计信息。本文详细介绍了SQL中的聚集函数种类及使用方法。首先介绍了包括COUNT、AVG、MAX、MIN和SUM在内的聚集函数,以及它们的使用方法和示例。其次,讲解了如何对数据进行分组,并进行聚集统计,使用GROUP BY子句对数据进行分组,并通过示例展示了对数据进行分组统计的方法。最后,介绍了HAVING子句的使用方法和与WHERE子句的区别,通过示例演示了如何使用HAVING对分组进行过滤。读者通过本文可以快速了解SQL聚集函数的概念和使用方法,以及在SELECT查询中关键字的顺序。文章还提供了两个基于heros数据表的SQL查询语句示例,帮助读者加深理解。总之,本文为读者提供了全面的SQL聚集函数知识,帮助其在实际应用中更加灵活运用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(130)

  • 最新
  • 精选
  • grey927
    ORDER BY 是对分的组排序还是对分组中的记录排序呢?

    作者回复: 这是个好问题,ORDER BY就是对记录进行排序。如果你在前面用到了GROUP BY,实际上是一种分组的聚合方式,已经把一组的数据聚合成为了一条记录,所以再进行排序的时候,也相当于是对分的组进行排序。

    2019-07-04
    2
    75
  • 不负
    一个发现:虽然 SELECT 的执行顺序在 GROUP BY 和 HAVING 后面,但对于SELECT中列的别名都可以使用。 MySQL中 1. > SELECT COUNT(*) as num, role_main, AVG(hp_max) FROM heros -> WHERE hp_max>6000 -> GROUP BY role_main -> HAVING COUNT(*)>5 -> ORDER BY COUNT(*) DESC; +-----+-----------+-------------+ | num | role_main | AVG(hp_max) | +-----+-----------+-------------+ | 17 | 战士 | 7028 | | 10 | 坦克 | 8312.4 | | 6 | 法师 | 6417 | +-----+-----------+-------------+ 2. > SELECT COUNT(*) num, ROUND(AVG(hp_max+mp_max), 2) avg, ROUND(MAX(hp_max+mp_max), 2) max, ROUND(MIN(hp_max+mp_max), 2) min FROM heros -> WHERE (hp_max+mp_max)>7000 -> GROUP BY attack_range -> ORDER BY num DESC; +-----+---------+----------+---------+ | num | avg | max | min | +-----+---------+----------+---------+ | 36 | 8654.42 | 11036.00 | 7117.00 | | 26 | 7743.77 | 8737.00 | 7025.00 | +-----+---------+----------+---------+

    作者回复: 在执行顺序上,SELECT字段在GROUP BY和HAVING之后,不过在SELECT字段之前,已经计算了聚集函数,也就是COUNT(*) as num。聚集函数的计算在GROUP BY之后,HAVING之前

    2019-06-28
    4
    47
  • ack
    练习题 1.SELECT COUNT(*) AS num,role_main,AVG(hp_max) FROM heros WHERE hp_max > 6000 GROUP BY role_main HAVING num>5 ORDER BY num DESC; 2.SELECT COUNT(*) AS num,ROUND(MAX(hp_max+mp_max),2),ROUND(AVG(hp_max+mp_max),2),ROUND(MIN(hp_max+mp_max),2) FROM heros WHERE hp_max+mp_max > 7000 GROUP BY attack_range ORDER BY num DESC;

    作者回复: 正确

    2019-06-28
    3
    20
  • 丁丁历险记
    讲个段子 having 常用来做过滤掉那些跑来冒充程序员的人。 他们深深的震惊了我的认知。

    作者回复: 哈哈

    2019-11-07
    2
    17
  • 吃饭饭
    讲的很详细了,入门必备

    作者回复: 谢谢!

    2019-06-28
    10
  • 安静的boy
    where先对数据进行排序,group by再进行分组。让我对数据筛选和分组恍然大悟!

    作者回复: 理解了HAVING和WHERE的区别,就了解了分组过滤和条件过滤。还有SELECT语句种的关键字的顺序:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

    2019-06-28
    8
  • 峻铭
    前面老师在评论中回复过,在group by分组和having筛选分组之间还有一步使用聚集函数进行计算,在目前看到的having都是对cout聚集函数结果的筛选,想试试对其他聚集函数的筛选,然后对训练1做了点小改动: select count(*) as c,role_main,avg(hp_max) as v from heros where hp_max > 6000 GROUP BY role_main HAVING c > 5 and v > 7000 order by c DESC;

    作者回复: Good Job

    2019-09-01
    7
  • bear
    Having 部分精彩,赞👍

    作者回复: 感谢

    2019-08-17
    5
  • mickey
    有个错误: 文中“比如,我们想要按照英雄的主要定位、次要定位进行分组,查看这些英雄的数量,并按照这些分组的英雄数量从高到低进行排序。”的SQL语句:SQL: SELECT COUNT(*), role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC 在MySQL里会报错:[Err] 1054 - Unknown column 'num' in 'order clause' 要改为:SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC;

    编辑回复: 您好,文章已进行更正,谢谢您的反馈。

    2019-06-28
    5
  • mickey
    /* 1.筛选最大生命值大于6000的英雄,按照主要定位进行分组,选择分组英雄数量大于5的分组, 按照分组英雄数从高到低进行排序,并显示每个分组的英雄数量、主要定位和平均最大生命值。 */ SELECT count(*) as num, role_main, AVG(hp_max) FROM heros WHERE hp_max > 6000 GROUP BY role_main HAVING num > 5 ORDER BY num DESC num role_main AVG(hp_max) ------------------------------------ 17 战士 7028 10 坦克 8312.4 6 法师 6417 /* 2.筛选最大生命值与最大法力值之和大于7000的英雄,按照攻击范围来进行分组, 显示分组的英雄数量,以及分组英雄的最大生命值与法力值之和的平均值、最大值和最小值, 并按照分组英雄数从高到低进行排序,其中聚集函数的结果包括小数点后两位。 */ SELECT count(*) as num, ROUND(AVG(hp_max + mp_max), 2), MAX(hp_max + mp_max), MIN(hp_max + mp_max) FROM heros WHERE hp_max + mp_max > 7000 GROUP BY attack_range HAVING num > 5 ORDER BY num DESC num, ROUND(AVG(hp_max + mp_max), 2), MAX(hp_max + mp_max), MIN(hp_max + mp_max) ------------------------------------------------------------------------ 62 8272.53 11036 7025

    作者回复: SQL正确,最后结果贴的不太完整

    2019-06-28
    4
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部