总分排名前三的学生

SQL 题: 求总分排名前三的学生。

三张表:

-- Create the course table
CREATE TABLE course (
   id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(200) NOT NULL
);

-- Create the student table
CREATE TABLE student (
   id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(200) NOT NULL
);

-- Create the score table
CREATE TABLE score (
   id INT AUTO_INCREMENT PRIMARY KEY,
   course_id INT NOT NULL,
   stu_id INT NOT NULL,
   score INT NOT NULL
);

-- Insert sample data into the course table
INSERT INTO course (name) VALUES
('Math'),
('Science'),
('History');

-- Insert sample data into the student table
INSERT INTO student (name) VALUES
('John Smith'),
('Alice Johnson'),
('Bob Davis');

-- Insert sample data into the score table
INSERT INTO score (course_id, stu_id, score) VALUES
(1, 1, 95),
(1, 2, 88),
(1, 3, 75),
(2, 1, 92),
(2, 2, 89),
(2, 3, 78),
(3, 1, 87),
(3, 2, 91),
(3, 3, 79);

我们先来看一下学生的分数情况:

select student.name `name`,course.name course,score.score score from score,course,student
where score.stu_id=student.id and course.id=score.course_id;

要求一: 求总分最高的学生,返回学生的姓名和总分

# 1. 求解出最高总分
select SUM(score) from score group by stu_id order by SUM(score) desc limit 1;

# 2. 查询出所有总分等于该值的学生id和总分
select stu.id id,SUM(score) score from student stu,score sc where stu.id=sc.stu_id
group by stu.id having SUM(sc.score) = 
(select SUM(score) from score group by stu_id order by SUM(score) desc limit 1);

# 3. 查询出总分排名第一的学生的相关信息
select stu.name name,t.score from student stu inner join (

select stu.id id,SUM(score) score from student stu,score sc where stu.id=sc.stu_id
group by stu.id having SUM(sc.score) = 
(select SUM(score) from score group by stu_id order by SUM(score) desc limit 1)

) t where t.id=stu.id;

注意点:

  1. 可能存在多个学生总分都是最高的
  2. 聚合函数必须配合group by使用
  3. 当使用group by时,select查询字段只能是分组列或者聚合函数

要求二: 求解单科最高的学生信息

# 1. 求解每一门课程的最高分
select course_id c_id,MAX(score) score from score group by course_id;

# 2. 查询每一课得到最高分的学生信息
select sc.stu_id,c.c_id,c.score from score sc inner join (
   select course_id c_id,MAX(score) score from score group by course_id
 ) c on sc.course_id = c.c_id and sc.score=c.score;
 
 # 3. 补充返回用户名和课程名等信息
select stu.name 学生名,course.name 课程名,c.score 单科最高分数 from ( ( score sc inner join (
   select course_id c_id,MAX(score) score from score group by course_id
 ) c on sc.course_id = c.c_id and sc.score=c.score ) inner join student stu on sc.stu_id=stu.id )
 inner join course on course.id=sc.course_id;

注意点:

  1. 多表JOIN怎么写

要求三: 求解总分排名前三的学生信息

# 1. 查询出前三的总分
select distinct SUM(score) from score group by stu_id order by SUM(score) desc limit 3; 

# 2. 查询出所有总分等于该值的学生id和总分
select stu.id id,SUM(score) score from student stu,score sc where stu.id=sc.stu_id
group by stu.id having SUM(sc.score) in (select distinct SUM(score) from score group by stu_id order by SUM(score) desc limit 3);

全部评论
这家大厂还缺ios算法类的,感兴趣可以投投,会优先处理,https://www.nowcoder.com/discuss/548168897879379968
点赞 回复 分享
发布于 2023-11-01 10:56 湖北

相关推荐

2025-12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
12
65
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务