SQL:聚合函数(Aggregate Functions)

目录

第一性原理出发思考 ——我们为什么需要聚合函数?

什么是聚合函数? 

常见聚合函数 + 实例讲解 

 🔸 1. COUNT() —— 计数

 🔸 2. MAX() / MIN() —— 最大 / 最小值

🔸 3. SUM() —— 求和 

🔸 4. AVG() —— 平均值 

 GROUP BY

GROUP BY 是什么? 

执行逻辑 

 GROUP BY 的重要规则

HAVING

为什么还要 HAVING? 

HAVING 是什么? 

实例讲解 

HAVING 和 WHERE 的区别 

思维图:GROUP BY + HAVING 工作流程 

第一性原理出发思考 ——我们为什么需要聚合函数?

在数据库中,查询的本质是从一堆数据中“找出我们需要的信息”。有时候我们不仅想看到“每一行”,而是想对一整列进行“汇总”,比如:

  • 一共预订了多少场电影?

  • 哪个用户最爱看电影?

  • 每部电影平均有多少人观看?

这个时候,我们就需要——聚合函数

什么是聚合函数? 

聚合函数是 MySQL 中用于对一整列的数据进行统计、计算或汇总的函数。它不是作用于“某一行”,而是作用于“一列”或“一组”数据。 


常见聚合函数 + 实例讲解 

我们来建一个简单的工资表 employees,字段如下: 

CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),salary INT
);

插入一些数据: 

INSERT INTO employees (name, salary) VALUES 
('Alice', 5000),
('Bob', 6000),
('Charlie', 5500),
('Diana', 7000),
('Eve', 6500),
('Frank', 5200);

 🔸 1. COUNT() —— 计数

SELECT COUNT(*) FROM employees;

 我们给数据库一个表,它扫描所有行,每遇到一行就 +1,最后告诉你一共有几行数据。

最后返回 6

SELECT COUNT(salary) FROM employees;

 与 COUNT(*) 类似,但如果有 NULL 工资的员工,不计入。

 🔸 2. MAX() / MIN() —— 最大 / 最小值

SELECT MAX(salary), MIN(salary) FROM employees;

 数据库扫描每一个值,记录当前最大/最小值,直到最后一行。

最后返回:MAX: 7000, MIN: 5000 

🔸 3. SUM() —— 求和 

SELECT SUM(salary) FROM employees;

 我们把这一列的值都加起来,输出总和。适合处理“总销售额”、“总时长”等问题。

最后返回:5000 + 6000 + 5500 + 7000 + 6500 + 5200 = 35,200
 

🔸 4. AVG() —— 平均值 

SELECT AVG(salary) FROM employees;

 就是 SUM(salary) / COUNT(salary),把总量除以人数,得到“人均”指标。

最后返回:35200 / 6 = 5866.67 

你还可以这样玩: 

-- 所有工资加 500 后的平均值是多少?
SELECT AVG(salary + 500) FROM employees;-- 平均名字长度(字符串函数 + 聚合函数)
SELECT AVG(CHAR_LENGTH(name)) FROM employees;

 GROUP BY

我们之前讲的聚合函数是对“一整列”做统计,但很多时候,我们想知道: 

各个部门的平均工资分别是多少? 

这就需要把“整张表”按部门拆成若干小组,每一组内部再用聚合函数统计。 

💡 这时候,我们就需要 GROUP BY。 

GROUP BY 是什么? 

GROUP BY 是 SQL 中的“分组器”

它把一张大表,按某个字段(或字段组合)划分成一组组数据,然后对每组单独使用聚合函数。 

执行逻辑 

🎯 目标:统计各个部门的平均工资 

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

这条 SQL 的背后逻辑是这样的:

  1. 扫描整张表

  2. department 字段的值,把表划分为若干组:

    • HR: [Alice, Charlie, Frank]

    • IT: [Bob, Diana]

    • Finance: [Eve]

  3. 对每组单独执行 AVG(salary)

  4. 输出每组的 department 和对应的 avg_salary

执行结果:

departmentavg_salary
HR5233.33
IT6500.00
Finance6500.00

 GROUP BY 的重要规则

