MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)

目录

  • 一、前言
  • 二、聚合查询
    • 2.1 聚合函数
      • 2.1.1 COUNT():统计所有行
      • 2.1.2 SUM(列名) 求和
      • 2.1.3 AVG()
      • 2.1.4 MAX()、MIN()
    • 2.2 GROUP BY子句(分组查询)
    • 2.3 HAVING
  • 三、联合查询
    • 3.1表的笛卡儿积
    • 3.2内连接
      • 3.2.1 例题一
      • 3.2.2 例题二
    • 3.3外连接
      • 3.3.1 右外连接
      • 3.3.2 左外连接
    • 3.4 自连接
      • 3.4.1例题:
  • 四、子查询(嵌套查询)
    • 4.1 单行子查询
    • 4.2 多行子查询
    • 4.3 多行包含
    • 4.4 [not] exists 关键字
    • 4.5 例题
  • 五、合并查询
    • 5.1 union
    • 5.2 union all

一、前言

                              欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~      

博客主页链接点这里–>:权权的博客主页链接

二、聚合查询

如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗?这个方法当然可以,但是比较不好。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

2.1 聚合函数

在这里插入图片描述

2.1.1 COUNT():统计所有行

语法:

select count() from...table_name

在这里插入图片描述

2.1.2 SUM(列名) 求和

语法:

select sum() from table_name

把查询结果中所有的行中指定列相加,注意:这里相加的数据类型必须是数值型不能是字符或者日期…

示例
在这里插入图片描述

2.1.3 AVG()

语法:

select AVG() FROM TABLE_NAM...

对所有行的指定列进行求平均值运算。

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

2.1.4 MAX()、MIN()

求所有行中指定列的最大值与最小值

语法:

select max() from...

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

2.2 GROUP BY子句(分组查询)

“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

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

语法:

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

例如:计算不同职位的工资平均值:

在这里插入图片描述

2.3 HAVING

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

问题:找出分组后的结果进行过滤,比如说,找出平均工资大于150万的小于200万的角色。
在这里插入图片描述
注意

where用在from表名之后,也就是分组之前,having跟在group by子句之后,如果需求要求对真实数据进行过滤,同时也需要对分组进行过滤,那么在合适的位置写where和having即可。

三、联合查询

设计数据时把表进行拆分,为了消除表中的字段的依赖关系,比如部分函数依赖、传递依赖,这时会导致一条SQL语句查出来的数据,对于业务是不完整的,我们就可以使用联合查询把关系中的数据全部查出来,在一个数据行中显示详细信息。

3.1表的笛卡儿积

问题:联合查询时MySQL是如何执行的?

在这里插入图片描述
例如:
在这里插入图片描述
语法:

select * from 表名,表名;

前提:创建一个school表和class表,然后插入一些数据,然后使用上面这个命令进行观察:
在这里插入图片描述
通过观察一些数据取笛卡儿积之后,一些是无效数据
那么我们如何过滤掉这些无效数据?

通过连接条件过滤掉无效数据

在有外键关系存在的情况下:
在这里插入图片描述

3.通过指定列查询,来精简结果集

查询列表中通过表名.列名的方式指定要查询字段。
在这里插入图片描述

注意

联合查询也叫做连接查询
1.首先确定哪几张表要参与查询
2.根据表与表之间的主外键关系,确定过滤条件
3.精简查询字段,得到想要的结果。

3.2内连接

语法:

select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;-- 标准的连接写法
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;--where 连接方法

在这里插入图片描述

3.2.1 例题一

先创建class、course、score、student 表:

DROP TABLE IF EXISTS `score`;
DROP TABLE IF EXISTS `student`;
DROP TABLE IF EXISTS `class`;
DROP TABLE IF EXISTS `course`;

– Table structure for class


