广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL】聚合查询 + 多表联合查询(重点)
  • 308
分享到

【MySQL】聚合查询 + 多表联合查询(重点)

mysql数据库聚合查询联合查询内连接 2023-09-29 10:09:19 308人浏览 八月长安
摘要

文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12

文章目录


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 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 等编程语言来实现


总结

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

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

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


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

在这里插入图片描述

来源地址:https://blog.csdn.net/yzhcjl_/article/details/130871061

您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL】聚合查询 + 多表联合查询(重点)

本文链接: https://www.lsjlt.com/news/421326.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【MySQL】聚合查询 + 多表联合查询(重点)
    文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12...
    99+
    2023-09-29
    mysql 数据库 聚合查询 联合查询 内连接
  • MySQL --- 聚合查询 和 联合查询
    聚合查询: 下文中的所有聚合查询的示例操作都是基于此表: 聚合函数 聚合函数都是行与行之间的运算。 count() select count(列名) from 表名; 统计该表中该列的行数,但是 null 值不会统计在内,但是...
    99+
    2023-10-21
    mysql 数据库 sql
  • MySQL进阶查询、聚合查询和联合查询
    目录1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多3.将查询结果放到另一个表中4. 聚合查询4.2 GROUP BY4.3 HAVING5. 联合查询(多表查询)5.1 内连接5.2 外连接5...
    99+
    2023-04-12
    MySQL进阶查询 MySQL聚合查询 MySQL联合查询
  • 【MySQL】进阶查询-聚合查询和联合查询
    文章目录 1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多 3.将查询结果放到另一个表中4. 聚合查询4.1 聚合函数4.2 GROUP BY4.3 HAVING 5. 联合查询(多表查询)5.1 ...
    99+
    2023-08-17
    mysql 数据库 sql
  • MySQL联合查询(多表查询)
    一、内连接 select *from 表1 [ inner | cross ] join 表2 [ on过滤条件 ] [ where查询条件 ] ; [ inner | cross ]: join 内连接关键字(必须要有...
    99+
    2023-09-14
    mysql 数据库 database
  • 【MySQL】详解聚合查询、多表查询
    MySQL 增删查改(进阶) 文章目录 MySQL 增删查改(进阶)01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GR...
    99+
    2023-10-07
    mysql adb 数据库
  • 【MySQL】MySQL表之联合查询(多表查询)
    📌前言:本篇博客介绍MySQL数据库的MySQL表之联合查询(多表查询),学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!...
    99+
    2023-08-16
    mysql 数据库 java
  • MySQL聚合查询与联合查询操作实例
    目录一. 聚合查询1.聚合函数(count,sum,avg...)2.GROUP BY子句3.HAVING二. 联合查询((重点)多表)1.内连接2.外连接3.自连接4.子查...
    99+
    2022-11-13
  • MySQL 数据库聚合查询和联合查询操作
    目录1. 插入被查询的结果2. 聚合查询2.1 介绍2.2 聚合函数2.3 group by 子句2.4 having3. 联合查询3.1 介绍3.2 内连接3.3 外连接...
    99+
    2022-11-12
  • MySQL中的聚合查询和联合查询操作代码
    目录一、聚合查询(行与行之间的计算)1.常见的聚合函数有:2.group by3.having二、联合查询(多表查询)1.进行联合查询的步骤:2.内连接(from,join on)3.外连接(left/righ...
    99+
    2023-03-20
    mysql聚合查询和联合查询 mysql聚合查询 mysql联合查询
  • MySQL中的聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL中的聚合查询和联合查询怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的聚合查询和联合查询怎么实现”文章能帮助大家解决问题。一、聚合查询(行与行之间的计...
    99+
    2023-07-05
  • MySQL数据库聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL数据库聚合查询和联合查询怎么实现”,在日常操作中,相信很多人在MySQL数据库聚合查询和联合查询怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库聚合查询和联合...
    99+
    2023-06-21
  • MySQL聚合查询与联合查询操作的示例分析
    这篇文章主要为大家展示了“MySQL聚合查询与联合查询操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL聚合查询与联合查询操作的示例分析”这篇文章吧。一. 聚合查询1.聚合函...
    99+
    2023-06-29
  • mysql多表联合的查询方法
    本文主要给大家介绍mysql多表联合的查询方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql多表联合的查询方法吧。   ...
    99+
    2022-10-18
  • mysql 联合查询
    mysql联合查询 联合查询:union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。 基本语法 联合查询由多条select语句构成,每条select语句获取的字段数相同,但与...
    99+
    2023-08-31
    数据库 sql mysql
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE...
    99+
    2022-10-18
  • mongo 聚合查询
    *****************未加索引******************************************> var startTime = new Date();> db....
    99+
    2022-10-18
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询
    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4....
    99+
    2023-08-30
    mysql 学习 android
  • MySQL DML操作--------多表联合查询实战
    1. 背景   * 多表联合查询是把不同表的记录到一起的一种方式   * 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接。其中外连接又分左外连接,右...
    99+
    2022-10-18
  • ThinkPHP多表联合查询怎么用
    这篇文章主要介绍ThinkPHP多表联合查询怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!thinkphp是什么thinkphp属于一种免费的开发框架,能够用于开发前端网页,最早thinkphp是为了简化开发而...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作