如何通过SQL关联Student表与Tuition表统计各院系奖学金发放总数?
查询每个院系已发放的奖学金数量(JOIN实现)
嘿,这个需求用JOIN来实现其实很清晰,我先给你理清楚思路,再给你具体的SQL示例~
首先,咱们得明确两个表的关联逻辑:Student表(存院系)和Tuition表(存奖学金)是通过「学生ID」关联的——每个学生属于某个院系,而奖学金是发放给学生的,所以通过学生ID就能把院系和对应的奖学金记录绑定起来。
先假设表结构(如果你的字段名不一样,替换成自己的就行)
- Student表:
student_id(学生主键,唯一标识每个学生)、department_name(院系名称,比如"计算机学院") - Tuition表:
tuition_id(奖学金记录主键)、student_id(关联Student表的外键)、is_issued(标记是否已发放,比如1=已发放,0=未发放)
场景1:只查询有已发放奖学金记录的院系
用INNER JOIN,它只会返回两个表中匹配成功的记录,也就是只有当某个院系有学生拿到已发放的奖学金时,才会出现在结果里:
SELECT s.department_name, COUNT(t.tuition_id) AS issued_scholarship_count -- 统计已发放的奖学金笔数 FROM Student s INNER JOIN Tuition t ON s.student_id = t.student_id -- 通过学生ID关联两张表 WHERE t.is_issued = 1 -- 筛选出已发放的记录 GROUP BY s.department_name; -- 按院系分组统计
场景2:查询所有院系,包括没有任何已发放奖学金的院系(这类院系数量显示0)
用LEFT JOIN,它会保留Student表的所有记录,即使对应的Tuition表没有匹配的已发放奖学金记录。这时统计数量时,COUNT(t.tuition_id)会自动忽略NULL值,返回0:
SELECT s.department_name, COUNT(t.tuition_id) AS issued_scholarship_count FROM Student s LEFT JOIN Tuition t ON s.student_id = t.student_id AND t.is_issued = 1 -- 把已发放的条件放到JOIN里,避免过滤掉无数据的院系 GROUP BY s.department_name;
几个关键注意点
- 如果你的Student表是用
department_id(院系ID)而不是直接存department_name,那建议和一个单独的Department表关联,但根据你的描述,Student表已经存了院系信息,所以上面的示例完全适用。 - 确保
Student.student_id和Tuition.student_id是正确关联的(最好设置外键约束),避免出现关联错误的数据。 - 如果你的"数量"指的是奖学金总金额而非笔数,把
COUNT(t.tuition_id)换成SUM(t.scholarship_amount)即可,记得用COALESCE(SUM(...), 0)处理NULL值(比如没有奖学金的院系显示0而不是NULL)。
内容的提问来源于stack exchange,提问作者taraloca
相关产品推荐
相关产品推荐

