【MySQL新手到通关】第七章 聚合函数

news2024/12/22 22:34:42

文章目录

  • 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/595721.html

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

相关文章

chatgpt赋能python:Python代码优化:如何放大你的SEO效果

Python 代码优化:如何放大你的SEO效果 Python语言编写的代码相较于其他编程语言而言具有一定的优势,因为Python语言编写的代码可读性高且易于维护,同时Python也支持多种不同的应用场景,包括网络编程,数据分析&#xf…

chatgpt赋能python:Python从文本中提取年份月份的方法

Python从文本中提取年份月份的方法 Python作为一种高效、优秀的编程语言,被广泛应用于文本分析、数据分析等领域。其中,从文本中提取年份月份是一项常见的工作。本文将介绍Python如何从文本中提取年份月份的方法,让您能够更好地应用Python进…

基于循环神经网络的语言模型:RNNLM、GRULM

基于循环神经网络的语言模型:RNNLM RNNLM首次提出是在《Recurrent neural network based language model》这篇非常重要的神经网络语言模型论文种,发表于2010年。这篇论文的主要贡献是: 首次提出并实现了一种基于循环神经网络(Recurrent Neural Network)的语言模型…

Linux 目录结构_安装Xshell6和Xftp6教程加 Xshell无法启动:要继续使用此程序........,的解决方法

Linux 目录结构 基本介绍 linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。深刻理解linux 树状文件目录是非常重要的,这里我给大家说明一下。记住一句经典的话:在…

chatgpt赋能python:Python代码怎么自动排序?全面解析!

Python代码怎么自动排序?全面解析! 在软件开发中,很多时候需要对数据进行排序操作,以便更好的管理和使用数据。Python提供了多种排序算法和排序函数,支持自定义排序规则,灵活多样。本文将为大家介绍常见的…

chatgpt赋能python:Python修改默认字体为黑体

Python修改默认字体为黑体 介绍 Python是一种高级编程语言,被广泛应用于人工智能、大数据分析、Web开发等领域。在Python中,字体颜色和样式对于代码阅读和可读性影响很大。然而,用Python自带的默认字体,代码阅读可能会产生疲劳感…

物流货物跟踪管理系统的设计与实现(论文+源码)_kaic

摘 要 为解决物流货物跟踪过程中,跟踪相关信息滞后的问题,本毕业项目设计了物流货物跟踪管理系统。本系统基于B/S架构,采用SSH技术,VUE框架,VS2019平台,Sqlserver数据库,实现了物流公司模块、…

linux系统从零开始搭建CICD jenkins环境

1、操作系统与环境 本文教你从零开始搭建jenkins环境,开始你的CICD之旅。 1.1 系统与安装环境 本文的环境为云服务器环境,系统为linux Red-hat系统。版本信息如下: Linux version 3.10.0-1160.88.1.el7.x86_64 (mockbuildkbuilder.bsys.ce…

基于Java的旅游网站的设计与实现(论文+源码)_kaic

摘 要 旅游业走过了改革开放,到现在依旧蓬勃发展。但是放眼国际社会,我们在旅游业发展的深度和广度上所做的努力还远远不够。在中国,旅游业也将成为经济崛起中的重要一环。目前,我们生活在一个信息时代里。无论是工作,…

chatgpt赋能python:Python:一种强大的编程语言

Python:一种强大的编程语言 介绍 Python是一种高级编程语言,旨在提高开发者的生产力和代码可读性。它是一种动态语言,使编写代码变得更加简单和容易。许多大型组织和企业都使用Python作为主要的编程语言,包括微软、Facebook、Go…

Java开发SDK详解

一、服务端开发 1、前言 1)最近在对接外部平台的接口,对方提供了一个sdk,开发中直接引入到项目中。自己只需要组装参数,直接调用sdk中的方法就可以实现接口对接。 2)sdk中包含了参数校验,加密验签&#x…

react项目+antd组件-demo:hello-world

在前端开发过程中,有涉及到使用antd组件部分。在项目中加一个antd,调整组件的大小、位置、颜色,花费时间比较多,效率不高,可以通过本文叙述的方式建立一个前端demo,用于调整组件的大小、位置、颜色,验证组件…

C语言_结构体

文章目录 一、结构体结构的基础知识 二、结构体类型的声明三. 结构体初始化四.结构成员的类型五.结构体变量的定义和初始化六.结构体成员访问6.1结构体变量访问成员6.2结构体指针访问指向变量的成员(箭头操作符 ->) 七.结构体传参总结 一、结构体 结…

MySQL 事务简介

事务简介 事务的起源 狗哥和猫爷是⼀对好基友,他们都到银⾏开⼀个账户,他们在现实世界中拥有的资产就会体现在数据库世界的account表中。⽐如现在狗哥有11元,猫爷只有2元,那么现实中的这个情况映射到数据库的account表就是这样&…

机器学习常识 11: logistic 回归

摘要: logistic 回归是使用超平面将空间分开, 一边是正样本, 另一边是负样本. 因此, 它是一个线性分类器. 1. 线性分类器 如图 1 所示, 若干样本由两个特征描述, 对应于二维平面上的点. 它们为正样本或负样本, 由不同颜色表示. 现在需要使用一条直线将正、负样本分开. 这样, …

比ureport好用的报表工具-VeryReport报表工具

作为一名报表开发人员,你一定知道,一个好用的报表工具是多么重要。它可以让你更快、更准确地完成报表开发任务,并且帮助你更好地展现数据。今天我想向大家介绍一款非常优秀的报表工具——VeryReport报表工具。 编辑搜图 请点击输入图片描述&…

STM32 启动文件选择

1. STM32F1xx 系列 (F1) STM32F100xB/C: startup_stm32f100xb.s STM32F100xD/E: startup_stm32f100xe.s STM32F101x6/8/B: startup_stm32f101x6.s, startup_stm32f101x8.s, startup_stm32f101xb.s STM32F101xE/F/G: startup_stm32f101xe.s, …

线程安全与互斥锁(访问控制)

线程安全问题 因为多个线程是共享地址空间的,也就是很多资源都是共享的。 优点:通信方便缺点:缺乏访问控制 因为一个线程的操作问题,给其他线程造成了不可控,或者引起崩溃,异常,逻辑不正确等这种现象:线程安全。 创…

基于Java实现农产品交易平台的设计与实现_kaic

【摘要】农业是我国国民经济的重要组成部分,随着信息化的普及,4G网络、光纤以及5G网络也日益完善,农业信息化的发展成为了必然。同时,由于本年疫情原因,导致农作物积压销售,甚至腐烂造成不必要的浪费&#…

chatgpt赋能python:Python信息抽取——帮您更好地利用数据

Python信息抽取——帮您更好地利用数据 什么是Python信息抽取? Python信息抽取是指利用Python编写程序,从大量的非结构化数据中提取有用的信息的技术。这些数据可以是网页、文本文件、PDF等各种格式,而Python信息抽取则可以帮助您快速、准确…