建设网站需要哪些流程,免费注册跨境电商,wordpress 需要空间,网站运行速度慢大家经常自嘲后端开发就是crud boy嘛#xff0c;今天给大家看一道SQL题#xff0c;我相信很多人写不出来。我们来看一下这个题目。
create table course (id int primary key,name varchar(32) not null
);
create table student (id int primary key,name varchar(32) not …大家经常自嘲后端开发就是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语句步骤如下:
查出最高分
select sum(score) from score group by student_id order by sum(score) desc limit 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) 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.scores2.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最新全套面试资料