『 MySQL数据库 』聚合统计

文章目录

  • 前言 🥑
    • 🥝 聚合函数
      • 🍓 COUNT( ) 查询数据数量
      • 🍓 SUM( ) 查询数据总和
      • 🍓 AVG( ) 查询数据平均值
      • 🍓 MAX( ) 查询数据最大值
      • 🍓 MIN( ) 查询数据最小值
    • 🥝 数据分组GROUP BY子句
      • 🍓 GROUP BY示例
      • 🍓 HAVING语句


前言 🥑

请添加图片描述
在MySQL中存在一种查询方式叫做聚合查询;
聚合查询顾名思义就是将一组数据的同种类型进行聚合,那么既然是一组同类型的数据那么即必须要对该数据进行分组同时再对这组数据进行聚合;
所以对于聚合查询来说时应该有两部分组合:

  • 将数据进行分组;
  • 将数据进行聚合统计;
    需要配合SELECT语句进行使用;

🥝 聚合函数

请添加图片描述
在MySQL中存在一些高频操作:查询数量个数,查询数据总和…
而在MySQL中存在着一些函数,这些函数即用来对表内数据进行这些比较高频的操作,这些函数叫做聚合函数,当然这些函数存在的意义也是聚合查询中的重要操作;
存在一张表(Point):

+----+---------+---------+------+---------+
| id | name    | chinese | math | english |
+----+---------+---------+------+---------+
|  1 | Lihua   |     100 |  118 |     180 |
|  2 | Liming  |      57 |   58 |     140 |
|  3 | Zhaolao |      66 |   80 |      94 |
|  4 | Wu      |      76 |   70 |      94 |
|  5 | Wuqi    |      88 |   43 |     160 |
|  6 | Liqiang |      89 |  122 |     180 |
|  7 | Qinsu   |      90 |  104 |     134 |
|  8 | Zhaoli  |      54 |   74 |     200 |
+----+---------+---------+------+---------+

🍓 COUNT( ) 查询数据数量

请添加图片描述
语法:

COUNT([DISTINCT] expr) 
-- 返回查询到的数据的数量
-- 其中[]内为可选项

该函数能查询对应数据的数量;

  • 示例1:查询该表中人数个数:
    mysql> select count(*) from Point;
    +----------+
    | count(*) |
    +----------+
    |        8 |
    +----------+
    1 row in set (0.00 sec)
    

  • 示例2:查询该表中math字段数据>100的个数:
    mysql> select count(math) from Point where math>100;
    +-------------+
    | count(math) |
    +-------------+
    |           3 |
    +-------------+
    1 row in set (0.00 sec)
    

  • 示例3:查询该表中english字段数据个数
    mysql> select count(distinct english) from Point; -- 利用distinct进行去重
    +-------------------------+
    | count(distinct english) |
    +-------------------------+
    |                       6 |
    +-------------------------+
    1 row in set (0.00 sec)
    

🍓 SUM( ) 查询数据总和

请添加图片描述
语法:

COUNT([DISTINCT] expr) 

该函数能够算出一组数据的总和;

  • 示例:计算出english字段所有数据的总和:
    mysql> select sum(english) from Point;
    +--------------+
    | sum(english) |
    +--------------+
    |         1182 |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql> select sum(distinct english) from Point;
    +-----------------------+
    | sum(distinct english) |
    +-----------------------+
    |                   908 |
    +-----------------------+
    1 row in set (0.00 sec)
    

🍓 AVG( ) 查询数据平均值

请添加图片描述
语法:

AVG([DISTINCT] expr) 

该函数能够算出一组数据的平均值;

  • 示例:计算出表中english+math+chinese字段的平均值:
    mysql> select AVG(english+chinese+math) from Point;
    +---------------------------+
    | AVG(english+chinese+math) |
    +---------------------------+
    |                  308.8750 |
    +---------------------------+
    1 row in set (0.00 sec)
    

🍓 MAX( ) 查询数据最大值

请添加图片描述
语法:

MAX([DISTINCT] expr) 

该函数能够算出一组数据的最大值;

  • 示例:计算出表中chinese字段的最大值:
    mysql> select max(chinese) from Point;
    +--------------+
    | max(chinese) |
    +--------------+
    |          100 |
    +--------------+
    1 row in set (0.00 sec)
    

🍓 MIN( ) 查询数据最小值

请添加图片描述
语法:

