【数据库】MySQL聚合统计

目录

1.聚合函数

案例1: 统计班级共有多少同学

 案例2:统计本次考试的数学成绩分数个数

 案例3:统计数学成绩总分

案例4:统计平均总分

案例5:返回英语最高分

案例6:返回 > 70 分以上的数学最低分

2.分组聚合统计(group by)

准备工作:

案例1:如何显示每个部门的平均工资和最高工资

 案例2:显示每个部门的每种岗位的平均工资和最低工资

案例3:显示平均工资低于2000的部门和它的平均工资

那怎么样理解having和where的区别


1.聚合函数

使用聚合函数是为了帮助我们在查询结果之后对结果进行统计,这种统计的方式一般都是一个值为结果。

 在使用这些函数之前,我们需要创建一张测试表

CREATE TABLE exam_result ( 
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(20) NOT NULL COMMENT '同学姓名', 
chinese float DEFAULT 0.0 COMMENT '语文成绩', 
math float DEFAULT 0.0 COMMENT '数学成绩', 
english float DEFAULT 0.0 COMMENT '英语成绩' 
);

在插入一些数据

INSERT INTO exam_result (name, chinese, math, english) VALUES 
('唐三藏', 67, 98, 56), 
('孙悟空', 87, 78, 77), 
('猪悟能', 88, 98, 90), 
('曹孟德', 82, 84, 67), 
('刘玄德', 55, 85, 45), 
('孙权', 70, 73, 78), 
('宋公明', 75, 65, 30);

 

案例1: 统计班级共有多少同学

 select count(*) from exam_result;

 可以看到它可以直接告诉我们一个值。

也可以对列名进行重命名。

select count(*) 总数 from exam_result;

 案例2:统计本次考试的数学成绩分数个数

先筛选出数学成绩观察

使用函数统计

select count(math) 总数 from exam_result;

可以看到和统计全班人数用法相同。

 我们也可以对重复的数学成绩进行去重之后再统计

select count(distinct math) from exam_result;

 案例3:统计数学成绩总分

使用上面表中的sum函数

select sum(math) from exam_result;

也可以在select之后构建表达式,统计出数学的平均分

select sum(math)/count(*) from exam_result;

案例4:统计平均总分

除了在select之后使用表达式之外,我们还可以使用avg来直接求平均值

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

案例5:返回英语最高分

先查看所有英语成绩

使用max筛选

select max(english) from exam_result;

结果如上

案例6:返回 > 70 分以上的数学最低分

 select min(math) from exam_result where math > 70;

  结果也符合要求。

以上案例我们需要知道的是要被聚合函数统计,被统计的对象一定要是可聚合的,比如上表中的name列和math等成绩列是放不到一起去的 。

2.分组聚合统计(group by)

准备工作:

首先我们需要的目的是分组之后方便进行聚合统计,所以分组的最终目标还是为了聚合统计。

在学习之前我们需要做一些准备工作。

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

EMP员工表

DEPT部门表

SALGRADE工资等级表。

