网上看到的一个课程设计,正好练练手。
首先设计数据库
数据库有三张表,分别是班级表,学生表,作业成绩表。
学生表中外键关联班级表,作业成绩表中外键关联学生表。具体如下图所示
班级表
学生表学生表外键关联
作业成绩表
作业成绩表外键关联
第二步:根据需求实现SQL语句
2.1 输入学生成绩
这里插入学生的成绩
INSERT INTO Job (jobName, score, stuID)
SELECT
'作业二' AS jobName, -- 第几次作业
60 AS score, -- 作业分数
s.id AS stuID -- 学生ID,从student表中查找
FROM
student s
WHERE
studentID = 3; -- 根据学号插入分数
2.2 给定学号,显示某位学生作业完成情况
SELECT student.name, Job.score
FROM Job
JOIN student ON Job.stuID = student.studentID
WHERE stuID = (SELECT id
FROM student
WHERE studentID = 1)
ORDER BY Job.jobName; --按照作业次序排名
输出如下:
2.3 给定班级,显示这个班所有学生的成绩完成情况
SELECT student.name AS '姓名',
Job.jobName AS '作业次数',
Job.score AS '分数'
FROM student
JOIN Job ON Job.stuID = student.id
WHERE student.classID = (SELECT id
FROM class
WHERE className = '一班');
输出如下:
2.4 给定学号,修改某位同学的作业信息。
UPDATE Job
SET score = 90
WHERE stuID = (SELECT id
FROM student
WHERE studentID = 1);
2.5 给定某位学生学号,删除该学生信息。
DELETE FROM student
WHERE student.studentID = 3;
分析:
因为前面设置Job表的外键时,使用的是CASCADE,所以这里可以实现删除主键,关联的外键信息自动删除。
2.6 统计各类信息
2.6.1 所有学生的作业总分数(每次占分10%)
SELECT s.name AS '姓名',
SUM(j.score) * 0.1 AS '分数'
FROM student AS s
JOIN Job AS j ON j.stuID = s.id
GROUP BY s.id;
2.6.2 各班级总分数平均分
SELECT c.className AS '班级',
AVG(j.score) * 0.1 AS '平均分数'
FROM student AS s
JOIN Job AS j ON j.stuID = s.id
JOIN class AS c ON s.classID = c.id
GROUP BY s.classID;