【第5章】多表查询面试题

本章介绍第 2 章 2.2.4 节 “多表查询”相关的知识和面试题。考查知识点:

y 连接的类型(左连接、右连接、内连接等)、多表连接的 SQL 语句写法。

多表查询就是将数据库中两张及以上的表合并到一起再进行查询的操作。多表查询也叫作多表连接。

5.1多表查询问题的解题步骤

遇到多表查询(多表连接)问题时,解题步骤如下。

(1)什么时候需要用多表连接?

当需要查询的数据涉及多个表时,需要想到用多表连接的方法。

(2)选择哪种类型的连接?

SQL 中多表连接的类型包括内连接 (inner join)、左连接 (left join)、右连接 (right join)、全连接 (full join)。如何选择呢?

在实际业务中,当想要生成固定行数的表单或者特别说明了要哪一个表里的全部数据时, 就使用左连接或者右连接。其他情况用内连接,取两个表的公共部分。

全连接的本质是返回左右表中的所有数据,但是全连接在实际工作中应用频率比较低,因为很少有业务问题需要用两个表中的所有数据。同时,有些数据库不支持全连接功能。

(3)多个表之间通过哪个字段连接?

一般多个表会通过某个字段产生关联,这在实际业务问题中会有明确说明。

(4)写出对应连接的 SQL 语句。

多表连接使用join 操作语句。各个类型连接的SQL 语句,总结为如图 5.1 所示,可以说, 记住这张图中的 SQL 连接语句,就掌握了多表查询。读者可以把这张图看作多表查询的万能模板。

万能模板:多表查询

5.2多表查询面试题

面试题18:多表查询的应用

【题目】

有“学生信息表”和“学生成绩表”,这两个表通过字段“学号”关联,如表 5.1 和表 5.2 所示。现在要查找出所有学生的学号、姓名、课程和成绩。 

【解题思路】

(1)什么时候需要用多表连接?

查询结果中的学号、姓名在“学生信息表”中,课程、成绩在“学生成绩表”中。当需要查询的数据涉及多个表时,需要想到用多表连接。

(2)选择哪种类型的连接?

题目中要求查找“所有学生”,而“所有学生”在“学生信息表”里。为什么“所有学生” 不在“学生成绩表”里呢?

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

用“学生信息表”(左表)左连接“学生成绩表”,并保留“学生信息表”的全部数据。

(3)多个表之间通过哪个字段连接?

这两个表通过字段“学号”进行连接(on a. 学号 =b. 学号)。

(4)写出对应连接的 SQL 语句。

从图 5.1 所示的多表查询图中找出“左连接”的 SQL 语句。把左连接的 SQL 语句套用到本题中,就得到如下答案:

这个面试题中,“学生信息表” 用 as 关键字重命名为别名 a,“学生成绩表”用 as 关键字重命名为别名 b。需要注意的是,多表查询时,当两个表有重复字段时,为了区别,需要在使用的字段前面加上表的别名,标明字段来自哪个表。因为在部分数据库中,如果不写上重名字段的来源,查询时就会报错。

面试题19:退款分析

【题目】

有“订单表”和“退款表”,这两个表通过字段“订单号”“商品号”关联,如图 5.2 所示。分析各订单的退款率(这里的退款率公式为:退款率 = 退款金额 / 订单金额)。

【解题思路】

(1)什么时候需要用多表连接?

求退款率,需要知道退款金额和订单金额。退款金额在“退款表”中 , 订单金额在“订单表” 中 , 故要使用多表连接。涉及多个表时,需要想到用多表连接。

(2)选择哪种类型的连接?

因为要分析各订单的退款率,全部订单在“订单表”中,所以要保留“订单表”中的全部数据。因此,用“订单表”(左表)左连接“退款表”。

(3)多个表之间通过哪个字段连接?

这两个表通过“订单号”和“商品号”关联。连接条件如下:

(4)写出对应连接的 SQL 语句。

从图 5.1 所示的多表查询图中找出“左连接”的 SQL 语句,套用到本题中,如下:

 

(5)计算退款率。

退款率 = 退款金额 / 订单金额。

题目要求计算每个订单号的退款金额,所以需要用到分组汇总。按“订单号”分组(group by 子句),然后用汇总函数(求和 sum())计算出总的退款金额、总的订单金额,就可以得到退款率:

最终 SQL 语句的书写方法如下:

查询结果如表 5.3 所示。

面试题20:库存分析

【题目】

“订单表”记录了各商品不同尺码近 7 天的销量数据,“库存表”记录了最新的各商品不同尺码库存数。这两个表通过“商品号”“尺码”关联,如表 5.4 和表 5.5 所示。分析每个商品不同尺码的存销比 , 其中存销比 = 库存数 / 近 7 天销量。

【解题思路】

(1)什么时候需要用多表连接? 存销比 = 库存数 / 近 7 天销量。

库存数在“库存表”中 , 近 7 天销量在“订单表”中,涉及多个表时,需要想到用多表连接。

(2)选择哪种类型的连接?

题目没要求选出哪个表的全部数据,所以,我们用内连接,取两个表的公共部分。

(3)多个表之间通过哪个字段连接?

这两个表通过“商品号”和“尺码”关联。

(4)写出对应连接的 SQL 语句。

从图 5.1 所示的“多表查询图”中找出“内连接”的 SQL 语句,套用到本题中,如下:

(5)计算存销比。

存销比 = 库存数 / 近 7 天销量。

题目要求计算每个商品不同尺码的存销比,所以需要分组汇总,按“商品号、尺码”分组

(group by 子句)。

汇总的时候用求和函数 sum():

最终 SQL 语句的书写方法如下: 

