【MySQL】(5)聚合函数

news2024/12/25 7:54:12

文章目录

  • 聚合函数
    • COUNT 函数
    • SUM 函数
    • AVG 函数
    • MAX 函数 MIN 函数
  • group by 子句
    • 简介
    • 示例:scott 数据库
    • 单列分组
    • 多列分组
  • having 子句
  • 总结

聚合函数

在 MySQL 中,聚合函数是用于计算多行数据的统计信息的函数,例如总和、平均值、最大值、最小值和行数等。聚合函数用于在查询结果中创建单个值,该值代表聚合操作的结果。将多行数据聚合成单个结果,这是聚合函数得名的由来。

以下是 MySQL 中常见的聚合函数:

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

这些函数通常用于 SELECT 查询语句中,与 GROUP BY 子句结合使用以对数据进行分组和汇总。

COUNT 函数

在 MySQL 中,count 函数用于计算指定列或表中行的数量。

语法

SELECT COUNT(expression) FROM table_name WHERE conditions;

其中,expression 可以是任何表达式,用于指定要计数的列或条件。如果使用 * 作为 expression,则将计算表中所有行的数量。

如果要计算表中特定列的行数,可以使用以下语法:

SELECT COUNT(column_name) FROM table_name;

计算结果会忽略指定列中的NULL。

如果要计算表中所有行的数量,可以使用以下语法:

SELECT COUNT(*) FROM table_name;

理解

SELECT COUNT(column_name) FROM table_name; 就是 SELECT column_name FROM table_name; 的结果的非空行数

有如下表格

MariaDB [test_db]> select * from student_scores;
+----+---------+---------+------+---------+
| id | name    | chinese | math | english |
+----+---------+---------+------+---------+
|  1 | Alice   |      80 |   85 |      90 |
|  3 | Charlie |      90 |   95 |      85 |
|  4 | Dave    |      80 |   90 |      95 |
|  5 | Emma    |      95 |   85 |      90 |
|  6 | Frank   |      70 |   78 |      80 |
|  7 | God     |    NULL | NULL |    NULL |
+----+---------+---------+------+---------+
6 rows in set (0.00 sec)

查询总人数:

MariaDB [test_db]> select count(name) as 总人数 from student_scores;
+-----------+
| 总人数    |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

实际上,count() 内写成 * 也可以,甚至写成 1 这样的字面值也可以得到正确结果。

MariaDB [test_db]> select count(*) as 总人数 from student_scores;
+-----------+
| 总人数    |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

MariaDB [test_db]> select count(1) as 总人数 from student_scores;
+-----------+
| 总人数    |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

这是因为 * 和 1 都可以作为一个列,select count(*) as 总人数 from student_scores; 的结果就是 select * as 总人数 from student_scores; 的结果的行数。select count(1) as 总人数 from student_scores; 的结果是 select 1 as 总人数 from student_scores; 的结果的行数。

统计 chinese 列,NULL 行被忽略

MariaDB [test_db]> select count(chinese) from student_scores;
+----------------+
| count(chinese) |
+----------------+
|              5 |
+----------------+
1 row in set (0.00 sec)

将 distinct 写在 count() 内外的区别:

MariaDB [test_db]> select count(distinct chinese) from student_scores;
+-------------------------+
| count(distinct chinese) |
+-------------------------+
|                       4 |
+-------------------------+
1 row in set (0.00 sec)

MariaDB [test_db]> select distinct count(chinese) from student_scores;
+----------------+
| count(chinese) |
+----------------+
|              5 |
+----------------+
1 row in set (0.00 sec)

很明显,写在里面才是对去重后的结果统计行数,写在外面是在已经统计好行数后对count的结果去重。

SUM 函数

在 MySQL 中,SUM 是一个聚合函数,用于计算指定列或表中所有行的数值之和。可以将 SUM 用于任何数值类型的列,包括整数、小数等。

语法

SELECT SUM(column_name) FROM table_name WHERE conditions;

column_name 是要计算总和的列的名称

统计所有人的语文成绩的和

MariaDB [test_db]> select sum(chinese) from student_scores;
+--------------+
| sum(chinese) |
+--------------+
|          415 |
+--------------+
1 row in set (0.00 sec)

AVG 函数

在 MySQL 中,AVG 是一个聚合函数,用于计算指定列或表中所有行的数值平均值。AVG 函数仅适用于数值类型的列,例如整数或小数。

语法

SELECT AVG(column_name) FROM table_name WHERE conditions;

求英语的平均分

MariaDB [test_db]> select avg(english) from student_scores;
+--------------+
| avg(english) |
+--------------+
|      88.0000 |
+--------------+
1 row in set (0.00 sec)

MAX 函数 MIN 函数

语法

SELECT MAX(column_name) FROM table_name WHERE conditions;

SELECT MIN(column_name) FROM table_name WHERE conditions;

查询数学是最高分和最低分

