【数据库】MySQL聚合统计

news2024/9/17 2:04:28

目录

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.coloradmin.cn/o/2116787.html

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

相关文章

双指针思想

一.双指针思想 1.分类&#xff1a;同向双指针&#xff0c;反向双指针 2.优点&#xff1a;可以将两层循环嵌套的问题优化成一层循环 3.常见情况 <1>利用快慢双指针确定链表的中间节点&#xff0c;链表是否带环&#xff0c;带环链表的入环点在哪里 <2>一次循环解…

Android Fragment 学习备忘

1.fragment的动态添加与管理&#xff0c;fragment生命周期在后面小节&#xff1a;https://www.bilibili.com/video/BV1Ng411K7YP/?p37&share_sourcecopy_web&vd_source982a7a7c05972157e8972c41b546f9e4https://www.bilibili.com/video/BV1Ng411K7YP/?p37&share_…

安装Android Studio及第一个Android工程可能遇到的问题,gradle下载过慢、sync失败?

Android Studio版本众多&#xff0c;电脑操作系统、电脑型号、电脑硬件也是多种多样&#xff0c;幸运的半个小时内可以完成安装&#xff0c;碰到不兼容的电脑&#xff0c;一天甚至更长时间都无法安装成功。 Android安装及第一个Android工程分为4个步骤&#xff0c;为什么放到一…

9.8笔试记录

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

spring揭秘19-spring事务01-事务抽象

文章目录 【README】【1】事务基本元素【1.1】事务分类 【2】java事务管理【2.1】基于java的局部事务管理【2.2】基于java的分布式事务管理【2.2.1】基于JTA的分布式事务管理【2.2.2】基于JCA的分布式事务管理 【2.3】java事务管理的问题 【3】spring事务抽象概述【3.1】spring…

easyExcel-读取Excel

1、简单读取&#xff0c;没有合并单元格 2、复杂读取&#xff0c;合并单元格-方法一 1、简单读取&#xff0c;没有合并单元格 1.1、引入pom文件 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.…

【单片机】详细解析完全重映射和部分重映射

1、重映射的作用 单片机中的每个引脚通常都有多个功能&#xff0c;不仅仅是作为普通的输入或输出&#xff0c;还可以与某些外设&#xff08;如定时器、串口、SPI、I2C等&#xff09;关联。默认情况下&#xff0c;这些外设功能通常固定绑定到特定的GPIO引脚。但是&#xff0c;在…

Matplotlib颜色透明度设置

matplotlib中的透明度设置都是通过alpha设置的,一般在能设置颜色的包括背景色、图表色、文字颜色都可以设置透明度 float类型,取值范围为[0.0,1.0],alpha取值越小越透明 import numpy as np import matplotlib.pyplot as pltx np.linspace(0, 2*np.pi, 100) y np.sin(x) y1…

Arch - 架构安全性_授权(Authorization)

文章目录 OverView授权&#xff08;Authorization&#xff09;RBAC&#xff1a; 概述RBAC&#xff1a;基于角色的访问控制RBAC&#xff1a;主要元素 OAuth2&#xff1a;面向第三方应用的认证授权协议业务场景OAuth2的工作流程OAuth2 四种不同的授权方式授权码模式&#xff08;A…

Android Studio 2024最新版Hello World

Android Studio 2024最新版Hello World 1. Android Studio 2024安装视频2. 创建项目Read Timed out 问题Android Studio Build Output 控制台中文乱码问题 3. 驱动管理 本文章介绍如何通过Android Studio 2024最新版创建项目&#xff0c; 并成功输出Hello World。 本次教程版本…

关于QT中使用网络编程QtNetwork的问题

在此处添加network模块 在链接器中添加附加库目录(QT对应的lib)在链接器-输入中添加对应的lib库(Qt5Network.lib) 这样,就可以使用对应的下面的库文件了,比如: #include <qnetworkaccessmanager.h>

参数高效微调(PEFT)综述

人工智能咨询培训老师叶梓 转载标明出处 大模型如BERT和GPT-3的参数数量庞大&#xff0c;动辄数十亿甚至数千亿级别&#xff0c;给进一步的微调和应用带来了巨大的挑战。针对这一问题&#xff0c;Vladislav Lialin、Vijeta Deshpande、Anna Rumshisky等研究者中提出了一系列参…

Leetcode面试经典150题-69.X的平方根

相当简单的题目&#xff0c;但是出现的概率还挺高的 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int mySqrt(int x) {/**0的平方根是0 */if(x 0) {return 0;}/**1~3的平方根是1 */if(x < 3) {return 1;}/**其他情况我们采用二分查找&#xff…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…

Android Studio下载Gradle失败问题解决

问题说明 使用 Android Studio 构建程序报错如下 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.5.1-bin.zip. Reason: java.net.SocketTimeoutException: Connect timed out问题解决 下载对应版本的压缩包 gradle-7.5.1…

香橙派转换模型以及在开发板上部署

新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程&#xff0c;防止后面忘记。 使用的开发板&#xff1a;Orange Pi 5 Plus&#xff08;rk3588&#xff09; 官方的一些资料在&#xff08;主要参考用户手册&#xff09;&#xff1a;Orange Pi - Orangepihttp:/…

价格适中超微小间距P1.8全彩LED显示屏广泛应用于COB会议一体机

随着科技的不断进步与市场需求的日益多样化&#xff0c;价格适中且具备超微小间距P1.8技术的全彩LED显示屏&#xff0c;在COB&#xff08;Chip On Board&#xff09;会议一体机领域的应用正逐步深化&#xff0c;引领着现代会议展示的新风尚。这种显示屏不仅以其细腻的画质和卓越…

单片机DMA原理及应用详解(下篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获&#xff01; 关于DMA的原理&#xff0c;可以看上一篇文章&#xff1a; 单片机DMA原理及应用详解&#xff08;上篇&#xff09;&#xff08;附工程源码&#xff09;-CSDN博客 目录 一、STM32单片…

黑龙江IBM Storwize v3700存储故障维修

中国黑龙江省佳木斯IBM Storwize v3700存储控制器故障维修案例&#xff1a; 报修单位&#xff1a;黑龙江佳木斯某某医院 存储型号&#xff1a;联想或IBM v3700 存储故障&#xff1a;无法正常访问存储磁盘&#xff0c;无法进存储web管理界面&#xff0c;可以进存储服务助手界…

《C++ 中的左值与右值》

在 C 的世界里&#xff0c;左值和右值是两个重要的概念&#xff0c;理解它们对于掌握 C 语言的精髓至关重要。 首先&#xff0c;我们来认识左值。左值&#xff0c;即 “locator value”&#xff0c;可以理解为有明确存储位置且可以被取地址的表达式。简单来说&#xff0c;一个可…