MIN([DISTINCT] expr) 

该函数能够算出一组数据的最小值(用法与MAX()函数相同);


🥝 数据分组GROUP BY子句

请添加图片描述
聚合统计讲究的是一个先将数据进行分组在将数据进行聚合统计,在MySQL中可以使用GPOUP BY子句将数据进行分组;
在SELECT中使用GROUP BY子句对指定列进行分组查询;
语法:

SELECT column1 ,column2, ... FROM table_name GROUP BY column1,column2...;

在进行聚合查询的演示前需要准备一个来自Oralce 9i的测试用表 - 雇员表(该表在本篇博客中存在资源);

下载该表后使用SOURCE /路径的方式将表至于MySQL当中;

该文件为一个数据库,库中共有三张表: dept部门表,emp员工表,salgrade工资等级表 ;
其中三张表的表结构分别为:

  • dept

           Table: dept
    Create Table: CREATE TABLE `dept` (
      `deptno` int(2) unsigned zerofill NOT NULL COMMENT ' 部门编号 ',
      `dname` varchar(14) DEFAULT NULL COMMENT ' 部门名称 ',
      `loc` varchar(13) DEFAULT NULL COMMENT ' 部门所在地点 '
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

  • emp

           Table: emp
    Create Table: 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 '部门编号'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

  • salgrade
           Table: salgrade
    Create Table: CREATE TABLE `salgrade` (
      `grade` int(11) DEFAULT NULL COMMENT '等级',
      `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
      `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

该表的对应数据分别为:

############## 表dept ##############
mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

############## 表emp ##############
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 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+

############## 表salgrade ##############
mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+

🍓 GROUP BY示例

请添加图片描述

  1. 显示每个部门的最高工资与平均工资:

    该在示例中需要显示每个每个部门的最高工资,说明需要将 每个部分进行分组,GROUP BY deptno;
    同时要求计算出每个部门的最高工资与最低工资,说明需要对每个部门进行聚合统计,即MAX(sal)AVG(sal);
    将其组合即为:

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

    由于是以deptno进行分组,所以可以SELECT出分组的名;
    即:

    mysql> select deptno,max(sal),avg(sal) from emp group by deptno;
    +--------+----------+-------------+
    | deptno | max(sal) | avg(sal)    |
    +--------+----------+-------------+
    |     10 |  5000.00 | 2916.666667 |
    |     20 |  3000.00 | 2175.000000 |
    |     30 |  2850.00 | 1566.666667 |
    +--------+----------+-------------+
    

  1. 显示每个部门的每种岗位的平均工资与最低工资:

    在该示例中需要显示每个部门与每种岗位,说明该示例中需要对数据进行两类分组,即为GROUP BY deptno , job;
    且需要聚合统计出该类数据的平均值与最高值,即为AVG(sal)MIN(sal);
    在该条件中由于是对部门deptno与岗位job进行分组,所以在SELECT时可以分别显示出他们的值;
    即为:

    mysql> SELECT deptno,job,avg(sal),min(sal) from emp group by deptno,job;
    +--------+-----------+-------------+----------+
    | deptno | job       | avg(sal)    | min(sal) |
    +--------+-----------+-------------+----------+
    |     10 | CLERK     | 1300.000000 |  1300.00 |
    |     10 | MANAGER   | 2450.000000 |  2450.00 |
    |     10 | PRESIDENT | 5000.000000 |  5000.00 |
    |     20 | ANALYST   | 3000.000000 |  3000.00 |
    |     20 | CLERK     |  950.000000 |   800.00 |
    |     20 | MANAGER   | 2975.000000 |  2975.00 |
    |     30 | CLERK     |  950.000000 |   950.00 |
    |     30 | MANAGER   | 2850.000000 |  2850.00 |
    |     30 | SALESMAN  | 1400.000000 |  1250.00 |
    +--------+-----------+-------------+----------+
    9 rows in set (0.00 sec)
    
    # 也可将其进行重命名
    mysql> SELECT deptno 部门,job 岗位,avg(sal) 最大工资,min(sal) 最小工资 from emp group by deptno,job;
    +--------+-----------+--------------+--------------+
    | 部门   | 岗位      | 最大工资     | 最小工资     |
    +--------+-----------+--------------+--------------+
    |     10 | CLERK     |  1300.000000 |      1300.00 |
    |     10 | MANAGER   |  2450.000000 |      2450.00 |
    |     10 | PRESIDENT |  5000.000000 |      5000.00 |
    |     20 | ANALYST   |  3000.000000 |      3000.00 |
    |     20 | CLERK     |   950.000000 |       800.00 |
    |     20 | MANAGER   |  2975.000000 |      2975.00 |
    |     30 | CLERK     |   950.000000 |       950.00 |
    |     30 | MANAGER   |  2850.000000 |      2850.00 |
    |     30 | SALESMAN  |  1400.000000 |      1250.00 |
    +--------+-----------+--------------+--------------+
    9 rows in set (0.00 sec)
    
    

🍓 HAVING语句

请添加图片描述
HAVING语句为条件筛选语句的一种,其使用方式类似于WHERE;
大部分情况下HAVING子句是用来配合GROUP BY语句进行使用,即对分组聚合后的数据进行筛选;
HAVING子句可以做到与WHERE子句一样的事,但是WHERE子句的功能却不能与HAVING子句相当;
由于HAVING语句是用来针对聚合统计而产生的,所以在MySQL中不能使用HAVING子句来代替WHERE子句,即这两个语句不能混为一谈;

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

    在该示例中要求了平均工资低于2000的部门,即需要对部门进行GROUP BY分类,即GROUP BY deptno;
    同时示例要求显示平均工资,即为AVG(sal);
    将其组合在一起即能显示出各个部门的平均工资:

    mysql> select deptno,avg(sal) from emp group by deptno;
    +--------+-------------+
    | deptno | avg(sal)    |
    +--------+-------------+
    |     10 | 2916.666667 |
    |     20 | 2175.000000 |
    |     30 | 1566.666667 |
    +--------+-------------+
    3 rows in set (0.00 sec)
    
    

    其又要求显示平均工资低于2000的部门与它的平均工资,则可以使用HAVING子句对聚合统计后的数据进行筛选;

    mysql> select deptno as 部门,avg(sal) as 平均工资  from emp group by deptno having 平均工资<2000;
    +--------+--------------+
    | 部门   | 平均工资     |
    +--------+--------------+
    |     30 |  1566.666667 |
    +--------+--------------+
    1 row in set (0.00 sec)
    
    ##当使用where子句代替having子句时将会报错;
    mysql> select deptno as 部门,avg(sal) as 平均工资  from emp group by deptno where 平均工资<2000;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where 平均工资<2000' at line 1
    
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期待一下elasticsearch还未发布的8.12版本,由lucene底层带来的大幅度提升

现在是北京时间23年12月10日。当前es最新版本还是es8.11版本。我们可以期待一下不久的将来&#xff0c;es的8.12版本看到大幅度的检索性能提升。受益于 Lucene 9.9版本&#xff0c;内核带来的大幅提升&#xff01; 此次向量检索利用底层指令fma会性能提升5%。并且还提供了向量点…

零一万物模型折腾笔记:官方 Yi-34B 模型基础使用

当争议和流量都消失后&#xff0c;或许现在是个合适的时间点&#xff0c;来抛开情绪、客观的聊聊这个 34B 模型本身&#xff0c;尤其是实践应用相关的一些细节。来近距离看看这个模型在各种实际使用场景中的真实表现和对硬件的性能要求。 或许&#xff0c;这会对也想在本地私有…

NLP项目实战01--电影评论分类

介绍&#xff1a; 欢迎来到本篇文章&#xff01;在这里&#xff0c;我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言&#xff0c;我们将关注情感分析任务&#xff0c;即通过分析电影评论的情感来判断评论是正面的、负面的。 展示&#xff1a; 训练展示如下…

Android笔记(十七):PendingIntent简介

PendingIntent翻译成中文为“待定意图”&#xff0c;这个翻译很好地表示了它的涵义。PendingIntent描述了封装Intent意图以及该意图要执行的目标操作。PendingIntent封装Intent的目标行为的执行是必须满足一定条件&#xff0c;只有条件满足&#xff0c;才会触发意图的目标操作。…

HCIP —— BGP 基础 (上)

BGP --- 边界网关协议 &#xff08;路径矢量协议&#xff09; IGP --- 内部网关协议 --- OSPF RIP ISIS EGP --- 外部网关协议 --- EGP BGP AS --- 自治系统 由单一的组织或者机构独立维护的网络设备以及网络资源的集合。 因 网络范围太大 需 自治 。 为区分不同的AS&#…

C#,图算法——以邻接节点表示的图最短路径的迪杰斯特拉(Dijkstra)算法C#程序

1 文本格式 using System; using System.Text; using System.Linq; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { public class Node // : IComparable<Node> { private int vertex, weigh…

CNN发展史脉络 概述图整理

CNN发展史脉络概述图整理&#xff0c;学习心得&#xff0c;供参考&#xff0c;错误请批评指正。 相关论文&#xff1a; LeNet&#xff1a;Handwritten Digit Recognition with a Back-Propagation Network&#xff1b; Gradient-Based Learning Applied to Document Recogniti…

【工具使用-JFlash】如何使用Jflash擦除和读取MCU内部指定扇区的数据

一&#xff0c;简介 在调试的过程中&#xff0c;特别是在调试向MCU内部flash写数据的时候&#xff0c;我们常常要擦除数据区的内容&#xff0c;而不想擦除程序取。那这种情况就需要擦除指定的扇区数据即可。本文介绍一种方法&#xff0c;可以擦除MCU内部Flash中指定扇区的数据…

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、pywin326、百度AI7、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音&#xff0c;TTS是人工智能AI的一个模组&#xff0c;是人机…

【linux】yum安装时: Couldn‘t resolve host name for XXXXX

yum 安装 sysstat 报错了&#xff1a; Kylin Linux Advanced Server 10 - Os 0.0 B/s | 0 B 00:00 Errors during downloading metadata for repository ks10-adv-os:- Curl error (6): Couldnt resolve host nam…

【摸鱼向】利用Arduino实现自动化切屏

曾几何时&#xff0c;每次背着老妈打游戏的时候都要紧张兮兮地听着爸妈是不是会破门而入&#xff0c;这严重影响了游戏体验&#xff0c;因此&#xff0c;最近想到了用Arduino加上红外传感器来实现自动监测的功能&#xff0c;当有人靠近门口的时候&#xff0c;电脑可以自动执行预…

【文件上传系列】No.2 秒传(原生前端 + Node 后端)

上一篇文章 【文件上传系列】No.1 大文件分片、进度图展示&#xff08;原生前端 Node 后端 & Koa&#xff09; 秒传效果展示 秒传思路 整理的思路是&#xff1a;根据文件的二进制内容生成 Hash 值&#xff0c;然后去服务器里找&#xff0c;如果找到了&#xff0c;说明已经…

pytorch:YOLOV1的pytorch实现

pytorch&#xff1a;YOLOV1的pytorch实现 注&#xff1a;本篇仅为学习记录、学习笔记&#xff0c;请谨慎参考&#xff0c;如果有错误请评论指出。 参考&#xff1a; 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(Y…

【IDEA】解决mac版IDEA,进行单元测试时控制台不能输入问题

我的IDEA版本 编辑VM配置 //增加如下配置&#xff0c;重启IDEA -Deditable.java.test.consoletrue测试效果

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…

初级数据结构(二)——链表

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;一&#xff09;——顺序表 | NULL 下一篇-> 1、链表特征 与顺序表数据连续存放不同&#xff0c;链表中每个数据是分开存放的&#xff0c;而且存放的位置尤其零散&#…

C# WPF上位机开发(会员管理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 好多同学都认为上位机只是纯软件开发&#xff0c;不涉及到硬件设备&#xff0c;比如听听音乐、看看电影、写写小的应用等等。如果是消费电子&#…

人工智能从 DeepMind 到 ChatGPT ,从 2012 - 2024

本心、输入输出、结果 文章目录 人工智能从 DeepMind 到 ChatGPT &#xff0c;从 2012 - 2024前言2010年&#xff1a;DeepMind诞生2012&#xff5e;2013年&#xff1a;谷歌重视AI发展&#xff0c;“拿下”Hinton2013&#xff5e;2014年&#xff1a;谷歌收购DeepMind2013年&…

调用别人提供的接口无法通过try catch捕获异常(C#),见鬼了

前几天做CA签名这个需求时发现一个很诡异的事情&#xff0c;CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好&#xff0c;然后调他封装的接口即可完成签名操作。但在测试过程中&#xff0c;发现他提供的接…

2024年网络安全竞赛-数字取证调查attack817

​ 数字取证调查 (一)拓扑图 服务器场景:FTPServer20221010(关闭链接) 服务器场景操作系统:未知 FTP用户名:attack817密码:attack817 分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值…