当前位置: 首页 > news >正文

【MySQL】聚合查询

目录

1、前言

2、插入查询结果

3、聚合查询

3.1 聚合函数

3.1.1 count 

3.1.2 sum

3.1.3 avg 

3.1.4 max 和 min

4、GROUP BY 子句

5、HAVING 关键字


1、前言

前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始往后的内容,就更加复杂了,更多的是一些复杂的查询 SQL.

本期虽然是讲述聚合查询相关知识,但是这里补充一个知识点,如何将查询结果插入到另一个表中呢?

2、插入查询结果

查询还是用的比较多的,对于查询到的数据,能不能也给保存下来呢?也就是把查询的结果插入到另一张表中。

案例:创建一张学生表,表中有 id,name,sex,java,python 这些字段,现需要把 java 成绩超过 90 的学生复制进 java_result 表,复制的字段为 name,java。

进行上述操作之前,我们需要创建一个学生表并准备好相关的数据:

create table student (id int primary key,name varchar(20),sex varchar(1),java float(5, 2)
);
insert into student value (1, '张三', '男', 92.1),(2, '小红', '女', 88.2),(3, '赵六', '男', 83.4),(4, '王五', '男', 93.3),(5, '小美', '女', 96.0);

有了学生表之后,我们要把 name,java 这两个字段的查询结果复制到 java_result 这个表中,这里我们注意,要求查询结果的临时表的列数和列的类型,要和 java_result 这里匹配,所以接下来我们就来创建 java_result 这张表:

create table java_result (name varchar(20),java float(5, 2)
);

创建好 java_result 这张表之后,就要查询 student 表中 name java 两个字段,并且 java > 90,将满足上述条件的查询结果,插入到 java_result 表中!:

insert into java_result select name, java from student where java > 90;
-- Query OK, 3 rows affected (0.00 sec)
-- Records: 3  Duplicates: 0  Warnings: 0
select * from java_result;
+--------+-------+
| name   | java  |
+--------+-------+
| 张三   | 92.10 |
| 王五   | 93.30 |
| 小美   | 96.00 |
+--------+-------+
-- 3 rows in set (0.00 sec)

这样我们就发现,已经将 student 表中 name 和 java 字段满足 > 90 的数据已经全部插入成功了!


3、聚合查询

前面我们接触过的 带表达式查询 都是列和列之间进行运算的,看哪一列满足了这个条件。

而现在要介绍的聚合查询,就是针对 行和行 之间进行运算的! 

3.1 聚合函数

进行聚合查询,需要搭配聚合函数,下面介绍的函数都是 SQL 中内置的一组函数,我们先来简单的认识下:

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

下面我们就来演示一下上述的聚合函数的简单使用,在使用之前,我们需要有一张表,并且有相应的数据:

select * from student;
+----+--------+------+-------+
| id | name   | sex  | java  |
+----+--------+------+-------+
|  1 | 张三   | 男   | 92.10 |
|  2 | 小红   | 女   | 88.20 |
|  3 | 赵六   | 男   | 83.40 |
|  4 | 王五   | 男   | 93.30 |
|  5 | 小美   | 女   | 96.00 |
|  6 | 李四   | 男   |  NULL |
+----+--------+------+-------+
-- 6 rows in set (0.00 sec)

下面我们就针对上述这张表,来使用下上述的聚合函数。 

3.1.1 count 

● 求出 student 表中有多少同学

select count(*) from student;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
-- 1 row in set (0.00 sec)

这个操作就相当于先进行 select * ,然后针对返回的结果,在进行 count 运算,求结果集合的行数. 注意:此处如果有一列的数据全是 null,也会算进去!(因为是针对 *)

此处这里的 count() 括号中,不一定写 *,可以写成任意的列明/表达式,所以我们可以针对 name 来统计人数:

select count(name) from student;
+-------------+
| count(name) |
+-------------+
|           6 |
+-------------+
-- 1 row in set (0.00 sec)

 ● 统计有多少人有 java 考试成绩

select count(java) from student;
+-------------+
| count(java) |
+-------------+
|           5 |
+-------------+
-- 1 row in set (0.00 sec)

这里我们看到了,由于 count 是针对 java 字段进行统计,而 李四 那一条数据中,java 为 null,前面我们学习过,null 与任何值计算都是 null,所以统计的时候,就把 null 给去掉了。

● 统计 java 成绩大于90分的人数

select count(java) from student where java > 90;
+-------------+
| count(java) |
+-------------+
|           3 |
+-------------+
-- 1 row in set (0.00 sec)

这里我们要弄清楚,count() 这个括号中,是针对你要针对的那一列,针对不同列,不同的条件,就会有不同的结果,对于 count 的演示就到这里。

注意:count 和 () 之间不能有空格,必须紧挨着,在 Java 中函数名和() 之间是可以有空格的,但很少人会这样写。

3.1.2 sum

这个聚合函数,就是把指定列的所有行进行相加得到的结果,要求这个列得是数字,不能是字符串/日期。

● 求出学生表中 java 考试分数总和

select sum(java) from student;
+-----------+
| sum(java) |
+-----------+
|    453.00 |
+-----------+
-- 1 row in set (0.01 sec)

虽然我们表中有 java 字段这列中有 null 值,前面了解到 null 与任何值运算都是 null,但是这里的 sum 函数会避免这种情况发生。

当然在后面也可也带上 where 条件,这里就不做过多演示了。

3.1.3 avg 

● 求班级中 java 的平均分

select avg(java) from student;
+-----------+
| avg(java) |
+-----------+
| 90.600000 |
+-----------+
-- 1 row in set (0.00 sec)

当前只是针对某一列进行平均运算,如果有两门课程,求每个学生总分的平均分呢?

select avg(java + python) from student;

这里每次查询结果都只有一列,能否把两个聚合函数一起使用呢?

select sum(java), avg(java) as '平均分' from student;
+-----------+-----------+
| sum(java) | 平均分    |
+-----------+-----------+
|    453.00 | 90.600000 |
+-----------+-----------+
-- 1 row in set (0.00 sec)

这里我们能发现一个细节,使用聚合函数查询,字段也是可以取别名的。

3.1.4 max 和 min

● 求出 java 考试分数的最高分和最低分

select max(java) as '最高分', min(java) as '最低分' from student;
+-----------+-----------+
| 最高分    | 最低分    |
+-----------+-----------+
|     96.00 |     83.40 |
+-----------+-----------+
-- 1 row in set (0.00 sec)

上述就是聚合函数最基础的用法了, 但是在实际中也可能会有更复杂的情况,比如需要按照某某进行分组查询,这就需要搭配 GROUP BY 字句了。


4、GROUP BY 子句

select 中使用 group by 自居可以对指定列进行分组查询,但是需要满足指定分组的字段必须是 "分组依据字段",其他字段若想出现在 select 中,则必须包含在聚合函数中。

这里我们构造出一张薪水表 salary:

create table salary (id int primary key,name varchar(20),role varchar(20),income int 
);
insert into salary value (1, '麻花疼', '老板', 5000000),(2, '篮球哥', '程序猿', 3000),(3, '歪嘴猴', '经理', 20000),(4, '多嘴鸟', '经理', 25000),(5, '雷小君', '老板', 3000000),(6, '阿紫姐', '程序猿', 5000);

像上述的情况,如果要查平均工资,那公平吗???

select avg(income) from salary;
+--------------+
| avg(income)  |
+--------------+
| 1342166.6667 |
+--------------+
-- 1 row in set (0.00 sec)

那篮球哥的月薪连平均下来的零头都不到,所以这样去求平均工资是毫无意义的,真正有意义的是啥呢?求老板这个职位的平均工资,以及经理这个职位的平均工资,及程序猿这个职位的平均工资,通俗来说,就是按照 role 这个字段进行分组。每一组求平均工资:

select role, avg(income) from salary group by role;
+-----------+--------------+
| role      | avg(income)  |
+-----------+--------------+
| 程序猿    |    4000.0000 |
| 经理      |   22500.0000 |
| 老板      | 4000000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)

这就也就是把 role 这一列,值相同的行给分成了一组,然后计算平均值,也是针对每个分组,分别计算。

在 MySQL 中,这里得到的查询结果临时表,如果没有 order by 指定列排序,这里的顺序是不可预期的,当然也可以手动指定排序,比如最终结果按照平均工资降序排序:

select role, avg(income) from salary group by role order by avg(income) desc;
+-----------+--------------+
| role      | avg(income)  |
+-----------+--------------+
| 老板      | 4000000.0000 |
| 经理      |   22500.0000 |
| 程序猿    |    4000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)

如果不带聚合函数的普通查询,能否可行呢?这里如果你没有修改任何配置文件,是不可行的,记住千万不能把前面的 order by 与 group by 弄混!


5、HAVING 关键字

分组查询也是可以指定条件的,具体三种情况:

  • 先筛选,再分组(where)
  • 先分组,再筛选(having)
  • 分组前分组后都指定条件筛选(where 和 having 结合使用)

如何理解上述三条的含义呢? 这里我们举几个例子就很好理解了:

● 篮球哥月薪 3000 实在是太低了,简直给程序猿岗位拖后腿,干脆求平均工资时去掉篮球哥的月薪数据。

select role, avg(income) from salary where name != '篮球哥' group by role;
+-----------+--------------+
| role      | avg(income)  |
+-----------+--------------+
| 程序猿    |    5000.0000 |
| 经理      |   22500.0000 |
| 老板      | 4000000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)

这样求出来的平均值就不包含篮球哥的月薪数据了,这就是先筛选,再分组。

● 还是查询每个岗位的平均工资,但是除去平均月薪在 10w 以上的岗位,不能让篮球哥眼红!

select role, avg(income) from salary group by role having avg(income) < 100000;
+-----------+-------------+
| role      | avg(income) |
+-----------+-------------+
| 程序猿    |   4000.0000 |
| 经理      |  22500.0000 |
+-----------+-------------+
-- 2 rows in set (0.00 sec)

这样一来就只保留了平均月薪小于 10w 的岗位了,很明显这个平均值是在分组之后才算出来的,这也就是先分组,再筛选。

这里 having 也能加上逻辑运算符,具体感兴趣的小伙伴可以自行下来尝试一下,好比如你想要拿好 offer,就得技术过关,还能加班!

至于第三种分组前后都需要筛选,就是把上述俩例子结合起来,这里就不多赘述了!


【MySQL】联合查询

相关文章:

【MySQL】聚合查询

目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了&#xff0c;也介绍了表的相关约束&#xff0c; 从本期开始…...

初时STM32单片机

目录 一、单片机基本认知 二、STM系列单片机命名规则 三、标准库与HAL库区别 四、通用输入输出端口GPIO 五、推挽输出与开漏输出 六、复位和时钟控制&#xff08;RCC&#xff09; 七、时钟控制 八、中断和事件 九、定时器介绍 一、单片机基本认知 单片机和PC电脑相比…...

debian部署docker(傻瓜式)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 debian10部署dockerdebian10部署docker&#xff08;傻瓜式&#xff09;一、准备工作二、**使用 APT 安装&#xff0c;注意要先配置apt网络源**1.配置网络源2.官方下载三、安装…...

JS判断是否为base64字符串如何转换为图片src格式

需求背景 &#xff1a; 如何判断后端给返回的 字符串 是否为 base-64 位 呢 &#xff1f; 以及如果判断为是的话&#xff0c;如何给它进行转换为 img 标签可使用的那种 src 格式 呢 &#xff1f; 1、判断字符串是否为 base64 以下方法&#xff0c;可自行挨个试试&#xff0c;…...

【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 向域对象共享数据一、使用 原生ServletAPI二、…...

本科课程【移动互联网应用开发(Android开发)】实验3 - Activity及数据存储

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...

为何在 node 项目中使用固定版本号,而不使用 ~、^?

以语雀 文档为准 使用 ~、^ 时吃过亏希望版本号掌握在自己手里&#xff0c;作者自己升级&#xff08;跟随官方进行升级&#xff0c;就算麻烦作者&#xff0c;也不想麻烦使用者&#xff09;虽然 pnpm 很好用&#xff0c;但是不希望在项目中用到&#xff08;临时性解决问题可以选…...

leetcode -- 876.链表的中间节点

文章目录&#x1f428;1.题目&#x1f407;2. 解法1-两次遍历&#x1f340;2.1 思路&#x1f340;2.2 代码实现&#x1f401;3. 解法2-快慢指针&#x1f33e;3.1 思路&#x1f33e;3.2 **代码实现**&#x1f42e;4. 题目链接&#x1f428;1.题目 给你单链表的头结点head&#…...

企业网络安全防御策略需要考虑哪些方面?

随着企业数字化转型的加速&#xff0c;企业网络安全面临越来越多的威胁。企业网络安全不仅仅关乎企业数据的安全&#xff0c;还关系到企业的声誉和利益&#xff0c;因此&#xff0c;建立全面的网络安全防御策略至关重要。 企业网络安全防御策略的实现需要考虑以下几个方面&…...

文心一言 vs. GPT-4 —— 全面横向比较

文心一言 vs. GPT-4 —— 全面横向比较 3月15日凌晨&#xff0c;OpenAI发布“迄今为止功能最强大的模型”——GPT-4。我第一时间为大家奉上了体验报告《OpenAI 发布GPT-4——全网抢先体验》。 时隔一日&#xff0c;3月16日下午百度发布大语言模型——文心一言。发布会上&…...

【进阶数据结构】二叉搜索树经典习题讲解

&#x1f308;感谢阅读East-sunrise学习分享——[进阶数据结构]二叉搜索树 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f499;我们一起进步 &#x1f308;我们在之前已经学习…...

PyTorch 之 神经网络 Mnist 分类任务

文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…...

如何实现用pillow库来实现给图片加滤镜?

使用Pillow库可以非常容易地给图片加滤镜。Pillow库是Python图像处理的一个强大库&#xff0c;提供了多种滤镜效果&#xff0c;如模糊、边缘检测、色彩增强等。 下面是使用Pillow库实现给图片加滤镜的简单步骤&#xff1a; 安装Pillow库&#xff1a;首先需要安装Pillow库。可…...

微分中值定理

极值 目录 极值 费马引理 ​编辑 罗尔定理 拉格朗日中值定理 例题&#xff1a; 例2 例3 两个重要结论&#xff1a; ​编辑 柯西中值定理&#xff1a; 如何用自己的语言理解极值呢&#xff1f; 极大值和极小值的类似&#xff0c;我们不再进行说明 极值点有什么特点吗&…...

redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?

文章目录 redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?Java 中 怎么 实现?方案一: Jedis方案二: Lettuce方案三: Redisson方案四: Jedisson方案五: RedisTemplate那种方式 效率最高 ?拓展:结语redis 存储一个map 怎么让map中其中一个值设置过…...

LeetCode:704. 二分查找

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;704. 二分查找 题目描述&#xff1a;给定一个 n 个元素有序的&#xff…...

Java 到底是值传递还是引用传递?

C 语言是很多变成语言的母胎&#xff0c;包括 Java。对于 C 语言来说&#xff0c;所有的方法参数都是通过 “值” 传递的&#xff0c;也就是说&#xff0c;传递给被调用方法的参数值存放在临时变量中&#xff0c;而不是存放在原来的变量中。这就意味着&#xff0c;被调用的方法…...

Apollo 配置变更原理

我们经常用到apollo的两个特性&#xff1a;1.动态更新配置&#xff1a;apollo可以动态更新Value的值&#xff0c;也可以修改environment的值。2.实时监听配置&#xff1a;实现apollo的监听器ConfigChangeListener&#xff0c;通过onChange方法来实时监听配置变化。你知道apollo…...

聊聊「订单」业务的设计与实现

