目录
(3)查询每个同学的姓名,学号,选修的课程名称以及该课程的分数
一、联合查询-多表查询
1、笛卡尔积
多表查询得到的结果是两张表的组合,列数是多表的列数之和,行数是多表的行数之积
求出笛卡尔积
例如:查找班级名字为java火箭班的同学姓名
首先可以看到在笛卡尔积表中的第2,4,5,7行是不合理的笛卡尔积数据,因此首先要对这些进行筛选也就是加上过滤条件 where stu.class_id=class.id
题目的要求是java火箭班的同学,因此在加上过滤条件 and class.name=’java火箭班’
最后看一眼题目只要求姓名,那么

2、内连接
例如:查找班级名字为java火箭班的同学姓名,使用内连接的方法

3、小练习
(1)查找许仙同学的成绩
查看student和score表的笛卡尔积
先进行内连接,可以从题目看出来需要的条件是student.id=score.student_id,就可以得到每个同学的成绩
在加上过滤条件,由于是查找许仙的成绩,所以加上 where name=’许仙’
(2)查询所有同学的总成绩,以及这些同学的个人信息
个人信息包括学生的学号,学生的姓名以及班级id
首先求出每个同学的总成绩
进行内连接,关系是student.id=score.student_id,就可以得到每个同学的总成绩和他们的个人信息

(3)查询每个同学的姓名,学号,选修的课程名称以及该课程的分数
通过三表查询进行内连接
注意:
内连接一定是多个表都存在关联数据的情况,不会出现在关联后在表1有数据,但是在表2没有数据,此时这样的记录就不会显示
4、外连接
(1)外连接的引出
使用内连接查看,可以发现表1的3和表2的4数据就没有显示出来
![]()

(2)外连接
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
外左连接会将user表中的数据完全显示,account表中不匹配的数据就会显示为null
![]()
外右连接会将account表中的数据完全显示,user表中不匹配的数据就会显示为null
![]()
(3)自连接
自连接,一般MYSQL筛选数据时都是不同行列之间的数据进行数据的比较,涉及到同一张表中进行数据筛选时,就会用到自连接
例如:查询所有成绩优于java成绩的成绩信息
使用笛卡尔积查看一下
进行同一个表的自连接,筛选出多余的记录
在课程表中刚找到课程为java的课程id
自连接过滤所有成绩>java成绩的记录
查询成绩表中’计算机原理(3)’大于’java(1)’的成绩信息

5、子查询
单行子查询
:内部的sql返回单条记录的查询例如:查询所有‘不想毕业’同学同班的其他同学
先查询‘不想毕业’同学的班级id
根据查出来的classes_id=1去查询同班的其他同学
查询和不想毕业’同班的其他同学
多行子查询
:内部嵌套的查询sql返回多条记录的查询例如:查询语文或者英文的成绩信息
首先查看语文或者英文的课程id
在成绩表中查询语文成绩或者英文成绩信息
查询语文或者英文的成绩信息
6、in和exists的简单使用
(1)in关键词
in关键词的方法,执行过程只有两次查询,根据内部查询结果筛选外部条件,子查询就会缓存在内部中,效率比较高,但是需要使用内存空间
查询语文或者英文的成绩信息
(2)exists关键词
exists关键词比较耗时,每次都是从外部查询中取出记录和内部查询匹配,内部子查询不会产生临时表,不耗费内存空间,适用于子查询结果集比较大,且内存不够用时