MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
立即订阅
1074 人已学习
课程目录
已更新 11 讲 / 共 34 讲
0/4登录后,你可以任选4讲全文学习。
课前准备 (2讲)
开篇词 | 在实战中学习,是解锁MySQL技能的最佳方法
免费
环境准备 | 带你安装MySQL和图形化管理工具Workbench
实践篇 (9讲)
01 | 存储:一个完整的数据存储过程是怎样的?
02 | 字段:这么多字段类型,该怎么定义?
03 | 表:怎么创建和修改表?
04 | 增删改查:如何操作表中的数据?
05 | 主键:如何正确设置主键?
06 | 外键和连接:如何做关联查询?
07 | 条件语句:WHERE 与 HAVING有什么不同?
08 | 聚合函数:怎么高效地进行分组统计?
09 | 时间函数:时间类数据,MySQL是怎么处理的?
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

08 | 聚合函数:怎么高效地进行分组统计?

朱晓峰 2021-03-25
你好,我是朱晓峰。今天,我来和你聊一聊聚合函数。
MySQL 中有 5 种聚合函数较为常用,分别是求和函数 SUM()、求平均函数 AVG()、最大值函数 MAX()、最小值函数 MIN() 和计数函数 COUNT()。接下来,我就结合超市项目的真实需求,来带你掌握聚合函数的用法,帮你实现高效的分组统计。
咱们的项目需求是这样的:超市经营者提出,他们需要统计某个门店,每天、每个单品的销售情况,包括销售数量和销售金额等。这里涉及 3 个数据表,具体信息如下所示:
销售明细表(demo.transactiondetails):
销售单头表(demo.transactionhead):
商品信息表(demo.goodsmaster):
要统计销售,就要用到数据求和,那么我们就先来学习下求和函数 SUM()。

SUM()

SUM()函数可以返回指定字段值的和。我们可以用它来获得用户某个门店,每天,每种商品的销售总计数据:
mysql> SELECT
-> LEFT(b.transdate, 10), -- 从关联表获取交易时间,并且通过LEFT函数,获取交易时间字符串的左边10个字符,得到年月日的数据
-> c.goodsname, -- 从关联表获取商品名称
-> SUM(a.quantity), -- 数量求和
-> SUM(a.salesvalue) -- 金额求和
-> FROM
-> demo.transactiondetails a
-> JOIN
-> demo.transactionhead b ON (a.transactionid = b.transactionid)
-> JOIN
-> demo.goodsmaster c ON (a.itemnumber = c.itemnumber)
-> GROUP BY LEFT(b.transdate, 10) , c.goodsname -- 分组
-> ORDER BY LEFT(b.transdate, 10) , c.goodsname; -- 排序
+-----------------------+-----------+-----------------+-------------------+
| LEFT(b.transdate, 10) | goodsname | SUM(a.quantity) | SUM(a.salesvalue) |
+-----------------------+-----------+-----------------+-------------------+
| 2020-12-01 | 书 | 2.000 | 178.00 |
| 2020-12-01 | 笔 | 5.000 | 25.00 |
| 2020-12-02 | 书 | 4.000 | 356.00 |
| 2020-12-02 | 笔 | 16.000 | 80.00 |
+-----------------------+-----------+-----------------+-------------------+
4 rows in set (0.01 sec)
可以看到,我们引入了 2 个关键字:LEFT 和 ORDER BY,你可能对它们不熟悉,我来具体解释下。
LEFT(str,n):表示返回字符串 str 最左边的 n 个字符。我们这里的 LEFT(a.transdate,10),表示返回交易时间字符串最左边的 10 个字符。在 MySQL 中,DATETIME 类型的默认格式是:YYYY-MM-DD,也就是说,年份 4 个字符,之后是“-”,然后是月份 2 个字符,之后又是“-”,然后是日 2 个字符,所以完整的年月日是 10 个字符。用户要求按照日期统计,所以,我们需要从日期时间数据中,把年月日的部分截取出来。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《MySQL 必知必会》,如需阅读全部文章,
请订阅文章所属专栏
立即订阅
登录 后留言

精选留言(4)

  • Kansei
    老师能说说count(*) ,count(1) ,count(列名),这3者的区别吗?
    2021-03-26
  • lesserror
    之前使用MySQL函数用来截取字符串使用的是SUBSTR函数,今天这节课新学了一个LEFT函数。

    不过就像右耳朵猫咪同学评论说的那样,对查询字段使用函数不恰当的话,有可能导致查询效率变慢。我的理解是索引失效。

    发现老师每篇内容都是言简意赅,实操性较强。适合当一个日常开发的工具书,随时查阅。
    2021-03-25
  • 右耳朵猫咪
    像sum()、avg()这样的函数都是统计非空的记录;文章中对group by后的字段做了函数处理,会降低性能,实际开发中不会这么搞。
    2021-03-25
    3
  • Michael
    我一直有个疑惑就是当我需要做对某些字段做group by来分组 我可能还需要其他不作为group by的字段 但是根据SQL标准 出现在select后面的字段要么是group by里的字段 要么是聚合函数 那么这种情况应该怎么处理呢?
    2021-03-25
收起评论
4
返回
顶部