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

文章目录

  • 一、聚合函数
    • 1.1 count 返回查询到的数据的数量
    • 1.2 sum 返回查询到的数据的总和
    • 1.3 avg 返回查询到的数据的平均值
    • 1.4 max 返回查询到的数据的最大值
    • 1.5 min 返回查询到的数据的最小值
  • 二、分组查询group by
    • 2.1 导入雇员信息表
    • 2.2 找到最高薪资和员工平均薪资
    • 2.3 显示每个部门的平均工资和最高工资
    • 2.4 显示每个部门不同岗位的平均工资和最低工资
    • 2.5 显示平均工资低于2000的部门和它的平均工资

一、聚合函数

MySQL中的聚合函数用于对数据进行计算和统计,常见的聚合函数包括下面列举出来的聚合函数:

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

1.1 count 返回查询到的数据的数量

  • 查看班级有多少同学
mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 张三      |     134 |   98 |      56 |
|  2 | 李四      |     120 |   80 |      77 |
|  4 | 赵六      |     164 |   84 |      67 |
|  5 | 田七      |     110 |  115 |      45 |
|  6 | 孙八      |     140 |   84 |      78 |
|  8 | 张翼德    |      90 |  128 |      66 |
+----+-----------+---------+------+---------+
6 rows in set (0.00 sec)mysql> select count(*) 总数 from exam_result;
+--------+
| 总数   |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)mysql> select count(1) 总数 from exam_result;
+--------+
| 总数   |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)
  • 统计数学成绩有多少个
# 统计全部
mysql> select count(math) from exam_result;
+-------------+
| count(math) |
+-------------+
|           6 |
+-------------+
1 row in set (0.00 sec)# 统计有效的(去重)
mysql> select count(distinct math) as res from exam_result;
+-----+
| res |
+-----+
|   5 |
+-----+
1 row in set (0.00 sec)
  • 统计英语不及格的人数
mysql> select count(*) from exam_result where english<60;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

1.2 sum 返回查询到的数据的总和

  • 查看数学成绩的总和
mysql> select sum(math) from exam_result;
+-----------+
| sum(math) |
+-----------+
|       589 |
+-----------+
1 row in set (0.00 sec)
  • 统计英语不及格的分数总和
mysql> select sum(english) from exam_result where english<60;
+--------------+
| sum(english) |
+--------------+
|          101 |
+--------------+
1 row in set (0.00 sec)# 也可以统计不及格的平均分
mysql> select sum(english)/count(english) from exam_result where english<60;
+-----------------------------+
| sum(english)/count(english) |
+-----------------------------+
|                        50.5 |
+-----------------------------+
1 row in set (0.00 sec)

1.3 avg 返回查询到的数据的平均值

统计不及格的英语的平均分不需要上面那么麻烦自己手动除:

mysql> select avg(english) from exam_result where english<60;
+--------------+
| avg(english) |
+--------------+
|         50.5 |
+--------------+
1 row in set (0.01 sec)
  • 统计总分的平均分
mysql> select avg(chinese+math+english) from exam_result;
+---------------------------+
| avg(chinese+math+english) |
+---------------------------+
|         289.3333333333333 |
+---------------------------+
1 row in set (0.00 sec)

1.4 max 返回查询到的数据的最大值

  • 查询数学成绩的最大值
mysql> select max(math) from exam_result;
+-----------+
| max(math) |
+-----------+
|       128 |
+-----------+
1 row in set (0.00 sec)

这里要注意聚合必须分组,不能这么使用:

mysql> select name, max(math) from exam_result;

1.5 min 返回查询到的数据的最小值

# 查看数学成绩的最小值
mysql> select min(math) from exam_result;
+-----------+
| min(math) |
+-----------+
|        80 |
+-----------+
1 row in set (0.00 sec)# 查看数学成绩大于100的最小值
mysql> select min(math) from exam_result where math>100;
+-----------+
| min(math) |
+-----------+
|       115 |
+-----------+
1 row in set (0.00 sec)

二、分组查询group by

分组的目的是为了进行分组之后,方便进行聚合统计

在select中使用group by 子句可以对指定列进行分组查询
语法:

select column1, column2, .. from table group by column;

2.1 导入雇员信息表

# 将linux目录下的sql表导入MySQL
mysql> source /home/yyh/scott_data.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> use scott;
Database changedmysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
+-----------------+
3 rows in set (0.00 sec)

emp员工表
dept部门表
salgrade工资等级表

2.2 找到最高薪资和员工平均薪资

# 查看员工表
mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)# 聚合函数
mysql> select max(sal) 最高, avg(sal) 平均 from emp;
+---------+-------------+
| 最高    | 平均        |
+---------+-------------+
| 5000.00 | 2073.214286 |
+---------+-------------+
1 row in set (0.00 sec)

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