查询结果如表 5.6 所示。

面试题21:营销带货销量分析

【题目】

某电商公司请了某红人做推广营销 , 并设置专属优惠券 , 券码为 01,主推品类 B,我们将满足以下条件的订单作为红人订单:包含主推品类 B,且使用红人专属优惠券。

表 5.7 和表 5.8 所示为该公司的“订单表”和“品类表”。“订单表”记录了订单流水信息, 表中的“优惠券码”字段值为字符串类型。“品类表”记录了“商品号”对应的品类。请分析该红人带来多少订单和销售额。

 

【解题思路】

现在需要分析该红人带来多少订单和销售额。注意这里计算的是整个订单的总销售额,而不是该订单中满足条件的商品金额。

例如,一个订单中有两个商品 , 其中有一个商品满足条件 , 则该订单为目标订单,我们需要计算这个订单的总销售额。

我们将问题拆解为下面两步。

(1)找出红人订单。

红人订单,也就是满足条件——优惠券码为 01 且商品类型为 B 的订单。

“优惠券码”在“订单表”中,“商品类型”在“品类表”中,涉及多个表,需要想到用多表连接。题目没要求选出哪个表的全部数据,所以我们用内连接,取两个表的公共部分。

通过观察,可以发现这两个表通过“商品号”关联,如图 5.3 所示。

 

用内连接,SQL 语句的书写方法如下:

多表连接结果如图 5.4 所示。

找出符合条件的红人订单,例如图 5.4 中订单号为“00A”的订单就是符合条件的红人订单, 在多表连接中加入 where 条件,SQL 语句的书写方法如下:

把该查询结果标记为临时表 A1,如图 5.5 所示。

(2)统计红人订单的订单数和总销售额。

第(1)步已经得到了红人订单号,那么用这个订单号在“订单表”中就可以筛选出红人订单,然后用汇总函数统计订单数(count() 函数,注意去重)、总销售额(sum() 函数),如图 5.6 所示。

 

注意,这里筛选条件用 in 语句,因为临时表 A1(子查询)的结果可能有多个数据。SQL 语句的书写方法如下:

将临时表 A1(子查询)的 SQL 语句代入上述SQL 语句,即可得到本题最终的 SQL 语句:

查询结果如表 5.9 所示。

【本题考点】

(1)考查面对复杂问题的拆解分析能力。

(2)考查多表查询的使用。涉及多个表时,需要想到用多表连接。

(3)考查汇总函数的灵活应用。

(4)考查 in(子查询)语句的灵活应用。

面试题22:寻找设计师

【题目】

某服装店铺有两个表:“物料清单表”记录了设计款号(服装款号)、设计师、物料号,“面料信息表”记录了物料类型信息,如表 5.10 和表 5.11 所示。

分析设计师 01 使用了多少种面料和多少种辅料。

【解题思路】

(1)多表连接判断。

现在要分析设计师 01 使用了多少种面料和多少种辅料。

通过观察这两个表,可以发现面料、辅料是“面料信息表”中“物料类型”列中的值,而“设计师”在“物料清单表”中。所以涉及多个表,可以用多表连接。

题目没要求选出哪个表的全部数据,所以我们用内连接,取两个表的公共部分。通过观察,可以发现这两个表通过“物料号”关联,如图 5.7 所示。

内连接的 SQL 语句的书写方法如下:

(2)筛选满足条件的数据。

筛选条件是设计师为 01 且物料类型为面料和辅料,在第(1)步的 SQL 语句中加入以下条件:

(3)计算设计师 01 使用了多少种面料和多少种辅料。

这句话翻译成白话就是,该设计师使用物料类型(面料、辅料)的数量,所以可以用分组汇总。

按物料类型分组(group by 子句),然后汇总(计数函数 count())。最终的 SQL 语句如下:

查询结果如表 5.12 所示。

面试题23:三表连接

【题目】

表 5.13 所示“订单表”记录了商品的支付金额,表 5.14 所示“运费表”记录了商品的运费,表 5.15 所示“品类表”记录了商品类型。

 

现需要查询每个商品类型的运费占比,其中,运费占比 = 总运费 / 总支付金额。

【解题思路】

计算每类商品的运费占比需要知道支付金额、运费和商品类型。

支付金额、运费和商品类型分别在“订单表”、“运费表”和“品类表”中,所以需要连接三个表。然后按照商品类型分组 , 汇总计算支付金额和运费,从而得到运费占比。

(1)连接

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

SQL面试宝典 文章被收录于专栏

本书以SQL的基础知识为出发点,从SQL的简单查询、汇总函数、分组,到多表查询、窗口函数等SQL高级功能,逐一进行介绍与讲解,基本涵盖了学习SQL过程中需要掌握的主要内容。 本书结合大量的面试题,让读者清楚地了解如何用所学的SQL知识解决工作中的实际问题。提供了从不同行业、不同岗位的业务场景出发的实战项目训练,便于读者在实践中学习,巩固知识和技能,理解与掌握相关内容,并将其快速应用于实际工作中。

全部评论
点赞 回复
分享
发布于 03-07 20:47 河北
点赞 回复
分享
发布于 03-07 20:54 黑龙江
滴滴
校招火热招聘中
官网直投
点赞 回复
分享
发布于 03-07 20:59 辽宁
点赞 回复
分享
发布于 03-07 21:09 山东
点赞 回复
分享
发布于 03-07 21:16 四川
点赞 回复
分享
发布于 03-07 21:22 广东
点赞 回复
分享
发布于 03-07 21:28 江西
点赞 回复
分享
发布于 03-07 21:34 湖北

相关推荐

12 1 评论
分享
牛客网
牛客企业服务