这里我直接将sql文件的内容放出来

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `scott`;DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',`dname` varchar(14) DEFAULT NULL COMMENT '部门名称',`loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',`ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',`job` varchar(9) DEFAULT NULL COMMENT '雇员职位',`mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',`hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',`sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',`comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',`deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`grade` int(11) DEFAULT NULL COMMENT '等级',`losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',`hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

这个sql文件的内容都是一些基本的操作,不难看懂。

我们show tables;


可以看到上文创建的表都在其中,接下来我们完成案例上的需求。

案例1:如何显示每个部门的平均工资和最高工资

首先全列查询所有员工的信息

首先我们观察到depton分为三种,也就是说公司分为三个部门10,20 ,30;

所以我们按照需求

select deptno ,max(sal) 最高,avg(sal) 平均 from emp group by deptno;

 我们需要知道的是group by是进行分组聚合统计,所以我们要按照自己觉得需求进行使用。

而且可以看到的是使用group by指定列名,实际分组是通过该列不同行的行数据进行分组的。

其实分组简单地按逻辑来看,就是将一张大表拆成了多个子表,然后对多个子表进行聚合统计

 案例2:显示每个部门的每种岗位的平均工资和最低工资

select deptno,job,avg(sal) 平均工资,min(sal) 最低工资  from emp group by deptno,job;

案例3:显示平均工资低于2000的部门和它的平均工资

我们将问题拆开

1.统计出来每一个部门的平均工资(现将结果聚合出来)

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

 

2.再进行判断(对聚合出来的结果再进行判断)

这里就要使用having和group by配合使用,对group by结果进行过滤

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

having的作用是对聚合后的数据再进行统计,也是条件筛选 。

having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。

那怎么样理解having和where的区别

where和having都可以做条件筛选,但是两个条件筛选完全不同。

如果我们将上文的having换成where

就会报错

 再举一个小例子

可以观察上图中命令的语序 

 所以where是对及具体的任意列进行条件筛选;而having是对分组聚合之后的结果进行条件筛选。

也就是说两个语句的应用场景不同。

where可以对原始的表进行条件过滤,之后在对结果使用having进行分组。

所以我们可以得出结论上图sql语句的执行语句如下

 通过以上的案例,未来我们只要能处理好单表的CURD,之后所有的SQL场景,我们都可以用统一的方式进行。

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

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

相关文章

通信工程学习:什么是SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制

SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制 SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制是三种不同的调制方式&#xff0c;它们在通信系统中各有其独特的应用和特点。以下是对这三种调制方式的详细解释&#xff1a; 一、SSB单边带调制 1、SSB单边带…

Android Framework(四)WMS-窗口显示流程——窗口创建与添加

文章目录 流程概览涉及模块流程概览 应用端——window创建&#xff1a;Activity::attach创建window流程setWindowManager&#xff0c;getWindowManagerDecorView 应用端——window的显示流程&#xff1a;Activity::onResumeViewRootImpl::setViewmWindowSession 是什么mWindow是…

ThinkPHP5 5-rce远程代码执行漏洞复现

启动容器 docker-compose up -d 查看端口 docker ps 端口为:8080,访问网站&#xff0c;搭建成功 漏洞复现 &#xff08;1&#xff09;输出关于 PHP 配置的信息 &#xff08;2&#xff09;将php代码写入文件 接着访问shell.php 由于存在过滤&#xff0c;需要用到base64加密来使…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

用了虚拟机后,本机摄像头打不开了(联想电脑thinkpad)

虚拟机有摄像头&#xff0c;我断开了连接&#xff0c;现在本机的摄像头打开就是一个锁 我先把虚拟机的摄像头关了 然后把本机的vm usb关闭了 WinR&#xff09;&#xff0c;输入services.msc&#xff0c;找到VMware USB Arbitration Service&#xff0c;确保其状态为“关闭 然后…

【Day09-IO-字符流其它流】

IO流 IO流-字符流 字节流&#xff1a;适合复制文件等&#xff0c;不适合读写文本文件 字符流&#xff1a;适合读写文本文件内容 FileReader&#xff08;文件字符输入流&#xff09; 作用&#xff1a;以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中来。 …

【Qt】窗口移动和大小改变事件

窗口移动和大小改变事件 moveEvent窗口移动时触发的事件resizeEvent窗口大小改变时触发的事件 例子&#xff1a;测试移动窗口和改变窗口事件 代码展示 #include "widget.h" #include "ui_widget.h"#include <QDebug> #include <QMoveEvent> …

Springboot中基于X509完成SSL检验的原理与实践

前言 各位对HTTPS不陌生吧&#xff1f;几乎涉及安全的领域&#xff0c;均要求通过HTTPS协议进行数据传输。而在传输过程中&#xff0c;又涉及到了SSL证书的使用。既然提到了SSL证书&#xff0c;那咱们先了解了解什么是SSL证书&#xff1a; SSL证书通过在客户端浏览器和Web服务…

如何恢复回收站中已删除/清空的文件

回收站清空后如何恢复已删除的文件&#xff1f;是否可以恢复永久删除的文件&#xff1f;或者最糟糕的是&#xff0c;如果文件直接被删除怎么办&#xff1f;本文将向您展示清空回收站后恢复已删除数据的最佳方法。 回收站清空后如何恢复已删除的文件&#xff1f; “回收站清空后…

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关 SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数mysq…

spring的xml配置文件爆红(原因以及解决办法)

1&#xff09;出现这个原因是因为spring-framework依赖没有导入 可以看到依赖已经导入了 2&#xff09;第二种原因:我们打开maven工程就是不出现右上角刷新的按钮&#xff0c;导致我们无法导入依赖 解决办法如下

【Qt】qt发布Release版本,打包.exe可执行文件

前言&#xff1a;Qt编译的可执行程序&#xff0c;如果直接运行&#xff0c;会出现0xc000007b报错&#xff0c;或者“由于占不到Qt5Network.dll,无法继续执行代码。重新安装程序可能会解决此问题”的报错&#xff0c;因为缺少相关的依赖包和动态库。 1、第一步&#xff1a;找到…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

网络学习-eNSP配置ACL

AR1路由器配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.2.254 24 …

Shader 渲染路径

实际的游戏开发中&#xff0c;场景中的光源肯定是更多、更复杂的&#xff0c;如果只有一个平行光的处理&#xff0c;完全不能满足需求。处理更多的光源&#xff0c;我们就需要了解Unity底层是如何处理这些光源的。 1、渲染路径是什么 渲染路径&#xff08;Rendering Path&…

9.8笔试记录

1.在c中哪些运算符不能重载? 在 C 中&#xff0c;有以下几个运算符不能被重载&#xff1a; . &#xff1a;成员访问运算符。例如obj.member中的.不能被重载。 :: &#xff1a;作用域解析运算符。用于指定命名空间、类等的作用域&#xff0c;不能被重载。 ?: &#xff1…

Linux-文本处理三剑客:grep、sed-和-awk

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

Window下编译OpenJDK17

本文详细介绍Window下如何编译OpenJDK17&#xff0c;包含源码路径&#xff0c;各工具下载地址&#xff0c;严格按照文章中的步骤来操作&#xff0c;你将获得一个由自己亲手编译出的jdk。 一、下载OpenJDK17源码 下载地址&#xff1a;GitHub - openjdk/jdk at jdk-1735 说明&a…

【重学 MySQL】二十、运算符的优先级

【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级&#xff08;由高到低&#xff09;注意事项示例 在 MySQL 中&#xff0c;运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…

神仙公司名单(北京)

神仙公司&#xff08;北京&#xff09; 接着奏乐接着舞&#xff0c;神仙公司系列。 这次写之前几期评论区呼声极高的城市&#xff1a;北京。 北京&#xff0c;是许多人外出打工的梦想之都&#xff0c;是年轻人逃离农村的终点站。 在近两年的就业蓝皮书「外省籍毕业生占比较高城…