这里就需要进行分组。

# 通过列分组
group by 列名
# 用该列的不同数据进行分组
mysql> select deptno,max(sal) 最高, avg(sal) 平均 from emp group by deptno;
+--------+---------+-------------+
| deptno | 最高    | 平均        |
+--------+---------+-------------+
|     10 | 5000.00 | 2916.666667 |
|     20 | 3000.00 | 2175.000000 |
|     30 | 2850.00 | 1566.666667 |
+--------+---------+-------------+
3 rows in set (0.00 sec)

这里分组条件用的是deptno,所以每个组内的deptno一定是相同的。

分组就是把一张表按照条件在逻辑上拆成了多个子表,然后分别对每个子表进行聚合统计。

2.4 显示每个部门不同岗位的平均工资和最低工资

这里既然要每个部门和不同岗位,那么就注定要分组。
先分组再聚合

group by deptno, job;
mysql> select deptno,job,max(sal) 最高,avg(sal) 平均 from emp group by deptno,job;
+--------+-----------+---------+-------------+
| deptno | job       | 最高    | 平均        |
+--------+-----------+---------+-------------+
|     10 | CLERK     | 1300.00 | 1300.000000 |
|     10 | MANAGER   | 2450.00 | 2450.000000 |
|     10 | PRESIDENT | 5000.00 | 5000.000000 |
|     20 | ANALYST   | 3000.00 | 3000.000000 |
|     20 | CLERK     | 1100.00 |  950.000000 |
|     20 | MANAGER   | 2975.00 | 2975.000000 |
|     30 | CLERK     |  950.00 |  950.000000 |
|     30 | MANAGER   | 2850.00 | 2850.000000 |
|     30 | SALESMAN  | 1600.00 | 1400.000000 |
+--------+-----------+---------+-------------+
9 rows in set (0.00 sec)

这里要注意一般select后边的字段必须在group by中出现
比如说select 后边加个ename就会报错,因为同一个分组可能会有不同的ename。

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

分成两步:

先统计每一个部门的平均工资(先按部门对平均工资进行分组聚合)
再对聚合的结果进行条件判断

  • 如何对聚合的结果条件判断?

通过having搭配group by
having就是对聚合后的数据统计进行条件筛选

mysql> select deptno,avg(sal) 平均 from emp group by deptno having 平均<2000;
+--------+-------------+
| deptno | 平均        |
+--------+-------------+
|     30 | 1566.666667 |
+--------+-------------+
1 row in set (0.00 sec)

在这里插入图片描述

  • having和where区别理解,执行顺序

先来看个样例:
SMITH不参与统计,显示每个部门、每种岗位的平均工资低于2000的工种。

mysql> select deptno,job,avg(sal) 平均 from emp where ename!='SMITH' group by deptno,job having 平均<2000;
+--------+----------+-------------+
| deptno | job      | 平均        |
+--------+----------+-------------+
|     10 | CLERK    | 1300.000000 |
|     20 | CLERK    | 1100.000000 |
|     30 | CLERK    |  950.000000 |
|     30 | SALESMAN | 1400.000000 |
+--------+----------+-------------+
4 rows in set (0.00 sec)

where 是对任意列进行条件筛选(筛选之后才会进行分组)
having 是对分组聚合之后的结果进行条件筛选

执行顺序:

先要知道从哪个表中取数据(from),再看拿数据过程中的筛选条件(where),然后对拿到的数据分组(group by),在按照分组之后的结果进行聚合统计并且重命名(select),最后再对结果做条件筛选(having)

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

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

相关文章

【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

网络编程套接字 &#x1f41b;预备知识&#x1f98b;理解源IP地址和目的IP地址&#x1f40c;认识端口号&#x1f41e; 理解 "端口号" 和 "进程ID"&#x1f41c;简单认识TCP协议&#x1f99f;简单认识UDP协议&#x1f997; 什么是网络字节序 &#x1f577;相…

Session与Cookie的区别(五)

储存状态的方式 小明的故事说完了&#xff0c;该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。 前面已经提到过我们会把状态存在 Cookie 里面&#xff0c;让 Request 之间能够变得有关联。 假设我们今天要来做一个会员系统&#xff0c;那我要怎么知道…

解读百胜中国2023年第二季度财报:聚焦下沉市场,扩店实力几何?

从全网玩梗的“肯德基疯狂星期四”文学&#xff0c;到大小朋友疯狂抢购的六一三丽鸥玩具联名&#xff0c;再到不久前爆火的必胜客原神联名活动&#xff0c;肯德基、必胜客这两大家喻户晓的快餐品牌&#xff0c;被不少新闻调侃为“顶流制造机”。而近日&#xff0c;这两大顶流背…

