怎么把多个关联集合导入导出 java left join关联多张表_右连接


这是一个系列文章,涵盖了SQL最常用的知识点。题目来自于leetcode的sql题,文章列出了问题-完整解析-答案-知识点拓展-BAT等大厂面试真题。希望能帮你全方位的弄懂。有问题可以留言

一、问题

现有两张表,一张名为”学生”表,包含学生编号,学生姓名,出生年月,性别。一张名为“成绩”表,包含了学生选修的课程,以及对应课程的成绩。 两表通过“学号”进行关联。

现在要求查出每一位学生的信息,包括学生编号,学生姓名,课程和成绩信息。

二、数据准备


create


怎么把多个关联集合导入导出 java left join关联多张表_leftjoin多表联合查询_02


三、解答

【解题思路】

  • 1.明确题目要求的结果

根据题干要求的所有学生的信息姓名,学号,课程和成绩信息。我们知道:“学号”、“姓名”,保存在“学生”表里,“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。

  • 2.确定连接方式

注意题干中的要求所有的学生,有可能学生有注册信息但没有课程成绩信息,所以以学生表作为主表。考察的知识点为表连接中的外连接中的左连接或是右连接

  • 3.确定连接两表的主键

两个表都有“学生编号”,所以联结条件为学生编号。

问:如果问题为查找有成绩信息的同学的信息包括学生编号,学生姓名,课程和成绩信息。改如何写?

[代码]


#


怎么把多个关联集合导入导出 java left join关联多张表_怎么把多个关联集合导入导出 java_03


[本题解答]

有两张表,编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:


FirstName


怎么把多个关联集合导入导出 java left join关联多张表_右连接_04


【思路】

从题目看出,表1(Person)是人的姓名信息,表2(Address)是人的地址信息。

1)题目要求的结果是两个表里的信息,所以需要多表查询

2)有的人没有地址信息,所以要求查所有人就需要保留表1的全部数据,使用左连接

3)两个表联结条件:两个表通过personId产生联结。

【参考答案】


select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId


四、基础知识点

我们复习下基础知识:表的连接方式有:

  • 内连接:被连接表中的所有列,包括其中的重复列。
  • 外连接: 左连接、右连接和全连接。
  • 左连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
  • 右连接:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
  • 全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。
  • 交叉连接


怎么把多个关联集合导入导出 java left join关联多张表_外连接_05


(注:图中使用颜色表示两表关联)

五、大厂真题试练

蚂蚁金服面试真题: sql中过滤条件放在on和where中的区别

我们知道on和where是筛选条件,那么具体区别是什么?我们分开看下。

  • inner join: 结果没有区别,前者是先求笛卡尔积然后按照on后面的条件进行过滤,后者是先用on后面的条件过滤,再用where的条件过滤。
  • left join、right join:使用left join(right join)时on后面的条件只对右表(左表)有效。

join过程可以这样理解:where的执行顺序在join之后,on执行在join之中。由于join要求索引列保留,所以对于left join来说on对右表生效。