CREATE TABLE `class`  (`class_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`class_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

– Records of class


INSERT INTO `class` VALUES (1, '计算机系2019级1班');
INSERT INTO `class` VALUES (2, '中文系2019级3班');
INSERT INTO `class` VALUES (3, '自动化2019级5班');

– Table structure for course


CREATE TABLE `course`  (`course_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

– Records of course


INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中国传统文化');
INSERT INTO `course` VALUES (3, '计算机原理');
INSERT INTO `course` VALUES (4, '语文');
INSERT INTO `course` VALUES (5, '高阶数学');
INSERT INTO `course` VALUES (6, '英文');

– Table structure for student


REATE TABLE `student`  (`student_id` bigint NOT NULL AUTO_INCREMENT,`sn` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`mail` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`class_id` bigint NULL DEFAULT NULL,PRIMARY KEY (`student_id`) USING BTREE,UNIQUE INDEX `sn`(`sn` ASC) USING BTREE,INDEX `class_id`(`class_id` ASC) USING BTREE,CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`class_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
``

– Records of student


INSERT INTO `student` VALUES (1, '09982', '黑旋风李逵', 'xuanfeng@qq.com', 1);
INSERT INTO `student` VALUES (2, '00835', '菩提老祖', NULL, 1);
INSERT INTO `student` VALUES (3, '00391', '白素贞', NULL, 1);
INSERT INTO `student` VALUES (4, '00031', '许仙', 'xuxian@qq.com', 1);
INSERT INTO `student` VALUES (5, '00054', '不想毕业', NULL, 1);
INSERT INTO `student` VALUES (6, '51234', '好好说话', 'say@qq.com', 2);
INSERT INTO `student` VALUES (7, '83223', 'tellme', NULL, 2);
INSERT INTO `student` VALUES (8, '09527', '老外学中文', 'foreigner@qq.com', 2);

– Table structure for score


CREATE TABLE `score`  (`score_id` bigint NOT NULL AUTO_INCREMENT,`student_id` bigint NULL DEFAULT NULL,`course_id` bigint NULL DEFAULT NULL,`score` decimal(5, 2) NULL DEFAULT NULL,PRIMARY KEY (`score_id`) USING BTREE,INDEX `student_id`(`student_id` ASC) USING BTREE,INDEX `course_id`(`course_id` ASC) USING BTREE,CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

– Records of score


INSERT INTO `score` VALUES (1, 1, 1, 70.50);
INSERT INTO `score` VALUES (2, 1, 3, 98.50);
INSERT INTO `score` VALUES (3, 1, 5, 33.00);
INSERT INTO `score` VALUES (4, 1, 6, 98.00);
INSERT INTO `score` VALUES (5, 2, 1, 60.00);
INSERT INTO `score` VALUES (6, 2, 5, 59.50);
INSERT INTO `score` VALUES (7, 3, 1, 33.00);
INSERT INTO `score` VALUES (8, 3, 3, 68.00);
INSERT INTO `score` VALUES (9, 3, 5, 99.00);
INSERT INTO `score` VALUES (10, 4, 1, 67.00);
INSERT INTO `score` VALUES (11, 4, 3, 23.00);
INSERT INTO `score` VALUES (12, 4, 5, 56.00);
INSERT INTO `score` VALUES (13, 4, 6, 72.00);
INSERT INTO `score` VALUES (14, 5, 1, 81.00);
INSERT INTO `score` VALUES (15, 5, 5, 37.00);
INSERT INTO `score` VALUES (16, 6, 2, 56.00);
INSERT INTO `score` VALUES (17, 6, 4, 43.00);
INSERT INTO `score` VALUES (18, 6, 6, 79.00);
INSERT INTO `score` VALUES (19, 7, 2, 80.00);
INSERT INTO `score` VALUES (20, 7, 6, 92.00);

要求:

查询“许仙”同学的成绩。

1.首先要确定那几张表要参与查询:
在这里插入图片描述

2.根据表与表之间的主外键关系,确定过滤条件:
在这里插入图片描述

3.确定结果集的过滤条件:
在where条件中,增加 stu.name="许仙"的过滤条件:
在这里插入图片描述
4.精简查询列表中的字段在这里插入图片描述

3.2.2 例题二

要求:

查询所有学生的总成绩、以及同学的个人信息。
在这里插入图片描述

1.确定要参与查询的表是学生表和成绩表,
在这里插入图片描述
以及查询总成绩要用分组查询。
2.取两张笛卡儿积表:
在这里插入图片描述
3.确定连接条件:

student.student_id=score.student_id

在这里插入图片描述
4.确定所有同学成绩的结果集的过滤条件
按学生的id进行分组,并且在查询列表中,使用聚合函数 sum(分数)计算总分
在这里插入图片描述
5.精简查询字段(并且对总分升序)
在这里插入图片描述

3.3外连接

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

语法:

-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

在这里插入图片描述
使用内连接:(可以看到没有把猪显示出来)
在这里插入图片描述
那我们要怎么办才能把猪显示出来呢?

3.3.1 右外连接

是以join右边的表为基准,这个表中的数据会全部显示出来,左边的表没有与之匹配的记录全部用null填充。
在这里插入图片描述

3.3.2 左外连接

是以join左边的表为基准,这个表中的数据会全部显示出来,右边的表没有与之匹配的记录全部用null填充。

在这里插入图片描述

mysql中不支持全外连接。

3.4 自连接

自己与自己进行表连接

在这里插入图片描述

3.4.1例题:

要求:显示所有“计算机原理”成绩比“Java”成绩高的成绩信息。
1.确定涉及的表:
成绩表 课程表
在这里插入图片描述

2.取笛卡儿积
在这里插入图片描述
3.确定连接条件
在这里插入图片描述
4.确定对整个结果集的过滤条件

在这里插入图片描述
要么是s1表中的course_id=1并且s2表中的course_id=3,或者s1表中的course_id=3并且s2表中的course_id=1(本例子是这个)。
5.精简查询字段

在这里插入图片描述
加入最后条件查出计算机原理成绩大于Java成绩:
在这里插入图片描述

四、子查询(嵌套查询)

子查询是把一条SQL的查询结果,当做另一条SQL的查询条件,也可以嵌套很多层。
在这里插入图片描述

4.1 单行子查询

例题
要求:

查询与不想毕业同学的同班同学。

1.确定查询中涉及哪些表
学生表
在这里插入图片描述

2.先查出不想毕业同学的信息。
在这里插入图片描述
3.在学生表中查出与“不想毕业”的同学的同班同学,条件是与“不想毕业”同学班级编号相同的所有学生。
在这里插入图片描述

把上面第3点这个1用子查询的方式替换。
在这里插入图片描述

4.2 多行子查询

返回多行记录的子查询
在这里插入图片描述

案例:查询“语文”或者“英文”课程的成绩信息。

1.确定涉及那些表:
课程表、成绩表
在这里插入图片描述

2.在课程表中获得“语文”和“英文”课程的编号
在这里插入图片描述
3.根据获取到的课程id,在成绩表中查询相应的课程分数
在这里插入图片描述
4.把上面步骤查询的SQL拼装起来,变成子查询
在这里插入图片描述

4.3 多行包含

在这里插入图片描述

查询重复的分数:
可以用分组查询的方式:

在这里插入图片描述
1.同一个学生,同一门课程,同一样的成绩,按这3个列同时去分组。
2.分组之后在having语句中,用count(*)语句判断分组中的记录数
在这里插入图片描述
3.加入外层查询
在这里插入图片描述

4.4 [not] exists 关键字

语法:

select * from 表名 where exists(select * from 表名1)

相当于if语句的判断条件,如果符合条件则执行外层查询。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 例题

要求:查询所有比"计算机系2019级1班”平均分高的成绩信息。

1.确定涉及的表:
成绩表、班级表、学生表
在这里插入图片描述

2.先算出“计算机系2019级一班”的平均分
(1)先从班级表中的班级名找到班级编号
(2)根据班级编号在学术表中找到班例的学生以及学生编号
(3)根据学生的编号在成绩表中计算平均分
在这里插入图片描述
3.再用表中学生的真实成绩和平均分做比较

在这里插入图片描述

五、合并查询

作用:合并多个查询到一个结果集当中
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致。

5.1 union

在这里插入图片描述

根据一张表的结构创建一张新表

+

通过union把两张表的数据显示在一个结果集当中。

union用于取得两个结果集的并集。当使用该操作符时,会去掉结果集中的重复行。
在这里插入图片描述
在这里插入图片描述

5.2 union all

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
欧耶!!!我学会啦!!!

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

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

相关文章

使用 Python 遍历文件夹

要解决这个问题,使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树,找到所有的 text 文件,读取内容,处理空行和空格,并将处理后的内容合并到一个新的文件中。 整体思路: 遍历子目录&#xff1…

ConcurrentHashMap在JDK1.7和1.8的区别,详解

目录 1.了解HashMap底层插入原理 2.ConcurrentHashMap 是什么? HashTable的实现 3.ConcurrentHashMap 1.7和1.8的区别 4、JDK1.7 中的ConcurrentHashMap实现原理 6、JDK1.8中的ConcurrentHashMap 7.链表转红黑树条件 1.8 put方法 8.并发扩容 9.总结 首先呢…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API: 在开发环境中设置为 /dev-api,这是一个本地 mock 地址,通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA: 设置为 "true",表示启用调试工具,通常是为了…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多,因此拆成2个章节,本章节是第一章节&…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接(三次握手) HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

一、引言 从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,根据《video_file_format_spec_v10_1.pdf》第80到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和一个ScriptDataV…

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序&a…

idea2024设置中文

今天下载idea2024.2版本,发现已经装过中文插件,但是还是不显示中文,找了半天原来还需要设置中文选项 方案一 点击文件 -> 关闭项目 点击自定义 -> 选择语言 方案二 点击文件 -> 设置 外观与行为 -> 系统设置 -> 语言和地区…

[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪

【算法介绍】 YOLOv11、ByteTrack和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本,它在保持高检测速度的同时,通过改进网络结构、优化损失函数等方式,提高了检测精度,能够同时处理多个…

高空抛物AI检测算法:精准防控,技术革新守护城市安全

近年来,随着城市化进程的加速,高楼大厦如雨后春笋般涌现,但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全,还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生,…

微服务获取用户信息和OpenFeign传递用户

问题一: 网关已经完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时,微服务又该如何获取用户身份呢? 由于网关发送请求到微服务依然采用的是Http请求,因此我们可以将用户信息以请求头的方式传递到下游微服务…

毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

SQL Inject-基于报错的信息获取

常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路: 在MySQL中使用一些指定的函数来制造报错&am…

如 有 任 何 问 题 ,请 及 时 联 系 我 们 反 馈 !

如有任何问题, 请及时联系我们反馈 !https://support.qq.com/products/671606 如有任何问题, 请及时联系我们反馈 !

中间件介绍

可以把中间件想象成是在应用和系统之间搭建的一座桥梁,或者说是一个“翻译官”和“中转站”。它处在操作系统、网络和数据库之上,应用软件的下层,负责实现应用软件之间的互联互通,使得应用软件能够更方便、高效地进行数据交换和通…

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵 3.4 Softmax 回归3.4.1 分类问题3.4.2 网络架构 3.4.3 全连接层的参数开销3.4.4 softmax 运算3.4.5 小批量样本的向量化3.4.6 损失函数对数似然softmax 的导数 3.4.7 信息论基础熵信息量重新审…

网站开发基础:HTML、CSS

前端开发主要使用的技术如 HTML、CSS 和 JavaScript 等。 简单制作一个网页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>柒毓同学网站的首页</title><style>.c1{border: solid 1px g…

C语言—单链表

目录 一、链表的概念及结构 二、单链表实现 &#xff08;2.1&#xff09;基本结构定义 &#xff08;2.2&#xff09;申请节点 &#xff08;2.3&#xff09;打印函数 &#xff08;2.4&#xff09;头部插入删除\尾部插入删除 &#xff08;2.4.1&#xff09;尾部插入 &…

计算机毕业设计 智慧物业服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【算法笔记】双指针算法深度剖析

【算法笔记】双指针算法深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】双指针算法深度剖析前言一.移动零1.1题目1.2思路分析1.3代码实现 二.复写零2.1题目2.2思路分析2.3代码实现 三.快乐数3.1题目…