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

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

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

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

相关推荐
蓝创工坊Blue Foundry几秒前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
一嘴一个橘子16 分钟前
MySqL 的 B+树、 叶子节点、非叶子节点
mysql
麦聪聊数据21 分钟前
企业数据市场建设(三):API 化服务封装,让数据开箱即用、避免重复开发
数据库
曹牧25 分钟前
文档格式:OFD
java
脱胎换骨-军哥25 分钟前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
麦聪聊数据33 分钟前
企业数据市场建设(四):流程闭环与价值运营,让数据市场真正转起来
运维·数据库
正儿八经的少年40 分钟前
redis 的大 key 和热 key 详解
数据库·redis·缓存
AI砖家44 分钟前
多智能体系统实战:架构设计、数据库表设计与 Skill 体系
数据库·多智能体·skill·agent架构设计·agengt
豆角焖肉1 小时前
Maven进阶与搭建私服
java·maven
大不点wow1 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm