MySQL必知必会分组数据和汇总数据

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 汇总数据,分组数据具体涉及到的SQL语句

汇总数据

聚集函数

聚集函数:运行在行组上,计算和返回单个值的函数

SQL聚集函数

函数 说明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

AVG函数

例:返回products表中所有产品的平均价格:

SELECT  AVG(prod_price) AS avg_price
FROM products;

xn_2022-08-29_09-18-02

:paintbrush:AVG函数忽略列值为NULL的行

COUNT函数

确定表中行的数目或符合特定条件的行的数目。

例:返回customers表中客户的总数

SELECT COUNT(*) AS num_cust
FROM customers;

xn_2022-08-29_09-26-27

例:只对具有电子邮件的客户计数

SELECT COUNT(cust_email) AS num_cust
FROM customers;

xn_2022-08-29_09-28-48

MAX函数

SELECT MAX(prod_price) AS max_price
FROM products;

xn_2022-08-29_09-30-44

:unicorn:用于文本数据时,如果数据按相应的列排序,则max返回最后一行。

:dagger:MAX函数忽略列值为NULL的行

MIN函数

MIN函数与MAX函数正好相反

SUM函数

sum用来返回指定列值的和

例:检索所订购的物品的总数。

SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;

xn_2022-08-29_09-38-22

SUM还可以与之前的计算字段进行联动

例:求总的订单金额

SELECT SUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;

xn_2022-08-29_09-41-51

聚集不同值

:warning:下面介绍聚集函数的DISTINCT的使用,mysql4.x是不能正常使用的。

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;

xn_2022-08-29_09-49-49

:date:DISTINCT不能用于COUNT(*)。

组合聚集函数

SELECT COUNT(*)  AS num_items,
        MIN(prod_price) AS price_min,
        MAX(prod_price) AS price_max,
        AVG(prod_price) AS price_avg
FROM products;

xn_2022-08-29_09-55-51

分组数据

数据分组

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

创建分组

分组是在SELECT语句的GROUP BY子句中建立的。

例:

SELECT vend_id ,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;

xn_2022-08-29_10-18-21

重要规定

  1. GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制。
  2. 如果在GROUP BY 子句中嵌套了分组,数据将会在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算。(所以不能从个别列取回数据)
  3. GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名
  4. 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出
  5. 如果分组列中有null值,则null将作为一个分组返回,如果有多行null值,他们将分为一个组
  6. GROUP BY子句必须在WHERE子句之后,ORDER BY 子句之前。

使用ROLLUP关键字

SELECT vend_id ,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id WITH ROLLUP;

xn_2022-08-29_10-31-35

过滤分组

HAVING非常类似WHERE。事实上,目前为止的所学习的所有类型的WHERE子句均可用HAVING来代替。唯一的区别在于HAVING过滤分组,WHERE过滤行

SELECT cust_id ,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;

xn_2022-08-29_10-45-15

:pencil:HAVING和WHERE的区别:

WHERE是在数据分组前进行过滤,HAVING是在数据分组后进行过滤。这是一个重要区别,WHERE排除的行不包括在分组中。这可能改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

例: 列出具有2个以上,价格为10以上的产品的供应商

SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

xn_2022-08-29_10-53-06

分组和排序

虽然GROUP BY和ORDER BY 经常完成相同的工作,但是他们是非常不同的。

ORDER BY GROUP BY
排序产生的输出 分组行。但输出可能不是分组的顺序。
任意列都可以使用,甚至非选择的列也可以使用 只可能使用选择列或表达式列,而且必须使用每个选择列表达式
不一定需要 如果与聚集函数一起使用列,则必须使用
SELECT order_num ,SUM(quantity*item_price) AS ordertotal 
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;

xn_2022-08-29_14-17-56

SELECT子句顺序

SELECT 子句及其顺序

子句 说明 是否必须使用
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表中选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的行数
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
148 0
|
1月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
47 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
1月前
|
关系型数据库 MySQL 数据库
mysql 里创建表并插入数据
【10月更文挑战第5天】
119 1
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
114 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
8天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
42 14
|
11天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
43 9
|
18天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
23天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
19天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
38 1
|
21天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。