图解面试题:多表如何查询?

【题目】  

现在有两个表,“学生表”记录了学生的基本信息,有“学号”、“姓名”。

“成绩”表记录了学生选修的课程,以及对应课程的成绩。

这两个表通过“学号”进行关联。

现在要查找出所有学生的学号,姓名,课程和成绩。

【解题思路】

1.确定查询结果

题目要求查询所有学生的姓名,学号,课程和成绩信息

select 学号,姓名,课程,成绩

查询结果的列名“学号”、“姓名”,在“学生”表里,列名“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。

2.哪种联结呢?

涉及到多表查询,在之前的课程《从零学会sql:多表查询》里讲过需要用到联结。

多表的联结又分为以下几种类型:

1)左联结(left join),联结结果保留左表的全部数据

2)右联结(right join),联结结果保留右表的全部数据

3)内联结(inner join),取两表的公共数据

这个题目里要求“所有学生”,而“所有学生”在“学生”表里。为什么不在“成绩”表里呢?

如果有的学生没有选修课程,那么他就不会出现在“成绩”表里,所以“成绩”表没有包含“所有学生”。

所以要以“学生”表进行左联结,保留左边表(学生表)里的全部数据。

from 学生信息表 as a left join 成绩表 as b

3.两个表联结条件是什么?

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

on a.学号=b.学号

4.最终sql

select a.学号,a.姓名,b.课程,b.成绩
from 学生 as a
left join 成绩 as b
on a.学号=b.学号;

运行结果:我们看到学号4都课程为空值,表示这名学生没有选修课程。

【本题考点】

考察多表联结,以及如何选择联结的类型。记住课程里讲过的下面这张图,遇到多表联结的时候从这张图选择对于的sql。

【举一反三】

有下面两个表

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

FirstName, LastName, City, State

【思路】

从表的结构可以看出,表1(Person)是人的姓名信息,表2(Address)是人的地址信息。

1)查询结果是两个表里的列名,所以需要多表查询

2)考虑到有的人可能没有地址信息,要是查询结构要查所有人,需要保留表1(Person)里的全部数据,所以用左联结(left join)

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

【参考答案】

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

推荐:如何提升你的分析技能,实现升职加薪?

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你希望理解算法中的每一步具体操作时,图解是一种非常好的方式。以下是使用图解的方式详细说明如何实现二分答案的示例过程。 假设有如下输入数据: ``` 5 3 1 3 6 7 9 ``` 其中,第一行的 `5` 表示糖果的数量,第二行的 `1 3 6 7 9` 表示糖果的价格,第二行中的每个数字之间用空格隔开。第三行的 `3` 表示要组合的糖果数量。 首先,对所有糖果的价格进行排序。这里使用快速排序算法来实现。 ``` 1 3 6 7 9 ``` 然后,确定二分的上下界。最小的甜蜜度一定是 0,最大的甜蜜度一定是所有糖果价格的最大值减去最小值。在这个例子中,最大的甜蜜度为 8。 ``` left = 0, right = 8 ``` 下面进入二分算法的循环中。首先计算中间值 `mid`,并调用 `check` 函数来判断当前的甜蜜度是否可行。在本例中,当 `mid = 4` 时可行,因此将二分的下界向上移动。 ``` mid = 4 left = 4, right = 8 ``` 接下来,计算新的中间值 `mid`,并再次调用 `check` 函数。在本例中,当 `mid = 6` 时可行,因此将二分的下界再次向上移动。 ``` mid = 6 left = 6, right = 8 ``` 最后,计算新的中间值 `mid`,并再次调用 `check` 函数。在本例中,当 `mid = 7` 时不可行,因此将二分的上界向下移动。 ``` mid = 7 left = 6, right = 6 ``` 此时,二分算法结束,最终的答案即为最大的可行甜蜜度,即 `6`。 总结一下,二分答案的核心思想是通过二分法来查找一个可行的解。在本例中,我们通过不断缩小甜蜜度的范围,最终找到了最大的可行甜蜜度 `6`。由于二分答案的时间复杂度为 O(log n),因此它在实际应用中非常高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值