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

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

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

二.多表联合查询时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

相关推荐
瀚高PG实验室几秒前
瀚高数据库创建新数据库卡住问题排查
数据库·postgresql·瀚高数据库
瑶总迷弟19 分钟前
银河麒麟 V10 ARM64 安装 Oracle 19c 静默部署操作手册
数据库·oracle
从琳开始98922 分钟前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
程序员塔塔喵38 分钟前
【MySQL篇|第十而二篇】深层次讲解MVCC机制
mysql·mvcc
飞浪纪元[FWC–FE]44 分钟前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Ivanqhz1 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Tsuki_tl1 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
Gauss松鼠会1 小时前
GaussDB 整体架构解析
运维·服务器·网络·数据库·sql·架构·gaussdb
系统集成-鹰翔1 小时前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
西瓜拿铁好喝1 小时前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库