大家好,又见面了,我是你们的朋友全栈君。
一、知识点名称
多表联合查询(一对多数据显示、多对多数据展示)
二、知识点业务场景
一对多关联:
学生和成绩的关系
用户与订单的关系
企业与员工的关系
用户与银行卡的关系
多对多关联:
学生和选课的关系
订单和商品的关系
用户和角色的关系
角色和权限的关系
三、知识点业务(原理)
a、多表联合查询的原理
1、先确定数据要用到哪些表。
2、将多个表先通过笛卡尔积变成一个表。
3、然后去除不符合逻辑的数据。(根据两个表的关系去掉)
4、最后当做是一个虚拟表一样来加上条件即可。
!笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X * Y,第一个对象是X的成员
而第二个对象是Y的所有可能有序对的其中一个成员。例如下面:
b、多表联合查询的不同方式
1、交叉连接
交叉连接即是笛卡尔积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。
例如:如果希望得到学生表和选课表两个关系模式的乘积,查询语句为:
SELECT * FROM 学生表 CROSS JOIN 选课表;
2、内连接
内连接是一种最常用的连接类型。内连接查询实际上是一种任意条件的查询。使用内连接时,如果两个表的相关字段满足
连接条件,就从这两个表中提取数据并组合成新的记录,也就是在内连接查询中,只有满足条件的元组才能出现在结果关系中。
例如:要查询每个已经选课的学生的情况,查询语句为:
SELECT * FROM 学生表 INNER JOIN 选课表 ON 学生表.学号 = 选课表.学号;
内连接分类:
1、等值连接:
在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的
重复列。
2、不等连接:
在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值,这些运算符包括>、>=、<=、<、!>
、!<和<>。
3、自然连接:
在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出的查询结果集合中所包括的列,
并删除连接表中的重复列。
3、自连接
如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询就称为自连接查询。同一张表在FROM字句中对多次
出现,为了区别该表的每一次出现,需要为表定义一个别名。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同
一张表,但可以在逻辑上分为两张表。
例如:要求检索出学号为20210的学生的同班同学的信息,查询语句为:
SELECT 学生表.* FROM 学生表 JOIN 学生表 AS 学生表1 ON 学生表.班级 = 学生表1.班级 WHERE 学生表1.学号 = ‘20210’;
4、外连接
外连接的查询结果都是满足连接条件的元组。但有时候我们也希望输出那些不满足连接条件的元组信息。比如,我们想
知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),
这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接
方式。
外连接的三种方式:
1、左外连接(LEFT OUTER JOIN)
如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。
如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTER
JOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的互数据
是否满足连接条件,均输出左端表中的内容。
例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为:
SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(左外连接查询中左端表中的所有元组的信息都得到了保留)
2、右外连接(RIGHT OUTER JOIN)
右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的
数据是否满足连接条件,均输出表中的内容。
例如:同上例内容,查询语句为:
SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(左外连接查询中右端表中的所有元组的信息都得到保留)
3、全外连接(FULL OUTER JOIN)
全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。
例如:同左外连接例子内容,查询语句为:
SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM 学生表 FULL OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(全外连接查询中所有表中的元组信息都得到了保留)
四、功能实现步骤讲解
创建一张课程表
创建一张老师表
创建一张学生表
创建学生成绩中间表
1、一对多关联
将两个业务表关联查询,根据不同的需求,使用不同的连接方式,老师和课程表是一对多的关系。
1、内连接
两个表关联的时候,需要通过外键相等将两个表连接起来,如果有其他的条件,在where后面添加and + 条件即可。
所有有关联的数据都会查询出来,没有关联的数据不会显示。
SQL语句如下:
查询出来的结果:
2、左连接
两个表左关联的时候,以左表为主,把右表中的相关的记录添加到左表,形成新的表数据,如果有其他条件,可在后面
添加where语句。左表的数据都会查询出来,如果右表有对应的关联数据,则显示,如果没有对应的数据,则显示为null。
SQL语句如下:
查询出来的结果:
3、右连接
两个表右关联的时候,以右表为主,把左表中的相关的记录添加到左表,形成新的表数据。 如果有其他条件,可在后
面添加where语句。右表的数据都会查询出来,如果左表有对应的关联数据,则显示,如果没有对应的数据,则显示
为null。
SQL语句如下:
查询出来的结果
二、多对多关联
将两个业务表和一个中间表,这三个表进行关丽娜查询,根据不同的需求,使用不同的连接方式。学生和成绩表是多对多的关系。
1、内连接
两个表多对多关联的时候,需要通过关联中间表,使中间表的两个外键分别与两个单表的主键相等,将两个表连接起
来,如果有其他的条件,在where后面添加and+条件 即可。所有有关联的数据都会查询出来,没有关联的数据不会显示。
SQL语句如下:
查询结果如下:
2、左连接
三个表左关联的时候,以左表为主,把右表中的相关的记录添加到左表,形成新的表数据,再以新的表数据为主,把
第三个表中的相关的记录添加进来,形成最终的表数据,如果有其他条件,可在后面添加where语句。左表的数据都
会查询出来,如果右表有对应的关联数据,则显示,如果没有对应的数据,则显示为null,新形成的表和第三张表的
关联同理。
SQL语句如下:
查询出来的结果如下:
3、右连接
三个表右关联的时候,以右表为主,把左表中的相关的记录添加到右表,形成新的表数据,再以第三个表为主,把新的
表中的相关的记录添加进来,形成最终的表数据,如果有其他条件,可在后面添加where语句。右表的数据都会查询出
来,如果左表有对应的关联数据,则显示,如果没有对应的数据,则显示为null,新形成的表和第三张表的关联同理。
SQL语句如下:
查询结果如下:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145923.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...