Day 75:通用BP神经网络 (2. 单层实现)

代码&#xff1a; package dl;import java.util.Arrays; import java.util.Random;/*** Ann layer.*/ public class AnnLayer {/*** The number of input.*/int numInput;/*** The number of output.*/int numOutput;/*** The learning rate.*/double learningRate;/*** The m…

海外社媒营销:如何树立品牌个性与目标受众共鸣?

随着全球化的不断深入&#xff0c;海外市场对于企业的重要性越来越凸显。在这个数字化时代&#xff0c;社交媒体已经成为品牌塑造和推广的重要渠道之一。然而&#xff0c;海外市场竞争激烈&#xff0c;想要在众多品牌中脱颖而出&#xff0c;就需要在社交媒体关注者的心中树立品…

AcWing1171. 距离(lcatarjan)

输入样例1&#xff1a; 2 2 1 2 100 1 2 2 1输出样例1&#xff1a; 100 100输入样例2&#xff1a; 3 2 1 2 10 3 1 15 1 2 3 2输出样例2&#xff1a; 10 25 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N2e55; int n,m,x,y,k,r…

算法通关村—轻松搞定二叉树的高度和深度问题

1.二叉树的最大深度 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 1.1 递归 通过上面的步骤能够看出&#xff0c;深度取决于左右子树&#xff0c;只要左子树有&#xff0c;那么高…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…

php-cgi.exe - FastCGI 进程超过了配置的请求超时时限

解决方案一&#xff1a; 处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题 内容转载&#xff1a; 处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题_php技巧_脚本之家 【详细错误】&#xff1a; HTTP 错误 500.0 - Internal Server Error C:…

go编译文件

1.编译go文件 go build [go文件]2.执行文件编译文件 ./demo [demo为go文件名称]

2023-08-06 LeetCode每日一题(24. 两两交换链表中的节点)

2023-08-06每日一题 一、题目编号 24. 两两交换链表中的节点二、题目链接 点击跳转到题目位置 三、题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0…

Kubernetes高可用集群二进制部署(四)部署kubectl和kube-controller-manager、kube-scheduler

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

LeetCode 27题:移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

07 Ubuntu中使用poetry工具管理python环境——巨详细!!!

由于conda和ros2的环境实在太容易冲突了。我真的不敢再使用conda&#xff0c;着实是有些搞不明白这解释器之间的关系。 conda的卸载和ros2的安装暂不赘述&#xff0c;下面着重来说如何在Ubuntu中使用poetry进行包管理及遇到的问题。 1 安装poetry 由于在有写入权限的限制&am…

STM32--GPIO

文章目录 GPIO简介GPIO的基本结构GPIO位结构GPIO模式LED和蜂鸣器LED闪烁工程及程序原码代码&#xff1a; 蜂鸣器工程和程序原码代码 传感器光敏传感器控制蜂鸣器工程代码 GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;是通用输入/输出口的简称。它是一种…

GO学习之 函数(Function)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 文章目录 GO系列前言一、什么是…

UNITY3D 虚拟数字人方向,动捕设备测评 VDSuit-Full

我们成功的用它做了线下演出活动。 开发测试视频 VDSuit-Full动捕开发 分别说优点和不足 优点&#xff1a; 人工技术答疑及时 有厂家解答各种疑难杂症&#xff08;工作日一般1小时就得到回复&#xff09; 比如穿戴&#xff0c;使用方法&#xff0c;限制等。 动作整体捕捉效果较…

【使用内网穿透从公网对本地内网Web服务器访问】

公网访问本地内网web服务器【内网穿透】 文章目录 公网访问本地内网web服务器【内网穿透】前言1. 首先安装PHPStudy2.下载一个开源的网页文件3. 选择“创建网站”并将网页内容指向下载好的开源网页文件4. 打开本地网页5. 打开本地cpolar客户端6. 保存隧道设置 生成数据隧道 前言…

SpringCloud深度学习(在更)

微服务简介 微服务是什么&#xff1f; 微服务是一种架构风格&#xff0c;将一个大型应用程序拆分为一组小型、自治的服务。每个服务都运行在自己独立的进程中&#xff0c;使用轻量级的通信机制&#xff08;通常是HTTP或消息队列&#xff09;进行相互之间的通信。这种方式使得…

如何恢复已删除的 PDF 文件 - Windows 11、10

在传输数据或共享专业文档时&#xff0c;大多数人依赖PDF文件格式&#xff0c;但很少知道如何恢复意外删除或丢失的PDF文件。这篇文章旨在解释如何有效地恢复 PDF 文件。如果您身边有合适的数据恢复工具&#xff0c;PDF 恢复并不像看起来那么复杂。 便携式文档格式&#xff08…