当前位置:网站首页>SQL图解面试题:如何找到喜欢的电影?(表连接,语句执行顺序、模糊查询)
SQL图解面试题:如何找到喜欢的电影?(表连接,语句执行顺序、模糊查询)
2022-08-06 12:10:00 【51CTO】
【题目】
某电影平台(类似豆瓣、猫眼电影)用3个表来记录电影信息。“电影表”中是电影编号、电影名称、电影描述信息。

“类别表”是电影分类信息,类别包括:犯罪电影、爱情电影、科幻电影。

“电影类别表”是对应电影(电影表中的电影编号)属于哪一类(类别表中的电影类别编号)

查找“电影表”中电影描述信息包含“机器人”的电影,以及对应的电影类别名称和电影数目(count(电影表.电影编号))。
同时,还需要该电影类别名称对应电影数量(count(电影类别表.电影类别编号))>=5部。
【解题思路】
我们首先观察输出格式要求:

"机器人"是电影描述信息里面包含的内容,在“电影表”中。电影类别名称在“类别表”中,因此需要将两个表联结。
而观察三个表的列名,我们发现“电影表”和“类别表”没有相同的列名,因此无法直接进行联结,需要借助“电影类别表”进行3表联结。

编辑使用哪种联结呢?拿出 《猴子 从零学会SQL》里面的多表联结图。

因为取的是这些表的共同数据,所以使用内联结。三表联结队员的sql如下:
1.查找电影描述信息中包含"机器人"的电影类别名称
描述信息中包含"机器人",需要用到字符串模糊查询(like)。拿出 《猴子 从零学会SQL》里面讲过的字符串模糊查询知识点。
此题是描述信息中包含"机器人",所以应该是 like '%机器人%'。使用where和like进行模糊查询,结果如下:

2.上述电影类别名称对应的电影数量(电影类别表.电影类别编号)>=5部
按照输出格式要求,我们会想到先分组(按电影类别,group by c.电影类别名称)汇总(电影数量,count(f.电影编号)),再用having子句对分组结果进行筛选(having count(c.电影类别编号) >= 5)。

可以看出结果为Null了,是这样吗?
下图红色部分中的科幻类别对应的电影数量为5也满足这些条件,但是为什么按照上述语句得出的结果Null?

因为该题有个陷阱:按照题目顺序,我们容易先用where和like查找出对应的电影,最后再用having count(电影类别编号) >= 5来筛选,最后会发现结果为Null。
但是, 《猴子 从零学会SQL》里讲过的SQL运行顺序是这样的:

会先运行where子句,此时结果只有一行了:

所以count(电影类别编号) = 1,再用having count(电影类别编号) >= 5来筛选结果只会是Null。
而题目中的上述分类对应电影数量>=5部,是指该电影类别在原始表中的电影数量>= 5,而不是先用where子句筛选以后的表。

那么,这就需要把having子句放在where子句之前,如何到呢?
也就是,需要先对原始表使用条件(电影类别名称对应的电影数量>=5部)筛选数据,然后再运行条件(电影描述信息包含“机器人”的电影对应的电影类别名称以及电影数目)筛选数据。
这就需要把用having子句筛选出的数据作为临时表。所以,正确的答题步骤修改为以下内容。
1.查询出电影类别编号数量大于5的电影类别编号作为临时表(记为右表)。

2.与前面已经内联结的三个表(左表)通过电影类别编号再进行联结。
用哪种联结方式呢?
因为要用到电影类别编号数量大于5的电影类别编号,右表为筛选后的结果。因此需要用到右联结,只保留右表的全部数据,即电影类别编号为3的数据。


3.查找电影描述信息中包含"机器人"的电影
在上一步sql中加入where子句,进行模糊查询

4.根据输出格式要求选择对应的列并用group by对电影类别名称分组

最终sql如下:

【本题考点】
1.考查多表联结。需要知道什么情况下使用哪种联结。

2.模糊查询like
3.考查sql的运行顺序,记住下面这张图。

【举一反三】
从下面的科目表中查找姓“猴”的学生对应的科目类型以及科目数量。同时,还需要满足该科目类型对应的科目数量大于或等于3。


边栏推荐
- LeetCode 897. Searching Trees in Ascending Order
- 机器学习实战-多项式回归结合Pipeline管道机制
- 高性能云原生数据对象存储MinIO实战-上
- Talk about the dynamic proxy IP
- LeetCode 897. 递增顺序搜索树
- Kubernetes DevOps 工具
- 8 medical data security scenario solutions of Meichuang Technology are launched!
- PS6603-USB PD protocol SINK terminal output controller chip
- 因宇航服存在安全问题 NASA叫停国际空间站所有太空行走任务
- Kubernetes 污点和容忍
猜你喜欢
随机推荐
NITZ time zone update air interface message
Kubernetes 怎么优雅升级
JUC线程池(二): 一文搞定对线程池的疑问 - ThreadPoolExecutor详解
stp简单配置
半年总结以及状态调整
解析隐式类型转换操作operator double() const,带你了解隐式转换危害有多大
【Web3 系列开发教程——创建你的第一个 NFT(6)】为 NFT 设置价格
动物主题网页设计(小白必看)
主板故障!教你如何用主板诊断卡检测维修电脑主板故障
因宇航服存在安全问题 NASA叫停国际空间站所有太空行走任务
哈希表 | 两个数组的交集 | leecode刷题笔记
纯色山鹪莺
Absolutely!Ali people explain tens of billions of high-concurrency systems in 7 parts (full-color booklet open source)
NC2 rearrangement linked list
剧照怎么找?哪里获取高清资源?这9个网站渠道相见恨晚! 原创
Kubernetes微服务、容器介绍
Microsoft's new service allows businesses to expand access to their threat intelligence repository
NAS 硬件采购配置记录
怎样解决开始菜单的图标不能拖放的问题?
Apscheduler scheduled task









