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

数据库技术问询:学生数统计展示及两类课程查询实现

解决方案:学生管理系统SQL需求实现

需求一:统计学生数量并显示在另一张表

要实现这个需求,核心是统计学生总数并将结果存入目标表,分两种场景处理:

场景1:目标统计表尚未创建

先创建用于存储结果的表,再插入统计数据:

-- 创建统计结果表
CREATE TABLE Student_Statistics (Total_Students INT NOT NULL);

-- 插入学生总数(主键唯一的话直接用COUNT(*)即可,加DISTINCT是防止意外重复)
INSERT INTO Student_Statistics (Total_Students)
SELECT COUNT(DISTINCT Roll_no) FROM Student;

场景2:目标统计表已存在(更新统计数据)

直接用UPDATE语句覆盖或更新已有统计值:

UPDATE Student_Statistics
SET Total_Students = (SELECT COUNT(*) FROM Student);

需求二:两类课程查询实现

先明确你的表结构:

  • Student:Roll_no(主键)、Name、Course_id(外键,关联Course.Course_no)
  • Course:Course_no(主键)、Course_name

问题a:查询有超过2名学生选课的课程详情

你写的SQL执行失败,主要是两个语法逻辑问题:

  1. 分组后筛选结果要用HAVING,不能用WHERE(WHERE是筛选行数据,HAVING才是筛选分组后的结果)
  2. 外层WHERE后的子查询会返回多个值,需要用IN或EXISTS来建立关联匹配

给你两种适合初学者理解的可行写法:

写法1:用IN结合分组统计

SELECT *
FROM Course
WHERE Course_no IN (
    SELECT Course_id -- 注意这里是Student表的外键,对应Course表的主键Course_no
    FROM Student
    GROUP BY Course_id
    HAVING COUNT(*) > 2 -- 筛选学生数超过2的课程
);

写法2:用EXISTS(大数据量下性能更优)

SELECT c.*
FROM Course c
WHERE EXISTS (
    SELECT 1
    FROM Student s
    WHERE s.Course_id = c.Course_no
    GROUP BY s.Course_id
    HAVING COUNT(*) > 2
);

问题b:查询包含选课数量统计列的Course表

需要把Course表和学生选课统计做左连接,这样即使没有学生选的课程,也会显示选课数为0:

SELECT 
    c.Course_no,
    c.Course_name,
    COUNT(s.Roll_no) AS Enrollment_Count
FROM Course c
LEFT JOIN Student s ON c.Course_no = s.Course_id
GROUP BY c.Course_no, c.Course_name -- 按课程主键分组,确保每个课程只显示一行
ORDER BY Enrollment_Count DESC;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:43