免费教程《图解 SQL 面试题》
  • 图解 SQL 面试题
  • 第 1 章:简单查询
  • 图解面试题:如何查找重复数据?
  • 第 2 章:复杂查询
    • 图解面试题:如何查找第 N 高的数据?
  • 第 3 章 多表查询?
    • 图解面试题:多表如何查询?
    • 图解面试题:如何查找不在表里的数据?
    • 图解面试题:你有多久没涨过工资了?
    • 图解面试题:如何比较日期数据?
    • 图解面试题:如何交换数据?
    • 滴滴 2020 年面试题:如何找出最小的 N 个数?
    • 图解面试题:行列互换问题,怎么办?
    • 图解面试题:找出连续出现 N 次的内容?
    • 链家面试题:如何分析留存率?
  • 第 4 章
    • 拼多多面试题:如何查找前 20% 的数据?
    • 图解面试题:如何查找工资前三高的员工
    • 图解面试题:如何分组比较?
    • 图解面试题:双 11 用户如何分析?
    • 图解面试题:如何分析游戏?
  • 第 5 章:项目实战
    • 图解面试题:滴滴 2020 求职真题
    • 滴滴面试题:打车业务问题如何分析?
    • 电商面试题:如何分析复杂业务?
    • 图解面试题:如何分析用户满意度?
    • 图解面试题:如何分析红包领取情况?
    • 图解面试题:如何分析中位数?
    • 小红书面试题:如何分析用户行为?
    • 教育行业案例:学员续费如何分析?
    • 字节跳动面试题:你的平均薪水是多少?
Powered by GitBook
On this page

Was this helpful?

  1. 第 3 章 多表查询?

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

Previous图解面试题:如何查找第 N 高的数据?Next图解面试题:如何查找不在表里的数据?

Last updated 4 years ago

Was this helpful?

【题目】

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

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

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

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

【解题思路】

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

推荐:

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