规则说明
SELECT 中非聚合字段必须出现在 GROUP BY 中除非是聚合函数计算的,否则 SELECT 中的字段必须被 GROUP BY
GROUP BY 后面可以接多个字段表示按多个维度进行分组
整张表 → 按字段值分组 → 每组做聚合 → 输出每组统计结果

HAVING

为什么还要 HAVING? 

我们已经知道:每个部门的平均工资。但问题来了: 

❓“只想要平均工资大于 6000 的部门”怎么办? 

你可能第一反应是: 

SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 6000     -- 🚫 错误用法
GROUP BY department;

 ❌ 错误!
因为 WHERE 是在分组之前起作用的,根本没法识别 AVG(salary) 这种“分组后的值”。

HAVING 是什么? 

HAVING 是用来 过滤分组后的结果 的

它和 WHERE 类似,但发生在 GROUP BY 之后 

实例讲解 

🎯 问题:找出平均工资高于 6000 的部门 

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 6000;

🔍 数据回顾(之前的平均工资):

departmentavg_salary
HR5233.33
IT6500.00
Finance6500.00

📌 这条 SQL 会返回:

departmentavg_salary
IT6500.00
Finance6500.00

因为只有这两个部门的平均工资大于 6000。

🔹 统计每个部门人数大于 2 的部门:

SELECT department, COUNT(*) AS num_employees 
FROM employees 
GROUP BY department 
HAVING COUNT(*) > 2;

🔹 平均工资等于最大工资的部门

SELECT department, AVG(salary), MAX(salary) FROM employees 
GROUP BY department 
HAVING AVG(salary) = MAX(salary);

 使用别名:

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 6000;   -- ✅ 正确用法

HAVING 和 WHERE 的区别 

语句部分用途作用顺序(谁先执行)
WHERE筛选原始数据在分组之前执行
HAVING筛选分组结果在分组之后执行

 WHERE 是筛选行,HAVING 是筛选组。

WHERE 是先手,HAVING 是后手。

思维图:GROUP BY + HAVING 工作流程 

原始表↓   (WHERE)
过滤掉不满足条件的行↓   (GROUP BY)
按照字段分组↓   (聚合函数)
计算每组的结果↓   (HAVING)
筛选掉不满足条件的组↓   (SELECT)
最终展示结果

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

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

相关文章

海关总署广东:广东外贸一季度进出口2.14万亿元 同期增长4.2%

大湾区经济网湾区财经报道,据海关总署广东分署统计,今年一季度,广东外贸进出口2.14万亿元,较去年同期(下同)增长4.2%,增速高于全国2.9个百分点。其中,出口1.34万亿元,增长…

MySQL中高级语法

