这是一个系列文章,涵盖了SQL最常用的知识点。题目来自于leetcode的sql题,文章列出了问题-完整解析-答案-知识点拓展-BAT等大厂面试真题。希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦。
一、问题
现有两张表,一张名为”学生”表,包含学生编号,学生姓名,出生年月,性别。一张名为“成绩”表,包含了学生选修的课程,以及对应课程的成绩。 两表通过“学号”进行关联。
现在要求查出每一位学生的信息,包括学生编号,学生姓名,课程和成绩信息。
二、数据准备
create
三、解答
【解题思路】
- 1.明确题目要求的结果
根据题干要求的所有学生的信息姓名,学号,课程和成绩信息。我们知道:“学号”、“姓名”,保存在“学生”表里,“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。
- 2.确定连接方式
注意题干中的要求所有的学生,有可能学生有注册信息但没有课程成绩信息,所以以学生表作为主表。考察的知识点为表连接中的外连接中的左连接或是右连接。
- 3.确定连接两表的主键
两个表都有“学生编号”,所以联结条件为学生编号。
问:如果问题为查找有成绩信息的同学的信息包括学生编号,学生姓名,课程和成绩信息。改如何写?
[代码]
#
[本题解答]
有两张表,编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName
【思路】
从题目看出,表1(Person)是人的姓名信息,表2(Address)是人的地址信息。
1)题目要求的结果是两个表里的信息,所以需要多表查询
2)有的人没有地址信息,所以要求查所有人就需要保留表1的全部数据,使用左连接
3)两个表联结条件:两个表通过personId产生联结。
【参考答案】
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId
四、基础知识点
我们复习下基础知识:表的连接方式有:
- 内连接:被连接表中的所有列,包括其中的重复列。
- 外连接: 左连接、右连接和全连接。
- 左连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
- 右连接:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
- 全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。
- 交叉连接 :也称迪卡尔积。不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,如果带where,返回或显示的是匹配的行数。
(注:图中使用颜色表示两表关联)
五、大厂真题试练
蚂蚁金服面试真题: 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对右表生效。