leetcode -- sql -- 获取各课程第二高成绩的人的信息

本文详细介绍了使用SQL语句查询数据库中每个学科的最高分和次高分学生的具体方法,通过逐步操作展示如何进行复杂的联表查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 表结构

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `student_id` int(11) NOT NULL COMMENT '学生id',
  `class_id` int(11) NOT NULL COMMENT '学科id',
  `score` int(11) NOT NULL COMMENT '成绩',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

 

-- 第一步 : 获得各个部门成绩最高的数值


SELECT MAX(score) score , class_id
                                from student
                                GROUP BY class_id


-- 第二部 :将查出来的子表和原来的表关联查询,查询出每科目最大分数的人


SELECT b.*
FROM (
                SELECT MAX(score) score , class_id
                        from student
                        GROUP BY class_id
            )a
LEFT JOIN student b on a.class_id = b.class_id and a.score = b.score


-- 第三步 :获得各个部门第二高的成绩的人,就是将第二部获得的人排除掉,然后获得最大


SELECT MAX(score) score , class_id
from student
where id not in (
                                    SELECT b.id
                                    FROM (
                                        SELECT MAX(score) score , class_id
                                                from student
                                                GROUP BY class_id
                                    )a
                                    LEFT JOIN student b on a.class_id = b.class_id and a.score = b.score
                                )
GROUP BY class_id

 

-- 第四部 :根据第二大的成绩和课程id获得所有信息

 

SELECT b.*
FROM (
                SELECT MAX(score) score , class_id
                from student
                where id not in (
                                                    SELECT b.id
                                                    FROM (
                                                        SELECT MAX(score) score , class_id
                                                                from student
                                                                GROUP BY class_id
                                                    )a
                                                    LEFT JOIN student b on a.class_id = b.class_id and a.score = b.score
                                                )
                GROUP BY class_id
            )a
LEFT JOIN student b on a.class_id = b.class_id and a.score = b.score

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值