这道经典SQL面试问题你会吗?

2023-11-03 20:20

本文主要是介绍这道经典SQL面试问题你会吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家经常自嘲后端开发就是crud boy嘛,今天给大家看一道SQL题,我相信很多人写不出来。我们来看一下这个题目。

create table course (id int primary key,name varchar(32) not null
);
create table student (id int primary key,name varchar(32) not null
);
create table score (id int primary key,course_id int not null,student_id int not null,score int not null
);

这三张表也是我经常在面试里面有问到的,这三张表的含义是非常好理解的,但是基于这三张表可以研发出来很多复杂的业务场景SQL面试题。我们先初始化一些课程信息和学生分数信息。

insert into course values(1,`语文`),(2,`数学`),(3,`外语`);
insert into student values(1,`小张`),(2,`小王`),(3,`小马`);
insert into score values(1,1,1,80),(2,2,1,90),(3,3,1,70);
insert into score values(4,1,2,70),(5,2,2,90),(6,3,2,80);
insert into score values(7,1,3,80),(8,2,3,60),(9,3,3,70);

总分最高的学生

求总分最高的学生他的分数是多少?这个题目其实是有一些歧义的,是总分最高呢,还是单科最高呢?作为面试的你对于题意本身理解不清晰的情况下,你应该反问面试官,而不是直接就开始写。
我们把这两种情况都来写一下,先求总分最高的学生,找到这个score表,那既然是总分,我们肯定要用sum函数,那既然用到sum,那是不是要做一个分组,基于什么分组呢?目标是要求总分最高的学生,自然想到应该基于student_id去分组,通过score表按照student_id分组我们就能拿到总分及相应的student_id,但怎么查到学生的名字呢?
很多同学很自然而然就想到去join这个student的表,但是这里隐藏一个问题,就是总分最高的可能不止一个学生,我们是通过总分进行的分组,分组后只能取到其中某一个student_id。那应该怎么去做呢?其实还要再去查一遍这个score表,把相应取得这个总分的学生的所有id都查出来,然后再去跟student的做一个连接,这样才能查出完整的数据。这个思路清晰了之后,我们的SQL语句步骤如下:

  1. 查出最高分
select sum(score) from score group by student_id order by sum(score) desc limit 1
  1. 查出最高分所有的学生ID。
select distinct(student_id) from score 
group by student_id having sum(score)=(select sum(score) from score 
group by student_id order by sum(score) desc limit 1) 
  1. join学生信息表得到获得最高分的学生信息
select s.name,t.score from student s 
right join (select distinct(student_id), sum(score) from score 
group by student_id having sum(score)  = (select sum(score) from score 
group by student_id order by sum(score) desc limit 1)) t on s.id = t.student_id

单科最高的学生

大家想一下,单科最高的话应该是要通过课程去分组,同样的获取每个单科分数最高的学生可能也不止一个,所以分组后你还要去跟score再去做一次连接,基于course id跟max score再去连一下score表从而得到每一科最高分的学生的id。
所以这个问题也是分三步,第一步就是通过course id去分组查到单科的最高分,第二步就是通过这个score表再去跟这个最高分和对应的课程id去进行right join。这里为什么是right join 大家可以思考一下,这样就查到了取得这个课程最高分的所有学生,这一步写出来了,其实最后就很简单了,去连接两个学生表跟课程表就能拿到学生的名字跟课程的名字,得到最终的SQL语句:

select s.name,c.name,s2.max_score from score s1 
right join (select max(score) max_score,course_id from score 
group by course_id) on s1.course_id = s2.course_id and s1.score=s2.max_score
left join course c on c.id = s1.course_id left join student s on s.id = student_id

虽然大部分互联网公司这种自动化的SQL生成器,也并不建议在系统里面去做连接查询,但是也有很多情况,比如说产品、运营要拉一些数据,排查一些线上问题,确实要去写一些比较复杂的CQL,而且你能写出这个SQL,代表你有两个能力,第一个就是你对业务本身理解是比较到位的,第二个就是你Sql本身的功底也是比较扎实的。
互联网行业不景气,但切莫心浮气躁,打牢基本功,才能厚积薄发!

关注公众号【小白技术圈】,回复f04即可获得2023最新全套面试资料

这篇关于这道经典SQL面试问题你会吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/340644

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID