MySQL —— 聚合查询,分组查询 与 联合查询

聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

函数说明
count()统计数据总数
sum()求和
avg()求平均值
max()求最大值
min()求最小值

注意凡是涉及运算的,数据库会自动掉 NULL 值
注意NULL 是不参与比较 max 与 min 的

解析:

以此表为例
在这里插入图片描述


count()

count(),会统计数据总数

使用 count(*) 会查询一共有多少条数据行
在这里插入图片描述

使用 count(列名),会统计该列有多少行数据
在这里插入图片描述

如果列中有NULL 值,则不会被统计在内
在这里插入图片描述

建议使用 count(*) 来统计数据行,这是SQL 标准提出的。


sum()

如果运算中有NULL 值会自动过滤NULL,因为NULL 经过运算后为 NULL这个数据是没有意义的,所以数据库的开发者们进行了这样的运算设计。
在这里插入图片描述

如果运算遇到非数字型数据,则无法进行运算,会报警告:
在这里插入图片描述

注意可以使用表达式,但是如果想分别求每一列的总分还是要分开写的。
在这里插入图片描述


avg()

在这里插入图片描述


max() 与 min()

在这里插入图片描述

注意NULL 是不参与比较的
在这里插入图片描述

实践

1.统计班级共有多少同学

select count(name) from exam;

2.统计班级收集的 math 数学成绩数据 有多少个

select count(math) from exam;

3.统计数学成绩总分

select sum(math) from exam;

4.统计所有数学成绩不及格 (< 60) 的同学的数学总分

select sum(math) from exam where math < 60;

5.统计三科的平均总分

select avg(chinese + math + english) 三科平均分 from exam;

6.返回英语最高分

select max(english) from exam;

7.返回 > 70 分以上的数学最低分

select min(math) from exam where math > 70;

分组查询

group by

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

select column1, sum(column2), .. from table group by column1,column3;

演示表:
在这里插入图片描述

计算每种职位的平均工资:
在这里插入图片描述

这里的执行顺序是先分组再计算。


拓展 round

可以使用 round(数值,小数点后的位数) 来指定数值的形式:
group by 后面可以跟 order by 子句

在这里插入图片描述
练习:
查询每个角色的最高工资、最低工资和平均工资

select role 职位, max(salary) 最高工资, min(salary) 最低工资 from emp group by 职位;

在这里插入图片描述

having

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用
HAVING

where 是对表中每一行的真实数据进行过滤的
having 是在 group by 之后,对计算结果进行过滤的。
所以两个执行顺序是不一样的,having 可以使用别名来过滤

演示:
显示平均工资低于1500的角色和它的平均工资

select role 职位, avg(salary) 平均工资 from emp group by 职位 having 平均工资 < 1500;

在这里插入图片描述

联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
在这里插入图片描述

笛卡尔积实际上就是对数据进行全排列,举个例子,有两张表,其中一张表的一条数据要和另一张表的所有的数据进行组合:
在这里插入图片描述