订单&#xff0c;业务的核心模块&#xff1b; 一、背景简介 订单业务一直都是系统研发中的核心模块&#xff0c;订单的产生过程&#xff0c;与系统中的很多模块都会高度关联&#xff0c;比如账户体系、支付中心、运营管理等&#xff0c;即便单看订单本身&#xff0c;也足够的复…...

血细胞智能检测与计数软件(Python+YOLOv5深度学习模型+清新界面版)

摘要&#xff1a;血细胞智能检测与计数软件应用深度学习技术智能检测血细胞图像中红细胞、镰状细胞等不同形态细胞并可视化计数&#xff0c;以辅助医学细胞检测。本文详细介绍血细胞智能检测与计数软件&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码以及Py…...

高速PCB设计指南(十五)

掌握IC封装的特性以达到最佳EMI抑制性能 将去耦电容直接放在IC封装内可以有效控制EMI并提高信号的完整性&#xff0c;本文从IC内部封装入手&#xff0c;分析EMI的来源、IC封装在EMI控制中的作用&#xff0c;进而提出11个有效控制EMI的设计规则&#xff0c;包括封装选择、引脚结…...

GPT-4:我不是来抢你饭碗的,我是来抢你锅的

目录 一、GPT-4&#xff0c;可媲美人类 二、它和ChatGPT 有何差别&#xff1f; 01、处理多达2.5万字的长篇内容 02、分析图像的能力&#xff0c;并具有「幽默感」 03、生成网页 三、题外话 四、小结 GPT-4的闪亮登场&#xff0c;似乎再次惊艳了所有人。 看了GPT-4官方的…...

Scala环境安装【傻瓜式教程】

文章目录安装scala环境依赖Java环境安装下载sacla的sdk包安装Scala2.12检查安装是否成功idea配置idea安装scala插件项目配置新建maven项目添加框架支持选择scala创建测试类安装scala环境依赖 Java环境安装 sacla环境安装之前需要先确认Java jdk安装完成 java具体安装步骤略&…...

js实现一个简单的扫雷

目录先看下最终的效果&#xff1a;首先来分析一个扫雷游戏具有哪些功能分析完成后我们就开始一步步的实现1. 相关html和css2. 我们使用类来完成相应功能3. 之后我们则是要定义一个地图4. 对地图进行渲染5. 对开始按钮添加点击事件6. 现在我们可以实现鼠标左击扫雷的功能7. 给单…...

禁用非必需插件,让 IDEA 飞起

文章首发于个人博客&#xff0c;欢迎访问关注&#xff1a;https://www.lin2j.tech IDEA 为我们提供了众多的插件&#xff0c;但是这些插件并不都是必须的。如果电脑的性能不够强&#xff0c;反而会带来一些不必要的资源消耗。 因此这里整理了一些不常用的插件&#xff0c;可以…...

解决win10任何程序打开链接仍然为老旧IE的顽固问题[修改默认浏览器]

文章目录一、问题与修改原因1、着手修改吧2、弯路上探索3、发现祸根二、后话文章原出处&#xff1a; https://blog.csdn.net/haigear/article/details/129344503一、问题与修改原因 我们发现&#xff0c;很多程序默认的网页打开浏览器都是IE&#xff0c;这个很是郁闷&#xff…...

计算机网络体系结构——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来学习一个全新的知识点&#xff0c;就是计算机网络啦&#xff0c;下面&#xff0c;开始虚心学习。 计算机网络的概念 计算机网络的功能 计算机网络的组成 计算机网络的分类 标准化工作 计算机网络的性能 计算机网络的概念 …...

基于微信小程序的校园二手交易平台小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

Linux lvm管理讲解及命令

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

GPT-4,终于来了!

就在昨天凌晨&#xff0c;OpenAI发布了多模态预训练大模型GPT-4。 这不昨天一觉醒来&#xff0c;GPT-4都快刷屏了&#xff0c;不管是在朋友圈还是网络上都看到了很多信息和文章。 GPT是Generative Pre-trained Transformer的缩写&#xff0c;也即生成型预训练变换模型的意思。…...