期末复习总结【MySQL】聚合查询 + 多表联合查询(重点)

news2024/11/26 17:29:07

文章目录

  • 前言
  • 一、聚合查询
    • 1, 聚合函数
    • 2, 聚合函数使用示例
    • 3, GROUP BY 子句
    • 4, HAVING 子句
  • 二、联合查询(重点)
    • 1, 笛卡尔积
    • 2, 内连接
      • 2.1, 示例1
      • 2.2, 示例2
      • 2.3, 示例3
    • 3, 外连接
    • 4, 自连接
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

从本篇开始介绍 MySQL 数据库的相关知识
在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、聚合查询

1, 聚合函数

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

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

这些聚合函数都是针对多个行的运算


2, 聚合函数使用示例

sql 语句 : select 聚合函数(列名) from 表名

  • 首先准备一张考试成绩表
    在这里插入图片描述
  • 查询表中记录的人数
    在这里插入图片描述
  • 查询表中记录的语文成绩的个数, 只能查到 6 个, 因为慢羊羊的成绩为 null , 不计入查询结果
    在这里插入图片描述
  • 查询全班语文成绩的总和
    在这里插入图片描述

在 MySQL 中, 任何数和 null 做运算的结果还是 null , 但是这里求 sum 计算总和时, 已经把 null 过滤掉了, 所以结果并非为 null

  • 查询语文成绩的平均分
    在这里插入图片描述

  • 参数也可以是表达式, 比如查询全班同学的平均总分
    在这里插入图片描述

  • 查询总分最高的是多少
    在这里插入图片描述

  • 查询总分最低的是多少
    在这里插入图片描述

这些聚合函数能比较方便的实现简单逻辑的运算, 逻辑太过于复杂的 sql 也不是不能写, 但是会导致查询的效率极慢, 建议借助 Java 或其他编程语言来实现


3, GROUP BY 子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。

  • 先准备一张学生表(id, 姓名, 数学成绩, 角色)
    在这里插入图片描述

  • 按照角色进行分组之后, 查询每组的人数
    在这里插入图片描述

  • 按照角色进行分组之后, 查询每组的平均数学成绩
    在这里插入图片描述

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

  • 反例 : 在 select 语句中多加一个id 字段, 虽然可以在临时表中显示出来, 但没有任何意义
    在这里插入图片描述

4, HAVING 子句

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

比如刚刚查询每组的数学平均分时, 不想看到"废物组"的记录, 只想要两组, 这就需要一定的手段把"废物组"过滤掉

在这里插入图片描述

分组前的过滤使用 where , 分组后的过滤使用 having


二、联合查询(重点)

之前所有的查询都是基于一张表进行单表查询, 实际使用 sql 进行查询数据时, 往往是多张表进行多表查询, 联合查询是对多张表的数据取笛卡尔积

当需要查询的关键信息处在多张表时, 就需要把关键信息所在的表联合成一张表再查询

1, 笛卡尔积

对两张表(多张表)的数据进行笛卡尔积运算, 运算的过程就是对这两张表(多张表)每行的数据进行排列组合, 如图 :
在这里插入图片描述

虽然笛卡尔积之后表中的数据很多, 但是包含无效信息, 只有学生表中的 classId 和班级表中的 id 相同时, 该条数据才是有意义的, 所以在进行多表查询时, 首先要对笛卡尔积的结果进行过滤
在这里插入图片描述


2, 内连接

首先创建四张表, 代码如下 :

drop table if exists classes;
drop table if exists student;
drop table if exists course;
drop table if exists score;


create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), classesId int);

create table classes (id int primary key auto_increment, name varchar(20));

create table course(id int primary key auto_increment, name varchar(20));

create table score(score decimal(3, 1), studentId int, courseId int);

insert into classes(name) values
('羊村1班'),
('羊村2班'),
('羊村3班');

insert into student(sn, name, classesId) values
('09982', '喜羊羊', 1),
('00835', '美羊羊', 1),
('00391', '沸羊羊', 1),
('00031', '懒羊羊', 2),
('00054', '暖羊羊', 2),
('51234', '小灰灰', 2),
('83223', '灰太狼', 3),
('09527', '红太狼', 3);

