数据库技术问询:学生数统计展示及两类课程查询实现
解决方案:学生管理系统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执行失败,主要是两个语法逻辑问题:
- 分组后筛选结果要用
HAVING,不能用WHERE(WHERE是筛选行数据,HAVING才是筛选分组后的结果) - 外层
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
相关产品推荐
相关产品推荐