MariaDB [test_db]> select max(math) from student_scores;
+-----------+
| max(math) |
+-----------+
|        95 |
+-----------+
1 row in set (0.00 sec)

MariaDB [test_db]> select min(math) from student_scores;
+-----------+
| min(math) |
+-----------+
|        78 |
+-----------+
1 row in set (0.00 sec)

group by 子句

简介

上面我们使用聚合函数后的结果都只有一行,这是因为我们把整个表看成了一个整体,把一列中的所有行直接聚合成了一个数字。

GROUP BY 是用于对结果集进行分组的子句。使用 GROUP BY 可以根据一个或多个列对结果集进行分组,以便在结果中显示每个组的汇总信息。

以下是 GROUP BY 子句的基本语法:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE conditions
GROUP BY column_name;

column_name 是要分组的列的名称

aggregate_function 是要应用于分组的列的聚合函数,例如 SUMAVGCOUNT

table_name 是要从中选择数据的表的名称

conditions 是一个可选的 WHERE 子句,用于指定选择数据的条件。


示例:scott 数据库

接下来的示例我们使用 scott 数据库,scott 是由 Oracle 公司创建的一个示例数据库,用于教学和测试。

scott 数据库的 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);

单列分组

查询每个部门的平均工资和最高工资

从 emp 表中找,然后对 deptno 分组,分别求平均工资和最高工资

select deptno 部门编号, avg(sal) 平均工资, max(sal) 最高工资
from emp
group by deptno;
+--------------+--------------+--------------+
| 部门编号     | 平均工资     | 最高工资     |
+--------------+--------------+--------------+
|           10 |  2916.666667 |      5000.00 |
|           20 |  2175.000000 |      3000.00 |
|           30 |  1566.666667 |      2850.00 |
+--------------+--------------+--------------+
3 rows in set (0.00 sec)

上述示例,group by 会先将表按部门分组,然后对分出的每个组,分别执行 select 语句。

多列分组

查询每个部门的每种岗位的平均工资和最低工资

select deptno, job, avg(sal) 平均工资, min(sal) 最低工资
from emp
group by deptno, job;
+--------+-----------+--------------+--------------+
| 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)

上述用例先按部门分组,然后对每组再按岗位分组,对每个小组执行 select 语句。

下图展示分组的过程:

img

having 子句

查询平均工资低于 2000 的部门及其平均工资

错误写法:

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

where 的执行在 group 之前,执行 where 的时候还没分组呐,根本无法求平均值和筛选。

我们知道,having 筛选在 group by 之后,正确的应该用 having

select deptno, avg(sal)
from emp
group by deptno
having avg(sal) < 2000;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     30 | 1566.666667 |
+--------+-------------+

总结

  1. group by 是通过分组,为聚合统计提供基本的功能支持,即,group by 一定是配合聚合函数使用的
  2. group by 后面跟的是分组的字段依据,只有在 group by 后面出现的字段,才能在 select 中作为字段出现
  3. having 通常是在完成分组聚合统计,然后再进行筛选。where 通常是对表中数据进行初步筛选,where 后面不能跟聚合函数。

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

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

相关文章

图扑数字孪生工厂合集 | 智慧工厂可视化,推动行业数字化转型

前言 图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#…

LeetCode算法小抄--花式遍历二叉树

LeetCode算法小抄--花式遍历二叉树花式遍历二叉树翻转二叉树[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)填充节点的右侧指针[116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)将…

OpenCV实例(一)人脸检测

OpenCV实例&#xff08;一&#xff09;人脸检测 1.人脸检测和识别概述2.使用OpenCV进行人脸检测2.1静态图像中的人脸检测2.2视频中的人脸检测 作者&#xff1a;Xiou 1.人脸检测和识别概述 计算机视觉使很多任务成为现实&#xff0c;其中两项任务就是人脸检测&#xff08;在图…

psql Centos7安装postgresql-12

之前在centos7上下的postgresql&#xff0c;它的数据库实例在 “var/lib/pgsql/” 下。这就导致了系统用户的"postgres"的家目录跟postgresql数据库目录不在同一目录下。因此&#xff0c;今天趁着有闲暇时间把数据库装到"postgres"目录下&#xff0c;顺便把…

罗丹明荧光染料标记叶酸,FA-PEG2000-RB,叶酸-聚乙二醇-罗丹明; Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称&#xff1a;叶酸-聚乙二醇-罗丹明 英文名称&#xff1a;FA-PEG-RB, Folic acid-PEG-RB 性状&#xff1a;粉红色固体或液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DMSO、DMF等常规性有机溶剂 保存条件&#xff1a;-2…

学习系统编程No.17【vscode实战】

引言&#xff1a; 北京时间&#xff1a;2023/4/11/7:25&#xff0c;昨天11点洗澡&#xff0c;洗完直接睡&#xff0c;导致现在头发愈发不能看&#xff0c;So&#xff0c;平头时刻将要来临&#xff0c;头发太长真的很不方便&#xff0c;昨天已经更文啦&#xff01;这个星期一定…