insert into course(name) values
('Java'), ('数据结构'), ('数据库'), ('计算机网络'), ('计算机组成原理'), ('操作系统');

insert into score(score, studentId, courseId) values
-- 喜羊羊
(70.5, 1, 1), (98.5, 1, 3), (33, 1, 5), (98, 1, 6),
-- 美羊羊
(60, 2, 1), (59.5, 2, 5),
-- 沸羊羊
(33, 3, 1), (68, 3, 3), (99, 3, 5),
-- 懒羊羊
(67, 4, 1), (23, 4, 3), (56, 4, 5), (72, 4, 6),
-- 暖羊羊
(81, 5, 1), (37, 5, 5),
-- 小灰灰
(56, 6, 2), (43, 6, 4), (79, 6, 6),
-- 灰太狼
(80, 7, 2), (92, 7, 6),
-- 灰太狼
(28, 8, 2), (32, 8, 6);

在这里插入图片描述
在这里插入图片描述

2.1, 示例1

查询"喜羊羊"的成绩

  • 学生表中有学生信息, 分数表中有成绩信息, 所以用这两张表做笛卡尔积 :
    sql 语句 : select * from 表1, 表2;
    在这里插入图片描述
  • 总共有176条数据, 需要进行过滤, 只有学生表中的 id = 分数表中的 studentId 时, 数据有效, 所以加上 where 条件:
    在这里插入图片描述

建议多表查询时, 使用表名.列名的方式, 因为在不同的表中可能存在相同的列名

  • 加上 where 条件之后 17 6行只剩下了 22 行, 但是我们只需要喜羊羊的成绩, 所以使用 and 再加一个条件, 过滤不需要的数据 :
    在这里插入图片描述
  • 列的信息还比较多, 所以使用指定列查询, 再进一步过滤 :
    在这里插入图片描述

联合查询有两种语法 :
1, select * from 表1, 表2 where 条件;
2, select * from 表1 join 表2 on 条件;
(join 代替逗号, on 代替 where)


2.2, 示例2

查询全班同学的总成绩

还是刚才的四张表 :
在这里插入图片描述
在这里插入图片描述

  • 还是学生表和成绩表做笛卡尔积
    通过学生表的 id 和成绩表的 studentId 进行条件查询, 得到每个同学的成绩信息 :
    在这里插入图片描述
  • 再针对每个同学的成绩进行聚合查询(sum求和)
    别忘了需要加上 group by 子句 :
    在这里插入图片描述

2.3, 示例3

查询同学们的成绩和课程信息

还是刚才的四张表 :
在这里插入图片描述
在这里插入图片描述

  • 同学的成绩和课程信息, 关键信息分别在学生表, 分数表和课程表中, 所以需要三张表进行联合查询, 这就要两个 where 条件让三张表两两关联
    1, 学生表的 id = 成绩表的 studentId
    2, 成绩表的 courseId = 课程表的 id
    在这里插入图片描述

如果这句 sql 不加这两个条件, 查询结果有1000多条记录, 如果每张表的数据都很多, 直接使用联合查询是非常恐怖的

  • 使用指定列查询, 过滤不需要的字段
    在这里插入图片描述
    在这里插入图片描述

3, 外连接

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

当两张表的数据一一对应时, 内连接和外连接没有区别
在这里插入图片描述

接下来按照图中的表结构创建学生表和班级表

create table student(id int primary key auto_increment, name varchar(50), classId int);
create table class(id int primary key auto_increment, name varchar(50));

insert into student values
(1, "喜羊羊", 1),
(2, "美羊羊", 1),
(3, "沸羊羊", 3),
(4, "懒羊羊", 3);

insert into class values
(1, "羊村1班"),
(2, "羊村2班");
  • 使用左外链接对学生表和班级表进行笛卡尔积
    sql 语句 : select * from 表1 left join 表2 on 条件; 表 1 为左表, 表 2 为右表
    在这里插入图片描述

