You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子查询中选取最大值?附学生与课程表数据示例

在子查询中选取最大值的实现方法

嘿,我来帮你搞定子查询里取最大值的问题!结合你给出的Student和Class两张表,我先默认你想要的是找出每个班级里最晚报名的学生信息——要是你的实际需求有小调整,也能基于这个思路改哈。

首先先明确你的表结构:

你的表结构

Student表

姓名邮箱
Arturo Vidalarturo.vidal@usm.cl
Bastian Quezadabastian@usm.cl
Javier Jeriajavier@usm.cl
Sebastian Piñerasebastian@presidente.cl
Sebastian Gallardosebastian@usm.cl

Class表

classId邮箱signUpDate
1sebastian@usm.cl2018-01-01
1javier@usm.cl2019-10-01
1bastian@usm.cl2018-07-01

下面给你两种常用的子查询取最大值的实现方式:

方法一:用IN子查询获取每个班级的最大报名日期

这种方法适合大多数数据库,先通过子查询按班级分组,拿到每个班级的最晚报名日期,再关联学生表筛选出对应记录:

SELECT s.姓名, s.邮箱, c.classId, c.signUpDate
FROM Student s
JOIN Class c ON s.邮箱 = c.邮箱
WHERE (c.classId, c.signUpDate) IN (
    SELECT classId, MAX(signUpDate)
    FROM Class
    GROUP BY classId
);

执行这个查询后,就会返回班级1里最晚报名的Javier Jeria的信息,因为他的报名日期2019-10-01是这个班级里最大的。

方法二:关联子查询(兼容旧版数据库)

如果你的数据库不支持上面的行构造器语法(比如某些旧版本的MySQL),可以用关联子查询的方式,子查询会根据外层当前的班级ID,动态找出该班级的最大报名日期:

SELECT s.姓名, s.邮箱, c.classId, c.signUpDate
FROM Student s
JOIN Class c ON s.邮箱 = c.邮箱
WHERE c.signUpDate = (
    SELECT MAX(signUpDate)
    FROM Class
    WHERE classId = c.classId
);

这个写法逻辑和第一种一致,只是换了子查询的关联方式,兼容性更好。

小提示:如果同一个班级里有多个学生在最晚报名日期当天报名,这两个查询都会返回所有符合条件的学生;如果你只需要其中一条,可以结合LIMIT或者添加额外筛选条件调整~

内容的提问来源于stack exchange,提问作者M Aubel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:37