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