可以看到, 左外连接会以左边的表(学生表)为基准, 显示所有左表的数据, 如果某条数据没有在右表中存在, 显示为NULL

  • 使用右外链接对学生表和班级表进行笛卡尔积
    sql 语句 : select * from 表1 right join 表2 on 条件; 表 1 为左表, 表 2 为右表
    在这里插入图片描述

可以看到, 右外连接会以右边的表(班级表)为基准, 显示所有右表的数据, 如果某条数据没有在左表中存在, 显示为NULL


4, 自连接

自连接是指在同一张表连接自身进行查询, 比如要查询 java 成绩数据库成绩高的同学都有谁, 如果 java 成绩数据库成绩在一条记录中, 可以直接进行比较----列与列之间的比较

可是当前表中 java 成绩数据库成绩不在同一行----需要行与行之间的比较
在这里插入图片描述

这就需要自连接, 让自己和自己进行笛卡尔积, 就能把行转化成列, 再进行列与列之间的比较了, 注意自连接必须给表分别指定两个别名

  • 自链接sql 语句 : select * from 表 as 别名1, 表 as 别名2;
    再加上 where 条件过滤一部分无效数据
    在这里插入图片描述

  • 在笛卡尔积的这么多结果中, 一定有 s1 的课程 id 对应着 java , 并且 s2 的课程 id 对应着数据库, 但是我们的成绩表中只有课程 id, 没有课程名称, 所以在此之前先去查一下课程表
    在这里插入图片描述

  • 然后在刚刚的自链接的 sql 语句上使用 and 再加两个条件: s1.courseId = 1 和 s2.courseId = 3
    在这里插入图片描述

  • 现在 s1 中都是 java 成绩, s2 中都是数据库成绩, 只需最后一步 : 再使用 and 再加一个条件, 找到 s1 的成绩> s2 的成绩
    在这里插入图片描述

终于找到了 studentId 为 4 的同学满足 java 成绩比数据库成绩高, 虽然查到结果了, 但可以看到这条记录中并不包含学生姓名, 还是不够直观

所以 sql 表达逻辑的能力是比较弱的, 对于逻辑比较复杂的查询, 还是不建议单独使用sql, 而是借助 java 等编程语言来实现


总结

以上就是本篇的全部内容, 主要介绍了 数据库中聚合查询和多表联合查询

这些是比较复杂的查询, 尤其是多表查询中的内连接, 外连接, 自连接

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

存量时代下,互联网玩家如何“自我造血”?

毫无疑问,互联网已经进入存量时代。 在过去高增长的增量时代,许多互联网企业追求规模效应,痴迷于“先规模后盈利”的打法,力图用规模构建护城河。然而,随着行业整体增长速度放缓,规模扩张变得更为艰难&…

面了个字节跳动拿 38K 出来的测试,让我见识到了跳槽的天花板

最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家,目前工资比较乐观,但是我还是会选择跳槽,因为感觉在一个舒适圈待久了,人过得太过安逸,晋升涨…

【JavaSE】Java基础语法(十六):抽象类

文章目录 1. 抽象类的概述2. 抽象类的特点3. 抽象类的实用价值4. 抽象类的案例 1. 抽象类的概述 当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了! 在Java中,一个没有方法体的方法应该定义…

基于TCP、UDP网络编程

文章目录 网络协议分层套接字UDP和TCP差异UDP的APIDatagramSocketDatagramPacket 基于UDP Socket 实现一个回显程序TCP的APISocket的API基于TCP实现回显程序 网络协议分层 应用层: 应用程序拿到数据怎么用传输层: 负责关注传输过程中起点和终点网络层 &…

windows环境下nginx+ftp服务器搭建简易文件服务器

这里写目录标题 1,前言2,FTP服务器搭建3,nginx安装 1,前言 几种文件服务器的对比 1,直接使用ftp服务器,访问图片路径为 ftp://账户:密码192.168.0.106/31275-105.jpg不采用这种方式,不安全容易…

【高效科研工具(二):使用NewbingChat(方法+问题)| Newbing帮你阅读paper、解析paper】

高效科研工具(二):使用NewbingChat(方法问题)| Newbing帮你阅读paper、解析paper 目录 0、前言 1、NewbingChat 介绍 2、NewbingChat 注册方法 3、NewbingChat 遇到的问题 (🇺🇸位置切换问题、…

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统

作者:Jack_G 时间:2023.05.26 版本:V1.0 上次修改时间: 环境: \quad \quad \quad \quad STM32Cube MX V6.8.1 \quad \quad \quad \quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 \quad \quad \quad \qu…

基于混合蛙跳的路径规划算法

路径规划算法:基于混合蛙跳优化的路径规划算法- 附代码 文章目录 路径规划算法:基于混合蛙跳优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

改变开发的未来 | 探索无服务器与人工智能的协同效应

近年来,无服务器计算和人工智能深刻改变着应用程序的开发方式。 无服务器计算实现无需管理底层基础架构就能构建和运行应用程序,而人工智能则让应用程序依据数据和算例做出智能决策。借助云计算,开发者打开了一个应用程序开发、构建的全新世…

Linux网络编程——有限状态机

在逻辑单元内部的一种高效的编程方法:有限状态机。 有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑,下面代码展示的是状态独立的有限状态机 STATE_MACH…

Python中模块的使用3

在运行Python程序时,总会用到Python的标准库模块。一些标准库模块被内嵌到Python解释器中,通过调用这些模块提供的函数,可以实现特殊的功能。sys模块就是Python的一个标准库模块,该模块被被内嵌到Python解释器中。 1 sys模块的导…

阿里云备案服务码申请方法流程

阿里云备案服务码是什么?ICP备案服务码怎么获取?阿里云备案服务码分为免费和付费两种,申请备案服务码是有限制条件的,需要你的阿里云账号下有可用于申请备案服务码的云产品,如云服务器、建站产品、虚拟主机等&#xff…

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…

ICLR2023 | Mole-BERT: 对分子GNN预训练的反思

原文标题:MOLE-BERT: RETHINKING PRE-TRAINING GRAPH NEURAL NETWORKS FOR MOLECULES 原文链接:Mole-BERT: Rethinking Pre-training Graph Neural Networks for Molecules | OpenReview https://github.com/junxia97/Mole-BERT 一、Introduction At…

TreeMap(1):TreeMap介绍

1 TreeMap的特点 概念: TreeMap是一个双列集合,是Map的子类。底层由红黑树结构构成。 特点: 元素中键不能重复元素会按照大小顺序排序 2 TreeMap的数据结构 2.1二叉查找树 2.1.1二叉查找树的定义 特点: 若左子树不空&#…

分享五个前端WebGis地图框架(优缺点以及该如何选择)附地址

如何选择一个合适的前端GIS框架时,需要考虑以下几点: 1,功能和特性 前端GIS框架的主要目的是在 Web 环境下使用,以可视化地理数据。需要考虑所需功能和特性,例如应用需不需要数据编辑、地图标注、3D 可视化、如何实现…

五、Spring从入门到改行

一、Spring概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 二、Spring基础程序 1、pom.xml中导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifact…

【特征选择】基于二进制粒子群算法的特征选择方法(KNN分类器)【Matlab代码#28】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 基于群智能算法的特征选择2. 二进制粒子群算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 基于群智能算法…

ollvm反混淆实战

[原创]记一次基于unidbg模拟执行的去除ollvm混淆-Android安全-看雪-安全社区|安全招聘|kanxue.com 参考上面的博客进行操作。这里记录操作细节 首先配置unidbg框架 git clone --recursive https://github.com/zhaoboy9692/unidbgweb.git 然后在unidbg-android中添加自定义类…

Vue3.x的设计理念-Vue3导读

目录 VUE-NEXT【vue3】 VUE-NEXT最核心的变更 Why not SFC&#xff1f;【单文件组件】 Composition API 生命周期钩子变化 什么是响应式&#xff08;Reactivity&#xff09; Reactive值 Proactive vs Reactive 声明式程序 声明式程序&#xff1a;创造语言 声明式程序…