miss_01(简单密码学及音频隐写)

下载附件&#xff0c;解压时提示输入密码 使用010editor打开&#xff0c;发现deFlags值被修改 &#xff08;如果frFlags 或者 deFlags 的值不为0就会导致zip的伪加密&#xff09; 将deFlags的值修改为0&#xff0c;并将文件另存为1.zip 再次打开&#xff0c;没有密码提示了 打…

酒吧攻略:一文解读酒吧类型

目前主流酒吧类型可以大致分为以下几类&#xff1a; 夜店&#xff1a;&#xff08;NIGHT CLUB&#xff09;&#xff1a;KTV&#xff0c;夜总会&#xff0c;酒吧等总称club&#xff0c;主要指的就是夜店。 Bar&#xff1a;多指娱乐休闲类的酒吧&#xff0c;提供现场的乐队或歌…

UG导出点集坐标到txt文本文档中

文章目录 前言一、下载文件二、使用步骤1.运行Grip程序2.选择下载的points-file.grx文件3.选择要导出的文本文档的位置4.选择想要导出的点集5.查看文件 参考 前言 将UG中的离散的点或者点集坐标导出到文本文档&#xff1b; 原文地址 俩文件链接如下&#xff0c;失效了可以私信…

客快物流大数据项目(一百一十四):负载均衡 Spring Cloud Ribbon

文章目录 负载均衡 Spring Cloud Ribbon 一、Ribbon 简介 二、负载均衡源码跟踪探究 负载均衡 Spring Cloud Ribbon 为了增加服务并发访问量,我们搭建集群,集群的负载均衡怎么实现?

OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

Rate limits 速率并发限制前言Introduction 导言What are rate limits? 什么是速率限制&#xff1f;Why do we have rate limits? 为什么我们有速率限制&#xff1f;What are the rate limits for our API? 我们API的速率限制是什么&#xff1f;GPT-4 rate limits GPT-4速率…

【JavaEE】Spring + IoC + DI

目录 Spring概念 IoC DI Spring概念 Spring是包含众多工具方法的IoC容器。 IoC IoC&#xff1a;Inversion of Control 控制权反转 它是一种思想&#xff0c;是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦。 比如当一个对象要使用另一个对象时&#xff0c;不再…

IO流相关知识

IO流 1.文件 保存数据的地方 2.文件流 文件在程序中以流的形式来操作的 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间的经历的路程 输入流&#xff1a;数据从数据源&#xff08;文件&#xff09;到程序&#xff08;内存…

【FPGA-DSP】第五期:FFT调用流程

目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理 拓&#xff1a;输入信号位数改变 本章节主要说明如何在system generator中使用fft模块&#xff0c;话不多说&#xff0c;看操作&#xff1a; 参考教程第5期 - FFT调用流…

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言&#xff1a; 本文主要介绍了如何使用Python VTK高亮显示actor&#xff0c;使用Python语言&#xff0c;高亮显示选中的actor。当窗口中的圆球actor被选中时&#xff0c;会变成红色&#xff0c;并且会显示actor三遍面片边缘信息。 效果&#xff1a; VTK VTK&#xff0c;&…

Linux常见实用操作汇总(带示例版)

Linux常见实用操作汇总 1、各类快捷键1.1 强制停止1.2 退出、登出1.3 历史命令搜索1.4 光标移动1.5 清屏 2、软件安装2.1 在CentOS系统中&#xff0c;使用yum命令联网管理软件安装2.2 在Ubuntu系统中&#xff0c;使用apt命令联网管理软件安装。 3、systemctl4、软连接5、日期和…

Golang每日一练(leetDay0036) 二叉树专题(5)

目录 106. 从中序与后序遍历序列构造二叉树 Construct-binary-tree-from-inorder-and-postorder-traversal &#x1f31f;&#x1f31f; 107. 二叉树的层序遍历 II Binary Tree Level-order Traversal II &#x1f31f;&#x1f31f; 108. 将有序数组转换为二叉搜索树 C…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件&#xff0c;拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx&#xff0c;则需查看自己的Nginx是否开启了SSL的模块功能&#xff1a; ./nginx -V 显…

多媒体信息发布系统解决方案

1.系统概述 多媒体信息发布系统主要是一个用于发布各种信息的平台&#xff0c;包括文字、图片、音频和视频等多种形式的信息。该系统旨在满足用户的信息需求&#xff0c;为信息发布者提供一个高效、安全、可靠的信息发布平台。 2.系统模块 &#xff08;1&#xff09;用户管理…

爬虫攻守道 - 猿人学第20题 - 殊途同归

写在开头 这题也是&#xff0c;自己搞顶多追踪到wasm代码&#xff0c;然后就走不下去了。找了2个参考方案&#xff0c;自己做的过程中还又遇到些新的问题&#xff0c;下面做个记录。解法1参考文章解法2参考文章 解法1&#xff1a;追根溯源 在 JS 代码中追踪到 Payload 赋值位…