【MySQL】进阶查询-聚合查询和联合查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 文章主要围绕着以下三个问题:group by的作用,where与having的区别,表的连接分为哪些,分别是什么作用。

文章目录

1. 前言

2. 表的设计

2.1 一对一

2.2 一对多

2.3 多对多

3.将查询结果放到另一个表中

4. 聚合查询

4.1 聚合函数

4.2 GROUP BY

4.3 HAVING

5. 联合查询(多表查询)

5.1 内连接

5.2 外连接

5.3 自连接

5.4 子查询

5.5 合并查询

6. 总结



1. 前言


文章主要围绕着以下三个问题:

group by的作用

where与having的区别

表的连接分为哪些,分别是什么作用


2. 表的设计


在创建数据表时,我们通常时根据需求找到"实体", 梳理"实体"之间的关系,从而进行创建.

"实体"之间可能会有以下几种关系:1.没关系 2.一对一 3.一对多 4.多对多.

没关系应该是最好理解的,就是单独的一张表,并不涉及到其它的表.


2.1 一对一


一对一的关系在生活中是很常见的,例如每个学生都有属于自己的学号,每个学号就只对应一个学生. 类似于这样的情况,就是一对一的关系.

此时就可以创建两张表,一个是学生表,另一个是学号表. 学生表里的学号就可以和学号表中的学号关联起来.


2.2 一对多


学生在学校上课时,会有一个班级. 但是一个班级可以有多个学生. 这就是一对多的关系.


2.3 多对多


举个例子,我们在学习课程时,可以选择多门课程进行学习,而课程也可以被多个学生进行选择. 这就是多对多的关系.

多对多的关系,在创建表时,可以使用"关联表" 将两个实体联系起来.

如果在设计数据库表时,场景很复杂,可以使用ER图帮助我们更好的创建数据库表.


3.将查询结果放到另一个表中


insert into 表2 select 字段 from 表1;

# 表2 是要存放查询结果的表

# 表1 是要查询的表

# 查询结果的列要和表2的列相匹配!

# 也可以将查询结果存放在表2的指定列中

示例:

下面这个"student1"这个表中,有三条数据.

5.png下来我们把查询结果放到一张新的 "student2"这个表中

6.png


4. 聚合查询


聚合查询可以进行"行"与"行"之间的运算


4.1 聚合函数

函数                         说明

COUNT([DISTINCT] expr)返回查询到的数据的 数量

SUM([DISTINCT] expr) 返回查询到的数据的 总数

AVG([DISTINCT] expr) 返回查询到的数据的 平均值

MAX([DISTINCT] expr) 返回查询到的数据的 最大值

MIN([DISTINCT] expr) 返回查询到的数据的 最小值

count函数 可以对行进行计算,也可以对列进行计算.

示例:

7.png

这里有一张学生表,里面有学生的id,姓名,语数英三科的成绩.

8.png

成绩为57的有一个,69的有两个,82的有三个

需要注意的是:在进行查询分组的时候,只有分组的这一列,可以查询,其它列必须搭配聚合函数来进行查询

sum,avg,max和min 都是只对数字生效,如果不是数字则没有意义

sum函数的用法和count函数类似. 不过只能计算"列",如果这一列存在"null",则不会参与运算

avg,max,min的用法 和 sum 类似,就不一一介绍了


4.2 GROUP BY


GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。


例如:

1.png

在我的学生表中有这样一些数据.现在我要对语文成绩进行分组

使用group by之后,我们可以看到这已经以语文成绩进行分组了

2.png

成绩为57的有一个,69的有两个,82的有三个

需要注意的是:在进行查询分组的时候,只有分组的这一列,可以查询,其它列必须搭配聚合函数来进行查询


4.3 HAVING


分组查询还可以指定条件,这里的只当条件可以分组之前指定还可以分组之后指定 分组前进行筛选使用的是where 分组后进行筛选使用的则是having SQL 中增加 HAVING 子句原因就是因为WHERE 关键字无法与合计函数一起使用。

去除id=1的语文成绩后进行分组

3.png

分组之后筛选出语文成绩>60分的学生数量

4.png

where 关键字虽然无法与合计函数一起使用,但是可以和having一起使用


5. 联合查询(多表查询)


联合查询一般是在多表之间建立连接后查询的过程.其实就是计算"笛卡尔积"的过程

