数据库-联合查询(内连接外连接),子查询,合并查询

一.为什么要使用联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询一个条数据的完整信息,就要从多个表中获取数据,如下图所示:要获取学生的基本信息和班级信息就要从学生表和班级表中获取,这时就需要使用联合查询,这里的联合指的是多个表的组合。

二.多表联合查询时MYSQL内部是如何进行计算的​

参与查询的所有表取笛卡尔积,结果集在临时表中

笛卡尔积就是两表每一个行之间的全排列

联合表的个数越多,笛卡尔积就越大一般不超过三个

观察哪些记录是有效数据,根据两个表的关联关系过滤掉无效数据 要用到where条件

可以看到学生的班级编号和班级的id是一致的就是有效数据

以上就是有效数据

再举个例子

在下面两个表中查找许仙同学的成绩

寻找笛卡尔积

可以看到非常之多

确定关联字段-- student_id

确定结果集的过滤字段

精简查询字段

join on写法

上述都是内连接

接下来说外连接

外连接分为左外连接、右外连接和全外连接三种类型,MySQL不支持全外连接。​

左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显示为NULL。​
右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显示为NULL。​

全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某一边表中没有匹配的记录,则结果集中对应字段会显示为NULL。​

外连接在内连接的基础上的不同是基准表的所有行会全部显示出来,不管有没有被筛选

具体语法:

左连接:select 字段名 from 表名1 left join 表名2 on 连接条件;

右连接:select 字段 from 表名1 right join 表名2 on 连接条件;

具体用例

自连接(外连接)

自连接是自己与自己取笛卡尔积,可以把行转化成列,在查询的时候可以使用where条件对结果进行过滤,或者说实现行与行之间的比较。在做表连接时为表起不同的别名。

联合上面的学生表,成绩表和下面的课程表计算机原理大于java成绩的记录

取笛卡尔积

确定连接条件

查出计算机组成原理大于java的成绩

子查询:

子查询是把一个SELECT语句的结果当做别一个SELECT语句的条件,也叫嵌套查询​

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

以下是分步普通查询的做法↓

子查询写法

多行子查询 ​

嵌套的查询中返回多行数据,使用[NOT] IN关键字​

查询语文或英文课程的成绩

在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

查询所有比'中文系2019级3班'平均分高的学生成绩信息

先查询平均成绩

再用这个临时表来联合查询 tmp是临时表的别名

也可以写成这样

合并查询

在实际应用中,为了合并多个select操作返回的结果,可以使用集合操作符 union,union all​

关键字union(去除重复的行) union all(不去除重复的)

使用联合查询

插入查询结果

多插入一条许仙学生信息student_id 11

相关推荐
Zfox_2 分钟前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
陈丹阳(滁州学院)2 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
coderSong25683 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
远方16093 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
Mr_Air_Boy3 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
GUIQU.4 小时前
【Oracle】数据仓库
数据库·oracle
年老体衰按不动键盘4 小时前
快速部署和启动Vue3项目
java·javascript·vue
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖4 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存