我们也可以通过 SQL 代码来查看笛卡尔积:select * from table_name1, table_name2;
![在这在这里插入图片描述

通过观察我们得知上面全排列的数据不全是正确的,那我们如果过滤掉这些无效的数据,从而获取正确的数据?
请看下面揭晓


内连接

语法格式:select 字段 from 表1 别名1, 表2 别名2 where 条件; 或者 select 字段 from 表1 别名1 [inner] join 表2 别名2 on 条件;

两个表之间存在主外键关系的话,只需要判断这两个表中主外键字段是否相同即可。

查询列表的字段 可以使用 表名.列名

我们可以通过给表名取字段的方式来减少我们的书写量。

演示:

select s.student_id, s.sn, s.name, s.mail, c.name from student s, class c where s.class_id = c.class_id;

在这里插入图片描述


select s.student_id, s.sn, s.name, s.mail, c.name from student s inner join class c on s.class_id = c.class_id;

在这里插入图片描述


在这里插入图片描述

当你给表取了别名之后,那就将表名的地方全部替换成别名,否则 where 子句会识别不出。


联合查询的步骤:
首先确定查询中涉及哪些表,然后对这些表取笛卡尔积,再确定连接条件与过滤条件,最后简化语句(使用别名)

实践:

查询白素贞的成绩:

首先确定需要哪些表:学生表和成绩表,取笛卡尔积:
在这里插入图片描述
然后确定连接条件:student_id 是相同的

确定过滤条件:姓名是白素贞

简化 sql 语句,将student 取 stu , score 取 sco

select stu.name, sco.score from student stu, score sco where name = '白素贞' and stu.student_id = sco.student_id;
select stu.name, sco.score from student stu join score sco on name = '白素贞' and stu.student_id = sco.student_id;

在这里插入图片描述


查询所有同学的总成绩,及同学的个人信息:

首先确定需要什么表:学生表,成绩表;然后取笛卡尔积:
在这里插入图片描述

然后确定连接条件与过滤条件:首先是由于需要的是总成绩,所以要使用聚合函数 sum(),那么就要使用到 分组查询 group by 子句,接着成绩表和学生表的连接是 student_id 要相同

这里要注意分组的依据,我们是对成绩表进行分组的,成绩表有学生的 id 和 成绩,那就应该是要按学生的 id 作为分组的依据。

最后简化 sql 语句 将student 取 stu , score 取 sco

select stu.name, stu.mail, sum(sco.score) from student stu, score sco where stu.student_id = sco.student_id group by sco.student_id;

在这里插入图片描述


查询所有同学的总成绩,及同学的个人信息 以及 学生所在的班级信息:

首先确定要几张表:学生表,班级表 以及 成绩表,然后取笛卡尔积:
在这里插入图片描述
然后确定连接条件与过滤条件:学生表和班级表的联系是 class_id 相同,学生表和成绩表的联系是 student_id 相同,总成绩就和上面的方式一样使用 sum() 通过 student_id 来进行分组。

然后简化 sql 语句:

select stu.sn 学号, stu.name 姓名, stu.mail 邮箱, sum(sco.score) 总成绩, c.name from student stu, score sco, class c where stu.student_id = sco.student_id and stu.class_id
= c.class_id group by sco.student_id;

在这里插入图片描述

外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示就是左外连接右侧的表完全显示就是右外连接

语法:左外连接: select 字段名 from 表名1 left join 表名2 on 连接条件;右外连接: select 字段 from 表名1 right join 表名2 on 连接条件;

大家来看一下下面两张表,你会发现 3班 是没有学生的。
在这里插入图片描述
在这里插入图片描述

现在我们基于上述的式子,演示左外连接:select * from class c left join student s on c.class_id = s.class_id;
在这里插入图片描述
即使 3 班是没有同学的,但是3班这个字段还是会显示出来,只是对应的学生列表为空。


现在我们插入一个没有班级的学生数据:
在这里插入图片描述

然后我们来演示右外连接:select * from class c right join student s on c.class_id = s.class_id; 这里会将 student 表全部显示,即使有学生没有班级这个数据。

在这里插入图片描述

进行外连接如果遇到没有数据的时候,数据库会使用 NULL 填充。

自连接

自连接是指在同一张表连接自身进行查询。

语法:select * from 表名1 别名1, 表名1 别名2;

注意一定要起别名,不然MySQL 无法识别:
在这里插入图片描述

一般自连接会用在自己要和自己比较的时候

演示:
查询哪些学生的 Java 成绩 比 计算机原理要低:可以先查出Java 和 计算机原理的 course_id
select * from score s1, score s2 where s1.course_id = 1 and s2.course_id = 3 and s1.score < s2.score;

在这里插入图片描述

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询:
基本语法:select * from table_name where 列名 = (select 列名 from table_name where 条件);

查询与“白素贞” 同学的同班同学:select * from student where class_id = (select class_id from student where name = '白素贞');

在这里插入图片描述


多行子查询:

[NOT] IN

in 之前提到过就是在不在 in 括号的字段范围内
语法:select * from table_name1 where 列名 [not] in (select * from table_name2);

举例:查询 Java 和 计算机的成绩
select * from score where course_id in (select course_id from course where name = 'Java' or name = '计算机原理');

在这里插入图片描述

[NOT] EXISTS

exists 表示存在,如果 exists 后面括号中的查询语句,如果返回的是空结果集,那就类似flase ,不会执行外层的查询,如果返回的是 true ,就会执行外层的查询。

语法:select * from table_name where [not] exists (select * from table_name);

注意如果集合是 select null; 集合不为空(empty),只是集合内容是 null
在这里插入图片描述

演示:
在这里插入图片描述

合并查询

合并查询可以将多个结果集合并

使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致

union 【会去重】

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

union all 【不会去重】

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

查询id小于3,或者名字为“英文”的课程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在单表查询时,推荐使用 or, 多表查询时可以使用 union 或者 union all

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

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

相关文章

本地安Stable Diffusion全记录

这里写自定义目录标题 资料 资料 AI绘图软件Stable Diffusion 之本地安装 手把手教你在本机安装Stable Diffusion秋叶整合包 让 stable diffusion 局域网访问&#xff1a;详细解析配置步骤【Stable Diffusion 实战教程】 局域网多设备访问stable diffusion Stable Diffusion 老…

Lua语言基础学习:安装Lua和Lua库管理工具

Lua语言简介 Lua是一种轻量、高效、可嵌入的脚本语言&#xff0c;由巴西里约热内卢天主教大学的研究小组于1993年开发&#xff0c;Lua的解释器非常小巧&#xff0c;编译后的体积很小&#xff08;如完整解释器不过200KB&#xff09;&#xff0c;这使得它非常适合嵌入到其他应用程…

谷粒商城实战笔记-126-全文检索-ElasticSearch-整合-测试保存

文章目录 一&#xff0c;谷粒商城实战笔记-126-全文检索-ElasticSearch-整合-测试保存1&#xff0c;在Elasticsearch的配置类中增加通用设置2&#xff0c;索引数据3&#xff0c;验证 一&#xff0c;谷粒商城实战笔记-126-全文检索-ElasticSearch-整合-测试保存 1&#xff0c;在…

汇编语言基础及常见汇编指令

一、实验原理 x64dbg 是一款开源且免费的 Ring 3 级动态调试器&#xff0c;采用 QT 编写&#xff0c;支持 32 / 64 位程序。其反汇编引擎 BeaEngine 和 Capstone 功能极其强大&#xff0c;也有丰富的插件和脚本功能&#xff0c;且并保持更新&#xff0c;目前已经基本替代了 Ol…

数字医学影像系统PACS源码,三甲以下医院都能满足,C#语言开发,C/S架构系统成熟稳定,支持二次开发项目使用。

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 PACS系统模块组成 &#xff1a; 工作站&#xff1a; 分诊工作站、超声工作站、放…

学习鸿蒙-应用市场申请签名

1.需要的文件概念 .cer / .p7b / .p12 / .csr HarmonyOS应用/服务通过数字证书&#xff08;.cer文件&#xff09;和Profile文件&#xff08;.p7b文件&#xff09;来保证应用/服务的完整性。在申请数字证书和Profile文件前&#xff0c;首先需要通过DevEco Studio来生成密钥&am…

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04&#xff0c;并已配置好ipv6公网地址&#xff0c;已安装好docker和docker-compose。一块单独的硬盘&#xff0c;用于单独存储nextcloud数据。&#xff08;非必需&#xff09;有一个能够正常解析的域名&#xff0c;并已配置好AAAA记录解析。…

【Linux学习】动静态库从原理到制作

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;动静态库&#x1f41f;动静态库的制作与使用&#x1f680;生成静态库&#x1f512;生成动态库 &#x1f98c;动态库的查…

Maven下载、配置以及IDEA配置Maven新建Maven项目(超详细版)

Maven下载配置&#xff1a; 一、下载apache-maven-3.5.2并解压 二、创建一个本地仓库 三、在解压文件中的conf文件夹中的settings.xml文件中配置本地仓库 四、环境变量配置 1.此电脑(右击)------->属性------->高级系统设置------->环境变量 2.新建MAVEN_HOME&…

IP实现https访问的教程

IP地址实现HTTPS地址访问&#xff0c;首先要获得浏览器可信的SSL证书&#xff0c;并且该SSL证书是操作系统默认根证书信任证书。那有的人问&#xff1a;“内网的IP地址可以吗&#xff1f;答案是肯定不可以的”内网的IP地址只能用自建发的SSL证书实现HTTPS&#xff0c;不会被浏览…

数据结构——栈(Stack)

目录 前言 一、栈的概念 1、栈的基本定义 2、栈的特性 二、栈的基本操作 1.相关操作概念 2.实现方式 &#xff08;1&#xff09;顺序栈 &#xff08;2&#xff09;链式栈 三、栈的应用 总结 前言 栈&#xff08;Stack&#xff09;是一种常见且重要的数据结构&#xff0c;它遵循…

“tcp控制协议”的理解

情景解释&#xff1a; 1.过程&#xff1a; 在用户进行网络间通信时&#xff0c;不管是客户端还是服务端&#xff0c;都会有两个缓冲区——发送缓冲区和接受缓冲区。 通过4个缓冲区进行数据交流。 用户通过write()将数据发送到他的发送缓冲区中&#xff0c;再传输到服务端的…

C# Winform 多窗体切换方式一

一、简介 在 Winform 开发中&#xff0c;多窗体的切换是一个常见的需求&#xff0c;比如登录成功后&#xff0c;切换至主界面&#xff0c;在网上查阅相关的资料&#xff0c;你会发现很多都是用 form2.Show(); this.Hide(); 这种方式&#xff0c;这种方式也存在一些问题&#…

【学习笔记】Day 9

一、进度概述 1、inversionnet_train 试运行——成功 二、详情 1、inversionnet_train 试运行 在经历了昨天的事故后&#xff0c;今天最终成功运行了 inversionnet_train&#xff0c;运行结果如下&#xff1a; 经观察&#xff0c;最开始 loss 值大概为 0.5 左右 随着训练量的增…

ECR绕过技巧

一、预编译与sql注入 预编译SQL有两个优势&#xff1a; 1、性能更高&#xff1a;预编译SQL&#xff0c;编译一次之后会将编译后的SQL语句缓存起来&#xff0c;后面再次执行这条语句时&#xff0c;不会再次编译。&#xff08;只是输入的参数不同&#xff09;。 2、更安全(防止S…

漏洞复现-Apache Struts2 文件上传漏洞(CVE-2023-50164)

1.漏洞描述 Apache Struts2 是一个开源的 Java Web 应用程序开发框架&#xff0c;旨在帮助开发人员构建灵活、可维护和可扩展的企业级Web应用程序。 由于文件上传逻辑存在缺陷&#xff0c;攻击者可以操纵文件上传参数来实现路径穿越&#xff0c;在某些情况下&#xff0c;通过…

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…

ISP代理与双ISP代理的区别

在网络营销、数据采集及隐私保护等领域&#xff0c;代理服务器扮演着至关重要的角色。而在代理服务器的选择中&#xff0c;ISP代理与双ISP代理是两种常见的选择。本文将对这两种代理服务进行详细分析&#xff0c;探讨它们之间的区别以及各自的优势和适用场景。 一、ISP代理概述…

代码规范 —— QMQ 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、代码规范 【1】消费者必须以Consumer结尾&#xff0c;生产者必须以Producer结尾。 【2】选择合适的消费模式&#xff1a;根据业务判断消费模式是集群模式还是广播模式&#xff0c;具体为&#xff1a;MessageConsumerProvider.addListene…

Win系统下使用Docker安装RabbitMQ及延迟插件

Win系统下使用Docker安装RabbitMQ及延迟插件 docker 安装 rabbitmq docker pull rabbitmq:3.12.0-management运行 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 访问 访问 http://localhost:15672/&#xff0c;…