【跟着例子学MySQL】生成统计报告 --分组聚合

文章目录

  • 前言
  • 生成报告
  • DISTINCT 关键字
  • GROUP BY 子句
  • GROUP BY 聚合函数
  • HAVING 子句
  • WITH ROLLUP 子句
  • 未完待续


前言

在这里插入图片描述
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。

为什么要写这个系列?

  • 模仿是最好的老师,实践是检验成果的方法。
  • 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。

为什么要学习MySQL?

  • MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
  • 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础

跟别的入门教材有什么不同?

  • 以一个贯穿始终的应用场景为主线,渐进地讲解用法
  • 难度适中,既有基础方法,也有值得注意的关键细节

本系列文章不包含哪些内容?

该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:

  • MySQL安装方法
  • MySQL系统管理方法,例如备份、恢复、导入导出等
  • 高级主题,例如数据库监控、数据库调优和SQL优化

生成报告

上一篇👉《【跟着例子学MySQL】窥探数据本质 – Select语句基础》介绍了SELECT语句基本用法,这篇文章接着介绍如何利用SELECT语句生成统计报告。要生成统计报告,我们通常需要对命中的行做聚合操作。


DISTINCT 关键字

一列可能有重复的值,我们可以使用关键字DISTINCT只选择不同的值。我们还可以对几个列使用DISTINCT来选择这些列的不同组合。例如:

-- 不用DISTINCT
mysql> SELECT price FROM products;
+-------+
| price |
+-------+
| 1.23 |
| 1.25 |
| 1.25 |
| 0.48 |
| 0.49 |
+-------+
-- price列使用DISTINCT
mysql> SELECT DISTINCT price AS `Distinct Price` FROM products;
+----------------+
| Distinct Price |
+----------------+
| 1.23 |
| 1.25 |
| 0.48 |
| 0.49 |
+----------------+
-- price和name一起使用DISTINCT 
mysql> SELECT DISTINCT price, name FROM products;
+-------+-----------+
| price | name |
+-------+-----------+
| 1.23 | Pen Red |
| 1.25 | Pen Blue |
| 1.25 | Pen Black |
| 0.48 | Pencil 2B |
| 0.49 | Pencil 2H |
+-------+-----------+


GROUP BY 子句

GROUP BY子句允许将具有相同值的多个记录组成一组。例如:

mysql> SELECT * FROM products ORDER BY productCode, productID;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
+-----------+-------------+-----------+----------+-------+
mysql> SELECT * FROM products GROUP BY productCode;
-- 每一组中只显示第一个记录
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
+-----------+-------------+-----------+----------+-------+

GROUP BY本身并没有任何意义。它与聚合函数(例如COUNT(), AVG(), SUM())一起使用以生成分组统计摘要。


GROUP BY 聚合函数

我们可以将组通GROUP BY聚合函数应用于每个组,以生成组汇总报告。COUNT(*)函数返回命中的行数;COUNT(columnName)只统计给定列的非NULL值个数。例如:

-- COUNT(*)函数返回命中的行数
mysql> SELECT COUNT(*) AS `Count` FROM products;
-- 没有使用GROUP BY子句,返回所有行的数量
+-------+
| Count |
+-------+
| 5     |
+-------+
mysql> SELECT productCode, COUNT(*) FROM products GROUP BY productCode;
+-------------+----------+
| productCode | COUNT(*) |
+-------------+----------+
| PEC         | 2        |
| PEN         | 3        |
+-------------+----------+

-- 按COUNT排序 - 需要定义一个别名用于引用
mysql> SELECT productCode, COUNT(*) AS count
FROM products
GROUP BY productCode
ORDER BY count DESC;
+-------------+-------+
| productCode | count |
+-------------+-------+
| PEN         | 3     |
| PEC         | 2     |
+-------------+-------+

COUNT()外,还有许多其他的GROUP BY聚合函数,如AVG()MAX()MIN()SUM()。例如:

mysql> SELECT MAX(price), MIN(price), AVG(price), STD(price), SUM(quantity)
FROM products;
-- 没有GROUP BY - 所有行
+------------+------------+------------+------------+---------------+
| MAX(price) | MIN(price) | AVG(price) | STD(price) | SUM(quantity) |
+------------+------------+------------+------------+---------------+
| 1.25       | 0.48       | 0.940000   | 0.371591   | 33000         |
+------------+------------+------------+------------+---------------+
mysql> SELECT productCode, MAX(price) AS `Highest Price`, MIN(price) AS `Lowest Price`
       FROM products
       GROUP BY productCode;
