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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
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
目录
相关文章
|
1天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之ODPS数据怎么Merge到MySQL数据库
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
1天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之mysql节点如何插入数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3天前
|
关系型数据库 MySQL 数据库
MySQL 复制A的表结构和数据到表B
在MySQL中复制表A至表B可通过不同方法实现。一种是先用`CREATE TABLE B LIKE A;`复制结构,再用`INSERT INTO B SELECT * FROM A;`填充数据。另一种更简便的方法是直接使用`CREATE TABLE B AS SELECT * FROM A;`一次性完成结构和数据的复制。还有一种高级方法是通过`SHOW CREATE TABLE A;`获取表A的创建语句,手动调整后创建表B,如有需要再用`INSERT INTO ... SELECT`复制数据。注意权限问题、跨数据库复制时需指定数据库名,以及大表复制时可能影响性能。
|
6天前
|
消息中间件 数据采集 关系型数据库
大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
24 1
|
6天前
|
数据采集 关系型数据库 MySQL
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
16 1
|
7天前
|
SQL 关系型数据库 MySQL
MySQL】-DQL(基本、条件、分组、排序、分页)详细版
通过这些查询方法,你可以高效地检索、分析和组织MySQL数据库中的数据,以满足各种应用需求。实践中,理解这些SQL语句的基础知识以及它们如何组合起来进行复杂的数据操作是至关重要的。
16 1
|
9天前
|
固态存储 关系型数据库 MySQL
"惊!20亿数据秒速入MySQL,揭秘数据库极速插入的黑科技,你不可不知的绝密技巧!"
【8月更文挑战第11天】面对20亿级数据量,高效插入MySQL成为挑战。本文探讨优化策略:合理设计数据库减少不必要的字段和索引;使用批量插入减少网络往返;优化硬件如SSD和内存及调整MySQL配置;并行处理加速插入;附Python示例代码实现分批导入。这些方法将有效提升大规模数据处理能力。
25 2
|
1天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之如何处理数据同步时(mysql->hive)报:Render instance failed
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2天前
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
28 0
|
8天前
|
关系型数据库 MySQL
MySQL——删除重复数据
MySQL——删除重复数据
13 0