Mysql高级语法 持续更新中… 1、EXISTS语法 一、基本语法结构 SELECT [列名] FROM [主表] WHERE [条件]AND EXISTS (SELECT 1 -- 子查询内容无关,仅需占位符(如1、*、X等)FROM [子查询表]WHERE [关联条件] -- 必须与外层查询关联&#xf…

SpringBoot 调用deepseek

个人学习心得,仅供参考 软件环境: JDK 17 你用JDK 11 无法支持SpringBoot 3SpringBoot 3 版本以上才支持spring aimavan 3.6.11.获取Deepseek官网的API-key 官网:https://platform.deepseek.com/api_keys 2.创建项目 这样创建 添加依赖…

性能测试面试题的详细解答

以下是性能测试面试题的详细解答: 1. 性能测试的流程是怎样的? 性能测试流程通常包括以下几个步骤: - **需求分析**:明确测试目标、性能指标(如响应时间、吞吐量等)。 - **环境搭建**:搭建测试环…

C++程序设计基础实验:C++对C的扩展特性与应用

C程序设计基础实验:C对C的扩展特性与应用 🔥 本文详细讲解C基础实验,包含C对C语言的扩充与增强特性,从零开始掌握函数重载、引用、指针等核心概念,附详细代码分析与运行结果。适合C初学者和有C语言基础想学习C的同学&a…

量子神经网络编译器开发指南:从理论突破到产业落地全景解析

本文深度剖析IBM Qiskit 5.0量子经典混合编译器的技术架构,详解如何基于含噪量子处理器实现MNIST手写数字分类任务(准确率达89%)。结合本源量子云、百度量子等国内平台免费配额政策,系统性阐述量子神经网络开发的技术路线与资源获…

ESP32之本地HTTP服务器OTA固件升级流程,基于VSCode环境下的ESP-IDF开发(附源码)

背景知识: 本实验利用编译链内Python内置的 HTTP 服务器,将升级包通过http发送给设备,实现OTA固件升级。 目录 背景知识: 1.创建工程 1.1 创建OTA基础工程 3.编写、修改代码 3.1 修改menuconfig配置文件 3.1.1 配置WiFi账…

BootStrap:进阶使用(其一)

今天我要讲述的是在BootStrap中进一步使用的方法与代码举例; 导航条 作为在应用或网站中作为导航页头的响应式基础组件。导航条在移动设备上可以折叠(且可开可关),在视口(viewport)宽度增加时逐渐变为水平展开模式 …

ffmpeg无损转格式的命令行

将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码

【Linux】深入理解Linux文件系统:从C接口到内核设计哲学

文章目录 前言一、C语言中的文件接口1. 文件指针(句柄)FILE*以写方式打开文件,若文件不存在会新建一个文件W写入方式,在打开文件之前都会将文件内容全部清空追加写方式,其用法与写方法一致,不同在于a方法可…

国产品牌芯洲科技100V降压芯片系列

SCT2A25采用带集成环路补偿的恒导通时间(COT)模式控制,大大简化了转换器的片外配置。SCT2A25具有典型的140uA低静态电流,采用脉冲频率调制(PFM)模式,它使转换器在轻载或空载条件下实现高转换效率。 芯洲科技100V降压芯片系列提供丰富的48V系…

ctfshow-大赛原题-web702

因为该题没有理解到位,导致看wp也一直出错,特此反思一下。 参考yu22x师傅的文章 :CTFSHOW大赛原题篇(web696-web710)_ctfshow 大赛原题-CSDN博客 首先拿到题目: // www.zip 下载源码 我们的思路就是包含一个css文件,…

LabVIEW技巧——获取文件版本信息

获取可执行文件(exe)版本信息的几种方法 方法1. LabVIEW自带函数 labview自带了获取文件版本号的VI,但是没有开放到程序框图的函数选板中,在该目录下可以找到:...\LabVIEW 20xx\vi.lib\Platform\fileVersionInfo.llb…

三格电子——CAN 转光纤(点对点)布线常见问题

1、CAN 布线 (1)H 接 H ,L 接 L (2)两端设备挂 120 欧姆电阻 2、假如用点对点的 CAN 转光纤现实远程传输 (1)H 接 H ,L 接 L (2)光端机都挂 120 欧姆电阻 每个光端机挂的设备有一个加…

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言,以其简洁和可读性著称。在开发和调试过程中,遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb(Python Debugger)。 Pdb是Python标准库中自带的调试器,可以帮助…

React 设计艺术:如何精确拆分组件接口,实现接口隔离原则

接口隔离原则 接口隔离原则(Interface Segregation Principle,简称 ISP)也是面向对象设计中的重要原则之一。它的核心思想是,一个类不应该依赖它不需要的接口。在 React 开发中,遵循接口隔离原则可以提高代码的可维护性…

内部聊天软件,BeeWorks-安全的企业内部通讯软件

企业在享受数据便利的同时,如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件,通过全链路的安全能力升维,为企业提供了一个安全、高效、便捷的沟通协作平台,全面保障企业数据安全。 …

【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南

MATLAB Gurobi YALMIP 综合优化教程(进阶) 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模,并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…

Freertos----互斥量

一、为什么要使用互斥量? 我们想让任务A、B都执行add_a函数,a的最终结果是18817。 假设任务A运行完代码①,在执行代码②之前被任务B抢占了:现在任务A的R0等于1。 任务B执行完add_a函数,a等于9。 任务A继续运行&#…

高级java每日一道面试题-2025年4月11日-微服务篇[Nacos篇]-Nacos使用的数据库及其数据同步机制是什么?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos使用的数据库及其数据同步机制是什么? 我回答: Nacos 使用的数据库及其数据同步机制详解 在微服务架构中,Nacos 作为服务注册与配置管理的核心组件,其数据存储和同步机制对系统的高可用性和…