+-------------+---------------+--------------+
| productCode | Highest Price | Lowest Price |
+-------------+---------------+--------------+
| PEC         | 0.49          | 0.48         |
| PEN         | 1.25          | 1.23         |
+-------------+---------------+--------------+
mysql> SELECT productCode, MAX(price), MIN(price),
              CAST(AVG(price) AS DECIMAL(7,2)) AS `Average`,
              CAST(STD(price) AS DECIMAL(7,2)) AS `Std Dev`,
              SUM(quantity)
       FROM products
       GROUP BY productCode;
-- 使用`CAST(... AS ...)`函数来格式化浮点数
+-------------+------------+------------+---------+---------+---------------+
| productCode | MAX(price) | MIN(price) | Average | Std Dev | SUM(quantity) |
+-------------+------------+------------+---------+---------+---------------+
| PEC         | 0.49       | 0.48       | 0.49    | 0.01    | 18000         |
| PEN         | 1.25       | 1.23       | 1.24    | 0.01    | 15000         |
+-------------+------------+------------+---------+---------+---------------+

HAVING 子句

HAVING 类似于WHERE,但它可以对 GROUP BY聚合函数进行操作;而WHERE只在列上操作。

mysql> SELECT productCode AS `Product Code`,
              COUNT(*) AS `Count`,
              CAST(AVG(price) AS DECIMAL(7,2)) AS `Average`
       FROM products
       GROUP BY productCode
       HAVING Count >=3;
-- 不能使用 WHERE count >= 3
+--------------+-------+---------+
| Product Code | Count | Average |
+--------------+-------+---------+
| PEN          | 3     | 1.24    |
+--------------+-------+---------+

WITH ROLLUP 子句

WITH ROLLUP子句显示了组统计信息的统计信息,例如,

mysql> SELECT productCode,
              MAX(price),
              MIN(price),
              CAST(AVG(price) AS DECIMAL(7,2)) AS `Average`,
              SUM(quantity)
       FROM products
       GROUP BY productCode
       WITH ROLLUP; -- 将聚合函数应用于所有组
+-------------+------------+------------+---------+---------------+
| productCode | MAX(price) | MIN(price) | Average | SUM(quantity) |
+-------------+------------+------------+---------+---------------+
| PEC         | 0.49       | 0.48       | 0.49    | 18000         |
| PEN         | 1.25       | 1.23       | 1.24    | 15000         |
| NULL        | 1.25       | 0.48       | 0.94    | 33000         |
+-------------+------------+------------+---------+---------------+

未完待续

下一篇我们接着介绍UPDATE语句的用法。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627991.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端铺子后台管理系统:基于Vue3与Ant Design Vue的轻量级解决方案

一、引言 随着前端技术的飞速发展,构建高效、轻量且易于维护的后台管理系统成为了企业信息化建设的重要一环。前端铺子后台管理系统,作为一款基于Vue的前端框架,结合Ant Design Vue的UI组件库,为企业提供了一个高效、灵活的后台管…

铁路机辆作业移动智能终端的特点是什么?

在铁路机辆作业的现代化进程中,移动智能终端以其独特的优势成为了不可或缺的装备。这些终端以其高度的便携性,使得工作人员能够随时随地处理各种作业任务,极大地提升了工作效率。它们具备出色的抗干扰性和高防护性,能够在复杂多变…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3,并实现了一些简单的问答,但是问答的界面是在命令提示符中,交互很不友好,也不方便局域网其他用户访问,所以这节用docker部署MaxKB实现网页访问llama3,首先电脑上需要…

26版SPSS操作教程(高级教程第二十二章)

目录 前言 粉丝及官方意见说明 第二十二章一些学习笔记 第二十二章一些操作方法 联合分析 假设数据 具体操作 结果解释 联合分析的数据建模 CONJOINT过程语法 汽车偏好研究 具体操作 结果解释 高精统计图 市场占有率模拟 结果解释 结束语 前言 #一路向光而…

STL—string类(1)

一、string类 1、为什么要学习string? C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象…

【Fastadmin】自定义404页面

1.修改config.php // 文件路径:application/config.php// 自定义错误码模板http_exception_template > [// 定义404错误的模板渲染404 > APP_PATH . common/view/404/404.html,], 2.需要把debug关闭才能生效 在.env文件中把debug true,改为…

阿里云OSS如果指定某个文件夹给子账户

