【MySQL新手到通关】第七章 聚合函数使用详解

news2024/11/24 12:40:53

文章目录

  • 0. 前置
  • 1. 聚合函数介绍
    • 1.1 AVG 和 SUM 函数
    • 1.2 MIN 和 MAX 函数
    • 1.3 COUNT函数
  • 2. GROUP BY
    • 2.1 基本使用
  • 3. HAVING
    • 3.1 基本使用
    • 3.2 WHERE和HAVING的对比


在这里插入图片描述

0. 前置


为了方便测试,我们导入一些数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for procatch_work_om_sp_type
-- ----------------------------
DROP TABLE IF EXISTS `procatch_work_om_sp_type`;
CREATE TABLE `procatch_work_om_sp_type`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `sp_type_name` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备件类型名称',
  `sp_type_parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '父类类型id 没有就是0',
  `current_level` tinyint(3) UNSIGNED NOT NULL COMMENT '当前层级(1/2/3)',
  `sp_num` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '该备件类型下的备件数量(只是该备件类型下,不算类型父级)',
  `create_time` datetime(0) DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1661945101694476291 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '运维-备件-备件类型' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of procatch_work_om_sp_type
-- ----------------------------
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810442107748353, '五金', 0, 1, 0, '2023-04-17 11:53:18');
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810699784814593, '通用五金配件', 1647810442107748353, 2, 1, '2023-04-17 11:54:20');
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810699793203202, '装饰五金配件', 1647810442107748353, 2, 21, '2023-04-17 11:54:20');
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810699797397506, '五金冲压配件', 1647810442107748353, 2, 0, '2023-04-17 11:54:20');
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810699805786113, '相框五金配件', 1647810442107748353, 2, 0, '2023-04-17 11:54:20');
INSERT INTO `procatch_work_om_sp_type` VALUES (1647810699814174722, '门窗五金配件', 1647810442107748353, 2, 0, '2023-04-17 11:54:20');
INSERT INTO `procatch_work_om_sp_type` VALUES (1648249529373491202, '铣床', 0, 1, 0, '2023-04-18 16:58:05');
INSERT INTO `procatch_work_om_sp_type` VALUES (1648249529377685506, '机床', 0, 1, 8, '2023-04-18 16:58:05');
INSERT INTO `procatch_work_om_sp_type` VALUES (1648249529381879810, '钻床', 0, 1, 0, '2023-04-18 16:58:05');

数据如下

在这里插入图片描述


1. 聚合函数介绍


什么是聚合函数

聚合函数作用于一组数据,并对一组数据返回一个值。

在这里插入图片描述

聚合函数类型

  • AVG() 求平均值
  • SUM() 求和
  • MAX() 求最大值
  • MIN() 求最小值
  • COUNT() 求总行数

聚合函数语法

SELECT SUM(某字段) FROM TABLE_NAME WHERE ...

聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。


1.1 AVG 和 SUM 函数


可以对数值型数据使用 AVGSUM 函数。

AVG 比如我们求案例表的全部备件类型下的备件数量的平均值

SELECT AVG(sp_num) FROM `procatch_work_om_sp_type`

结果如下

在这里插入图片描述

SUM 比如我们求案例表的全部备件类型下的备件数量的

SELECT SUM(sp_num) FROM `procatch_work_om_sp_type`

结果如下

在这里插入图片描述


1.2 MIN 和 MAX 函数


可以对任意数据类型的数据使用 MINMAX 函数。

比如我们求案例表的全部备件类型下的备件数量的最小值、最大值

SELECT MIN(sp_num),MAX(sp_num) FROM `procatch_work_om_sp_type`

结果如下

在这里插入图片描述


1.3 COUNT函数


COUNT(*) 返回表中记录总数,适用于任意数据类型。

COUNT(expr) 返回expr不为空的记录总数。


比如我们有如下这张表:

在这里插入图片描述


执行如下语句

SELECT COUNT(*), COUNT(name) FROM `agreement_file`

得到结果:分别为 46 个 29

在这里插入图片描述

COUNT(*) 返回表中记录总数 :46 。
COUNT(name) 返回 name 不为空的记录总数 :29。


问题:用count(*),count(1),count(列名)谁好呢?

- 其实,对于MyISAM引擎的表是没有区别的。这种引擎内部有一计数器在维护着行数。
- Innodb引擎的表用count(*),count(1)直接读行数,复杂度是O(n),因为innodb真的要去数一遍。
但好于具体的count(列名)。

问题:能不能使用count(列名)替换count(*)?

- 不要使用 count(列名)来替代 count(*) , count(*) 是 SQL92 定义的标准统计行数的语法,跟数
据库无关,跟 NULL 和非 NULL 无关。
- 说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。



2. GROUP BY


2.1 基本使用


有如下一张表:

在这里插入图片描述

可以使用GROUP BY 语句将表中的数据分成若干组 展示每个备件类型的个数

SELECT spare_part_type_id, SUM(1) 
FROM `procatch_work_om_spare_part` 
GROUP BY spare_part_type_id

在这里插入图片描述




3. HAVING


3.1 基本使用

过滤分组:HAVING子句
1. 行已经被分组。
2. 使用了聚合函数。
3. 满足HAVING 子句中条件的分组将被显示。
4. HAVING 不建议单独使用,建议只和 GROUP BY 一起使用。

在这里插入图片描述

注意:不能在 WHERE 子句中使用聚合函数


3.2 WHERE和HAVING的对比


区别1WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为,在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是WHERE 无法完成的。另外,WHERE排除的记录不再包括在分组中。

区别2如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选。 这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。

小结如下

优点缺点
WHERE先筛选数据再关联,执行效率高不能使用分组中的计算函数进行筛选
HAVING可以使用分组中的计算函数在最后的结果集中进行筛选,执行效率较低

开发中的选择
WHERE 和 HAVING 也不是互相排斥的,我们可以在一个查询里面同时使用 WHERE 和 HAVING。包含分组统计函数的条件用 HAVING,普通条件用 WHERE。这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大的差别。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程(39)----------多线程中的锁

假设一个这样的场景: 在多线程的代码中, 需要在不同的线程中对同一个变量进行操作. 那此时就会出现问题: 多线程是并发进行的, 也就是说代码运行的时候, 俩个线程会同时对一个变量进行操作, 这样就会涉及到多线程的安全问题: class Counter{public int count;public void add…

RPC核心原理(整体架构/调用过程)

Server: Provider ,暴露服务,服务提供方 Client: Consumer ,服务消费,调用远程服务 Registry:服务注册与发现 RPC的调用过程如下: 第一步:server会将他需要暴露的服务以及他的地址信息注册到Registry这一注册中心。 第二步:client通过注册…

【VScode】ESLint :warning Delete `CR` prettier/prettier

一. ESLint 作用 检查 Javascript 编程时的语法错误。 新建或修改文件时报错 原因 Windows系统 ,clone的代码会自动把换行符 LF转为回车符CRLF,这时本地的代码都是回车符。可在prettier.config.js中查看到 检查配置(ESLint中是…

linux(system V标准)信号量

目录: 1.什么是信号量 2.信号量的本质 1.什么是信号量 2.信号量的本质 什么是临界资源呢?? 凡是倍多个执行流同时访问的资源就是临界资源!!! 我们看一个问题,我们fork()之后创建一个子进程&a…

redis----缓存穿透、击穿、雪崩问题解决

缓存 缓存更新方式 这是决定在使用缓存时就该考虑的问题。 设置缓存数据的TTL,当缓存数据失效后,如果有系统要请求,则会查询数据库并插入缓存(被动更新) 不友好在各类会往mysql写入数据的系统中,植入更新…

360天御滑块

又来水文章?当然,闲着无聊,走过路过,不要错过,点进来多看看。 两种类型。滑块,文字点选。此案例就以网友投稿的滑块来说。 怎么说呢,名字好听,本次难点,js混淆&#xff…

图文并茂教你快速入门React系列02-state

State 在React中,什么是state? 在 React 中,随时间变化的数据被称为状态(state)。你可以向任何组件添加状态,并按需进行更新。 如何添加使用state? 点击获取教程代码关于此框架–More docs 使用 useSt…

记一次Redis版本新特性导致的主从切换故障

背景 最近一组业务redis数据不断增长需要扩容内存,而扩容内存则需要重启云主机,在按计划扩容升级执行主从切换时意外发生了数据丢失与master进入只读状态的故障,这里记录分享一下。 业务redis高可用架构 该组业务redis使用的是一主一从&am…

基于卷积神经网络和连接性时序分类的语音识别系统,含核心Python工程源代码(深度学习)个人可二次开发

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 特征提取2. 声学模型3. CTC 解码4. 语言模型 系统测试工程源代码下载其它资料下载 前言 本项目基于卷积神经网络和连接性时序分类方法,采用中文语音数据集进行训练,实现声音转录为中文拼…

Java枚举中定义属性

文章目录 1、复习枚举2、自定义属性3、自定义属性枚举类和常量的对比4、常用方法5、枚举自定义属性在开发中的应用:字典表6、补充:入参校验 刚接触枚举时的例子太简单,就一个Season枚举类,里面四个常量值,后来开发中看…

接口幂等方案

文章目录 概要方案乐观锁数据库唯一索引令牌tokentoken通过另一个接口从服务端获取客户端自身生成token 总结 概要 所谓接口幂等性,就是一次和多次请求某一个资源对于资源本身应该具有同样的影响。接口幂等的应用很广,小到防止表单重复提交,…

使用kettle完成学生成绩登记需求

(一) 使用kettle完成学生成绩登记需求 学生成绩表下表所示。(自己创建一个学生表) 在MySQL中创建一个名为school的数据库,并在school数据库中创建一个名为score的表,使用Kettle将Excel形式的学生成绩表导入MySQL的score表 1&am…

机器视觉海康工业相机SDK参数设置获取

视觉人机器视觉培训-缺陷检测项目-食品行业草鸡蛋外观检测 相机参数类型可分为六类,除 command 参数外,每一类都有其对应的设置与获取函数接口。 表 1 参数类型及对应函数接口介绍 *详细函数接口可参考 SDK 手册: ​C:\Program Files (x86)\MVS\Development\Documentation…

【已解决】微信小程序报错:request 合法域名校验出错 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息”

【已解决】微信小程序报错:request 合法域名校验出错 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息” 场景复现解决方法 知识专栏专栏链接微信小程序专栏https://blog.csdn.net/xsl_hr/c…

工控设备如何防勒索病毒

目前现状 无论是中小企业还是大型企事业单位,均有属于自己的内网或公有云服务器。这些服务器有的是专门的SVN、GIT代码服务器,有的是文档存储服务器,有的是应用服务器。服务器是企业的核心命脉,所有知识产权及多年心血都集中汇总…

LeetCode——Pow(x, n)

一、题目 50. Pow(x, n) - 力扣(Leetcode) 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xⁿ )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2&#x…

Jetpack Compose中的状态栏适配(Window Insets)

除了app的内容区域外,还有一些其他的固定元素会显示在手机屏幕上,顶部的状态栏、 刘海、 底部的导航栏,还有输入法键盘,它们都是系统的UI, 也叫Insets. 如图所示: 顶部的状态栏通常被用来展示通知, 设备状态等; 底部导…

软考A计划-网络规划设计师-学习笔记-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Linux 如何判断文件的类型

在Linux中&#xff0c;我们如何判断一个文件的类型和用户权限呢&#xff1f; 在c语言中&#xff0c;Linux为我们提供了一个结构体stat我们可以通过 #include<sys/stat.h>引入后使用。然后通过stat中的st_mode来判断文件的类型。如下图&#xff0c;我们要知道文件是什么类…

超级入门:R 语言的 5 种基本数据类型

一、R语言简介 R语言是一种用于统计计算和绘图的编程语言&#xff0c;它是由新西兰奥克兰大学的 Ross Ihaka 和 Robert Gentleman 开发的。R语言支持向量和矩阵计算&#xff0c;因此也可以用于数值分析和线性代数。它主要应用于数据分析、统计学习、数据挖掘、数据可视化等领域…