但是当表很大的时候,如果进行联合查询,效率就会特别低.因为"笛卡尔积"就是简单的排列组合,有些数据是"合理"的,有些数据是"不合理"的.所以我们就要把"有效"的数据筛选出来.因此联合查询通常需要加连接条件和其它筛选条件


5.1 内连接


内连接得到的是两张表中都存在的数据

两种写法:

select 字段 from 表1,表2;

select 字段 from 表1 join 表2 on 条件;

举个例子:

学生表:

5.png

班级表:

6.png

要求查询"王五"的班级的名字.

这就涉及到了两张表,就需要使用联合(多表)查询.

1.首先进行笛卡尔积

7.png

其实就是学生表和班级表进行排列组合,里面有很多无效的数据.

2. 添加连接条件

8.png

注意这里的条件写法,应该是表名.字段名,因为涉及到多个表,多个表中的字段名可能相同,因此需要使用 表名.字段 表明是哪个表中的字段.当然如果这个列名是唯一的,也可以不加 表名.

9.png

刚才的结果还是太多了,我们也可以加上指定列进行查询,同样需要使用表名.字段的形式进行查询

使用join on也可以实现相同的效果,同样是刚才的例子

使用join on的方式来完成

1.首先进行笛卡尔积

10.png

2. 添加条件

11.png

直接写join或者inner join就是内连接

join on不仅可以实现内连接,还可以实现外连接


5.2 外连接


外连接分为左外连接(left join)和右外连接(right join)

还是刚才的学生表:

13.png

但班级表中多有两条数据

14.png

进行笛卡尔积后得到的结果

15.png

这是内连接得到的结果:

16.png

这个是进行右连接得到的结果

17.png

右连接会把右侧表中的数据都获取到,即使左边的值是NULL,也会显示出来

左连接也是类似,会把左侧表中的数据都获取到,即使右边的值是NULL,也会显示出来.

如果两张表中的数据,在对方表中都有,那么此时内外连接是没有区别的,如果两张表中的数据只有一部分在对方的表中,内连接就是获取两张表的"交集",如果是外连接,那么获取到的值就是一侧表的全部记录.

还有一种连接是"全外连接",但是在MySQL中并不支持


5.3 自连接


自连接就是和自己进行笛卡尔积

在条件查询中,只是"列"和"列"之间的比较,但是有的地方需要用的 "行"和"行"之间的比较,就需要使用自连接,将"行"转为"列"再进行比较

例如这里有一张成绩表

18.png

如果要查询数学成绩比语文成绩高的同学的名字,就需要使用自连接.因为如果进行比较,那么就是"行"和"行"进行的比较

19.png

可以看到,如果是直接进行连接,那么是会报错的.

Not unique table/alias: 'grades': 这句话告诉我们不是唯一的表,但是可以起别名

20.png

通过起别名的方式,成功进行自连接

加上连接条件,先筛选出一部分记录,此时我们可以看到语文成绩和数学成绩就在两列了

21.png

将条件补全,就可以得到我们想要的结果了

22.png


5.4 子查询


子查询本质就是将多个查询语组合成一个SQL语句,例如在查询得到的临时表上再次进行查询

例如:在班级表中,找到与"张三"班级相同的同学

23.png

查到"张三"的班级id这个想必大家都会

24.png

我们要将得到的这个结果继续参与查询:

25.png

此时就得到"李四"同学的这条记录了,因为这里的班级id就只有一个,所以后面使用的是 = ,但是如果这个的临时表数据有多条,就可以使用 in 来完成


5.5 合并查询


合并查询是把两个查询的结果集合合并到一起,使用的是union 和union all 这两个关键字

union: 如果有重复的数据,就会去重

union all: 如果有重复的数据,则不会去重

还是刚才的分数表

26.png

如果我们要查询数学成绩>90和英语成绩<60的人的姓名,就可以使用合并查询

27.png


6. 总结

在SQL语句中,查询数据的操作与其它操作语句相比还是有一些难度的,主要涉及到一些多表查询等操作.对于里面涉及到的一些关键字,连接类型要熟练掌握

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
181 66
|
6天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
32 8
|
9天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
51 11
|
13天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
48 6
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
65 9
|
4天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
4天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
20 3
|
4天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
25 2
|
17天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
122 15
|
10天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。