【MySQL】聚合函数与分组查询

聚合函数与分组查询

  • 一、聚合函数
    • 1、常见的聚合函数
    • 2、实例
  • 二、分组查询
    • 1、group by子句
    • 2、准备工作
    • 3、实例
    • 4、having 条件

一、聚合函数

说明:聚合函数用来计算一组数据的集合并返回单个值,通常用这些函数完成:个数的统计,某列数据的求和,某列数据的最大值,最小值,或者是平均值。

1、常见的聚合函数

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的数量
SUM([DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的最小值,不是数字没有意义

聚合函数一般在select语句中使用,此时select每处理一条记录时都会将对应的参数传递给这些聚合函数。

需要注意的是聚合函数忽略空值,即NULL值不会参与运算的。

2、实例

2.1 统计班级共有多少同学

这里我们使用下面的学生表来进行演示,学生表中的内容如下:

在这里插入图片描述

使用*做统计

这里我们直接使用count(*)进行聚合统计,表示对所有的列数据进行统计:

select count(*) from students;

在这里插入图片描述

这里的统计原理也很简单,其实就是使用了select *将每一条记录都拿到,然后将每一条待处理记录时都传递给这个count聚合函数,然后我们就能够拿到数据的总个数了。

2.2 统计班级收集的QQ号有多少个

值得注意的是:我们没有对qq号码进行非空约束,我们继续使用聚会函数count进行统计。

在这里插入图片描述

select count(qq) from students;

在这里插入图片描述

结果为1,这证明聚合函数确实会忽略空值,即NULL值不会参与运算的。

2.3 统计本次考试的数学成绩分数的个数有几个

下面是我们的测试用例表:

在这里插入图片描述

注意本题目要求的是数学成绩的个数,不是数学成绩的值,这意味着我们需要对相同的数学成绩的值进行先去重,然后再进行聚合统计,对于去重我们可以使用distinct进行去重,然后再使用count进行聚合统计。

select count(distinct math) from exam_result;

在这里插入图片描述

2.4 统计数学成绩总分

对于统计数学成绩的总分其实就是对数据进行求和,我们可以使用sum函数来进行求和:

select sum(math) from exam_result;

在这里插入图片描述

2.5 统计不满100分的数学成绩总分

在刚才的示例中我们已经求得数学成绩的总分了,对于不满100分的人我们可以使用where子句进行筛选得到。

select sum(math) from exam_result where math < 100;

在这里插入图片描述

2.6 统计总分的平均分

对于平均分我们可以使用avg函数进行求得:

select avg(chinese + math + english) from exam_result;

在这里插入图片描述

2.7 求英语最高分

求最高分其实就是求最大值,我们可以使用max函数进行求最大值:

select max(english) from exam_result;

在这里插入图片描述

二、分组查询

不知刚才你注意到没,前面我们进行聚合统计时都是在对整张表进行聚合统计,但是有时我们想要对不同的情况进行分别统计。

例如在一个班级之中,有男生和女生,我们想要得到男生和女生中英语成绩的最高分分别是多少?我们发现我们再使用max函数是没有办法达到我们想要的目的的,但是如果我们先对班级中的男女生进行分组,然后又分别进行聚合统计,使用max函数就能够达到我们想要的目的了!

所以分组是数据库最重要任务之一,要将行分组,我们可以使用GROUP BY子句。

1、group by子句

分组查询的SQL语法如下:

SELECT column1 [, column2], ... FROM table_name [WHERE ...] GROUP BY column [, ...] [order by ...] [LIMIT ...];

(小声bb:虽然语法看起来很难,但是在使用一两次以后你就会发现其实很简单)

说明一下

  • SQL中大写的表示关键字,[ ]中代表的是可选项。
  • 查询SQL中各语句的执行顺序为:where、group by、select、order by、limit
  • group by后面的列名,表示按照指定列进行分组查询。

2、准备工作

分组查询测试表 —— 雇员信息表

准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)

  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表

雇员信息表数据库文件


拿到该数据库文件以后,我们可以先打开该文件进行查看其内容:

vim scott_data.sql

在这里插入图片描述

我们会发现其里面都是SQL记录,对于MySQL我们备份其数据库时,其实备份的全部都是一条条有效的SQL记录,通过重新执行这些SQL,我们便能够得到和原来一摸一样数据库。

接下来我们就可以在mysql中将这个数据库给创建出来了:

source 该文件的绝对路径;

例如我这里是:

source /root/MySQL/scott_data.sql;

在这里插入图片描述

执行成功!

然后我们查询我们的数据库,发现数据库中多了一个scott的数据库:

show databases;

在这里插入图片描述

我们使用这个数据库并显示数据库中的所有表

use scott;
show tables;

在这里插入图片描述

这三张表就是我们所说的:

  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表

我们先分别查看一下表结构和表内容:

  • 查看员工表结构
desc emp;

在这里插入图片描述

  • 查看员工表内容
select * from emp;

在这里插入图片描述

  • 查看部门表结构
desc dept;

在这里插入图片描述

  • 查看部门表内容
select * from dept;

在这里插入图片描述

  • 查看工资等级表结构
desc salgrade;

在这里插入图片描述

  • 查看工资等级表内容
select * from salgrade;

在这里插入图片描述

3、实例

3.1 显示每个部门的平均工资和最高工资

由于要显示每个部门平均工资和最高工资,所以我们一定要借助group by来将这个整表进行划分为多个组,然后我们再使用avgmax函数来对工资分别求平均和最高工资。

所以我们可以这样进行查询:

select deptno, avg(sal), max(sal) from emp group by deptno;

在这里插入图片描述

说明一下: 上述SQL会先将表中的数据按照部门号进行分组,然后各自在组内做聚合查询得到每个组的平均工资和最高工资。

3.2 显示每个部门的每种岗位的平均工资和最低工资

现在对于我们来说:“求平均工资和最低工资”,是很简单的事情,但是题目的要求:显示每个部门的每种岗位,显然要求我们进行两次分组,对于group by子句来说,我们可以使用,分割,来进行多个条件分组。

select deptno, job, avg(sal), min(sal) from emp group by deptno, job;

在这里插入图片描述

说明group by子句中可以指明按照多个字段进行分组,各个字段之间使用逗号隔开,分组优先级与书写顺序相同。

4、having 条件

在讲解此条件之前我们先继续来解决下面的问题:

3.3 显示平均工资低于2000的部门和它的平均工资

在这里我们会发现,我们必须先要拿到平均工资的值,然后再根据平均工资进行筛选。

假设这里我们使用where子句,我们会发现在where子句中我们无法表示平均工资的(聚合函数不能够在where子句中使用的,因为where子句是对单个记录进行筛选,而聚合函数是对整个结果集进行计算的)

就算假设我们能够表示平均工资,我们知道where子句的执行优先级是很高的,于是就会先按平均工资进行筛选,然后再拿到平均工资的值。显然这个逻辑是有问题的。


为了解决这个问题我们就要学习一下HAVING 条件了,having也是一个筛选条件。

含有having子句的SQL如下:

SELECT ... FROM table_name [WHERE ...] [GROUP BY ...] [HAVING ...] [order by ...] [LIMIT ...];

说明一下:

  • SQL中大写的表示关键字,[ ]中代表的是可选项。
  • SQL中各语句的执行顺序为:where、group by、select、having、order by、limit
  • having子句中可以指明一个或多个筛选条件。

having子句和where子句的区别

  • where子句放在表名后面,而having子句必须搭配group by子句使用,放在group by子句的后面。
  • where子句是对整表的数据进行筛选,having子句是对分组后的数据进行筛选。
  • where子句中不能使用聚合函数和别名,而having子句中可以使用聚合函数和别名。
  • where子句的执行优先级很高,而having的执行优先级很低。

于是上面的问题就被转化为了下面的问题了:

  • 先统计每个部门的平均工资。
  • 然后通过having子句筛选出平均工资低于2000的部门。

统计每个部门的平均工资

select deptno, avg(sal) from emp group by deptno;

在这里插入图片描述

通过having子句筛选出平均工资低于2000的部门

select deptno, avg(sal)  平均工资 from emp group by deptno having 平均工资<2000;

在这里插入图片描述

需要注意的是:聚合函数的执行优先级通常是在SQL查询中确定的,这句的SQL执行顺序如下:

在这里插入图片描述

这句SQL的执行顺序如下:

  1. FROM子句:首先,从"emp"表中检索数据。

  2. GROUP BY子句:然后,根据"deptno"列将结果集分组。相同"deptno"值的行将被分为一组。

    (AVG函数计算:接下来,在每个分组中计算"sal"列的平均工资)。

  3. HAVING子句:然后,在HAVING子句中筛选出平均工资小于2000的分组。

  4. SELECT子句:最后,在SELECT子句中选择"deptno"和平均工资作为结果返回。

面试题:SQL查询中各个关键字的执行先后顺序:

from > on> join > where > group by > with > having > select > distinct > order by > limit

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

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

相关文章

Dubbo 框架揭秘:分布式架构的精髓与魔法【一】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo 框架揭秘&#xff1a;分布式架构的精髓与魔法【一】 前言Dubbo是什么Dubbo的核心概念整体设计 前言 在数字时代&#xff0c;分布式架构正成为应对大规模流量和复杂业务场景的标配。Dubbo&#…

vue项目使用typescript创建抽象类及其使用

如题&#xff0c;可以在vue项目使用typescript创建抽象类&#xff0c;然后使用这个抽象类。 通过TypeScript&#xff0c;可以在前端应用抽象类了。抽象类的好处&#xff0c;可以同时满足继承和多态&#xff0c;好处多多。以vue3为例&#xff1a; 1、创建抽象类 据说js类中&a…

监督学习 - XGBoost(eXtreme Gradient Boosting)

什么是机器学习 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种梯度提升树算法&#xff0c;它在梯度提升框架的基础上引入了一些创新性的特性&#xff0c;以提高模型性能和训练速度。XGBoost在解决结构化数据的分类和回归问题上表现出色&#xff0c;成为许多…

Unity-游戏与帧

游戏的本质就是一个死循环 “游戏的本质就是一个死循环”这句话&#xff0c;其实是指游戏引擎的主循环。游戏引擎是游戏开发中最核心的部分&#xff0c;它负责处理玩家的输入、更新游戏状态、渲染画面等工作&#xff0c;而这些工作都是在一个不断重复的循环中完成的。 具体来…

【快刊录用】ABS一星,2区,仅2个月15天录用!

2023年12月30日-2024年1月5日 进展喜讯 经核实&#xff0c;由我处Unionpub学术推荐的论文中&#xff0c;新增2篇论文录用、3篇上线见刊、1篇数据库检索&#xff1a; 录用通知 FA20107 FA20181 — 见刊通知 FB20805 FA20269 FA20797 检索通知 FA20199 — — 计算机…

配网故障定位技术的发展与应用:保障电力供应安全稳定的重要支撑

在现代社会&#xff0c;电力供应安全稳定对于国家经济发展和民生福祉至关重要。然而&#xff0c;随着电网规模的不断扩大&#xff0c;配网故障问题也日益突出。为了确保电力供应的连续性和可靠性&#xff0c;人们不断探索和研发各种故障定位技术。本文将介绍一种基于行波测距技…

[Linux 进程(二)] Linux进程状态

文章目录 1、进程各状态的概念1.1 运行状态1.2 阻塞状态1.3 挂起状态 2、Linux进程状态2.1 运行状态 R2.2 睡眠状态 S2.3 深度睡眠 D2.4 停止状态 T2.5 僵尸状态 Z 与 死亡状态 X孤儿进程 Linux内核中&#xff0c;进程状态&#xff0c;就是PCB中的一个字段&#xff0c;是PCB中的…

2401d,ddip1027如何支持sql

原文 以下是DIP1036的SQL支持方式: 这里 auto execi(Args...)(Sqlite db, InterpolationHeader header, Args args, InterpolationFooter footer) {import arsd.sqlite;//SQLite允许你执行?1,?2等操作enum string query () {string sql;int number;import std.conv;foreach…

智慧食堂管理方式,究竟改变了什么?

随着科技的迅速发展&#xff0c;餐饮业也在不断地迎来新的挑战和机遇。为了提升食堂管理效率、改善用户体验以及提高收益&#xff0c;许多食堂纷纷引入智慧收银系统。 客户案例 企业食堂改革 石家庄某大型企业食堂由于员工数量庞大&#xff0c;传统的收银方式难以满足快速就餐…

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

第二十一章&#xff1a;数学 原文&#xff1a;21. Math 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下&#xff1a; Math.E 欧拉常数&#xff08;e&#xff09; Math.LN2 2 …

Verilog 和 System Verilog 的区别

当谈到VLSI设计和数字电路建模时&#xff0c;verilog和system verilog是两种常用的硬件描述语言。这些 HDL 在 VLSI 设计中用于描述电子电路的行为和结构。它们都广泛应用于半导体行业来设计和实现集成电路&#xff08;IC&#xff09;。 它们是设计和模拟复杂数字系统的强大工具…

解决:ModuleNotFoundError: No module named ‘dbutils’

解决&#xff1a;ModuleNotFoundError: No module named ‘dbutils’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named dbutils背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0c;…

盈利之道:下单前的必问之问

投资者在过去的交易经历中&#xff0c;通常都会面临所谓的“交易低谷”。交易低谷是指在交易过程中难以实现盈利或可能导致进一步亏损的阶段。这种面临损失或没有盈利的时期可能发生在任何人身上&#xff0c;无论是由于市场变化、投资者策略调整还是其他原因。为了应对这种情况…

C++力扣题目--94,144,145二叉树递归遍历

思路 这次我们要好好谈一谈递归&#xff0c;为什么很多同学看递归算法都是“一看就会&#xff0c;一写就废”。 主要是对递归不成体系&#xff0c;没有方法论&#xff0c;每次写递归算法 &#xff0c;都是靠玄学来写代码&#xff0c;代码能不能编过都靠运气。 本篇将介绍前后…

Hibernate实战之操作MySQL数据库(2024-1-8)

Hibernate实战之操作MySQL数据库 2024.1.8 前提环境&#xff08;JavaMySQLNavicatVS Code&#xff09;1、Hibernate简介1.1 了解HQL 2、MySQL数据库建表2.1 编写SQL脚本2.2 MySQL执行脚本 3、Java操作MySQL实例&#xff08;Hibernate&#xff09;3.1 准备依赖的第三方jar包3.2 …

Mybatis自动加解密

涉及隐私信息的字段需要加密存储数据库&#xff0c;返回给前端时又需要解密显示正确信息。故采用mybatis自动加解密的方案&#xff0c;该方案基于自定义注解拦截器进行实现。加密后的信息不支持模糊匹配&#xff08;可参考业界流行方案&#xff0c;基于业务需求做分词或采用其他…

与听力学相关的职业都有哪些?怎么选择?

随着年龄的增长&#xff0c;每个人都可能面临听觉障碍的困惑。听力学领域专注于患者的耳朵问题&#xff0c;包括听力损失和平衡障碍。听力学职业是为患者提供听觉健康管理服务的职业&#xff0c;专注于他们耳朵的听力和平衡甚至言语相关需求。为患者进行听功能检查、测试、诊疗…

1.5如何用命令得到自己的ip<本地>

专栏导航 第四章 具有通用性的花生壳ddns脚本 第五章 如何用命令得到自己的ip<本地> ⇐ 第六章 用命令得到ip和域名解析<网络>() 用折腾路由的兴趣,顺便入门shell编程。 第五章 如何用命令得到ip<本地> 文章目录 专栏导航第五章 如何用命令得到ip<本地…

代码随想录算法训练营Day17|110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和

文章目录 一、110.平衡二叉树1.递归法 二、257. 二叉树的所有路径1. 递归法 三、 404.左叶子之和1.迭代法 一、110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二…

Python操作MongoDB快速入门教程

Docker安装MongoDB 拉取镜像&#xff1a; docker pull mongo:6.0.2创建容器&#xff1a; docker run --name mongo -d -p 27017:27017 mongo:6.0.2设置用户名和密码&#xff1a; # 创建mongo容器后&#xff0c;进入容器 docker exec -it mongo bash# 进入mongo shell mongo…