** 第一步创建子账号 ** 创建完用户不要给任何权限! 当前页面切换到认证管理获取AccessKey即可 第二步目录授权 找到对应桶文件目录 上面授权按钮操作 选择添加的子账号账号保存即可!

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转 1. 源由2. 视频效果2.1 整体刷新率不高2.2 网络延迟可接受2.3 带宽增加丢包明显2.4 实测效果流畅 3. 总结 1. 源由 上一次,由于ZeroTier使用了国外服务器,延迟~ 569 ms,花屏、卡顿。 本着…

[自动化]pyautogui的使用

目录 环境 包的版本 前置知识 鼠标控制函数 屏幕与鼠标位置 size() position() OnScreen() 鼠标移动 moveTo() move() 鼠标拖动 dragTo() drag() mouseDown()按下鼠标 mouseUp()松开鼠标 鼠标滚动 scroll() 键盘控制函数 write() press() keyDown()和keyU…

数据分析(二)——导入外部数据,导入Excel数据,CSV文件,txt文件,HTML网页,数据抽取,DataFrame对象的loc属性与iloc属性

一.导入外部数据 1.导入.xIs或.xIsx文件 pd.read_ excel(io,sheet_ name,header) 1.1常用参数说明 ●io:表示.xIs或.xIsx文件路径或类文件对象 ●sheet name:表示工作表,取值如下表所示 ●header:默认值为0,取第一行的值为列名,数据为除列…

深度剖析MyBatis的一级缓存

概述 MyBatis 的一级缓存是什么时候开启的? 在 MyBatis 中, 一级缓存是默认开启的 。 参考:MyBatis缓存的概念 通过场景来理解: 场景一 1、在一个 SqlSession 中,对 User 表进行两次根据 ID 的查询,查看发出 sql …

一步一步带你做网络工程

网络工程怎么做 一、网络设备交换机的应用: 要求:在此接入交换机S3700,上划分两个vlan,vlan10和vlan20分别有两个PC,按拓扑图完成要求: 划分vlan添加端口 sys [Huawei]sys S1 [S1]undo in e [S1]undo t…

2024年重庆等保测评公司有哪些?分别位于哪里?

2024年重庆等保测评公司有哪些?分别位于哪里? 【回答】:目前2024年重庆等保测评公司有四家,具体公司名称以及地址如下: 1、重庆信安网络安全等级测评有限公司,重庆市两江新区黄山大道中段55号附2号麒麟D座…

新手小白如何使用云平台复现论文代码——体验yolov8监控交通流

介绍:YOLOv8 是一种开源目标检测算法(模型),是 YOLO(You Only Look Once) 系列算法的最新版本。它使用单次预测框架对图像中的对象进行定位和分类。这种方法可以检测多个对象,并且速度更快,准确率更高。 参…

JavaScript引入方式

JS引入方式 1 内部脚本方式引入2 外部脚本方式引入 1 内部脚本方式引入 说明 在页面中,通过一对script标签引入JS代码script代码放置位置具备一定的随意性,一般放在head标签中居多 代码 <!DOCTYPE html> <html lang"en"><head><meta charset…

照片误删如何恢复?这些方法帮你重拾回忆!

手机照片是我们记录美好时刻的重要工具。但有时我们会因为不小心或者错误操作而导致珍贵照片的丢失。那些与家人、朋友共度的美好时刻、旅途中的风景、重要的纪念日&#xff0c;一旦删除&#xff0c;就如同从记忆中抹去&#xff0c;令人惋惜不已。幸运的是&#xff0c;随着科技…

JavaScript函数声明

JS函数声明 JS中的方法,多称为函数,函数的声明语法和JAVA中有较大区别 语法1&#xff1a;function 函数名 (参数列表){函数体} 语法2&#xff1a;var 函数名 function (参数列表){函数体} 函数说明 函数没有权限控制符不用声明函数的返回值类型,需要返回在函数体中直接return即…

低空经济之无人机

朋友们&#xff0c;今天来聊聊个超酷的话题——低空经济之无人机&#xff01; 无人机不仅让天空变得触手可及&#xff0c;还带来了无尽的商业可能&#xff0c;简直就是新时代的“空中小助手”啊&#xff01; 说到无人机&#xff0c;你们是不是也和我一样&#xff0c;脑海里立马…

20240514基于深度学习的弹性超材料色散关系预测与结构逆设计

论文&#xff1a;Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI&#xff1a;https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能&#xff0c;保证了各种各样的具…

Base64编码

一、什么是BASE64编码 在了解BASE64编码之前&#xff0c;首先回顾一下ASCII码&#xff1a; ASCII码&#xff1a; ASCII&#xff08;American Standard Code for Information Interchang&#xff09;漂亮国信息交换标准代码。 ASCII 码使用7个二进制位来表示一个字符&#xf…