数据库的联合查询

  • Post author:
  • Post category:其他



目录


一、联合查询-多表查询


1、笛卡尔积


2、内连接


3、小练习


(1)查找许仙同学的成绩


(2)查询所有同学的总成绩,以及这些同学的个人信息


(3)查询每个同学的姓名,学号,选修的课程名称以及该课程的分数


4、外连接


(1)外连接的引出


(2)外连接


(3)自连接


5、子查询


6、in和exists的简单使用


(1)in关键词


(2)exists关键词


一、联合查询-多表查询

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关键词比较耗时,每次都是从外部查询中取出记录和内部查询匹配,内部子查询不会产生临时表,不耗费内存空间,适用于子查询结果集比较大,且内存不够用时



版权声明:本文为m0_68989458原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。