-- 学生成绩管理系统 - 示例数据和常用查询 -- Student Grade Management System - Sample Data and Common Queries -- 插入示例学生数据 INSERT INTO students (student_number, student_name, class_id, seat_number, gender, birth_date, enrollment_date, phone, parent_name, parent_phone) VALUES ('202401001', '张三', 1, 1, 'male', '2008-05-15', '2024-09-01', '13800138001', '张父', '13800138002'), ('202401002', '李四', 1, 2, 'female', '2008-07-22', '2024-09-01', '13800138003', '李母', '13800138004'), ('202401003', '王五', 1, 3, 'male', '2008-03-10', '2024-09-01', '13800138005', '王父', '13800138006'), ('202401004', '赵六', 1, 4, 'female', '2008-11-28', '2024-09-01', '13800138007', '赵母', '13800138008'), ('202401005', '钱七', 2, 1, 'male', '2008-09-14', '2024-09-01', '13800138009', '钱父', '13800138010'); -- 插入示例成绩数据 (2024年期中考试) INSERT INTO grades (student_id, subject_id, exam_type, exam_date, score, semester, academic_year, remarks) VALUES -- 张三的成绩 (1, 1, 'midterm', '2024-11-01', 135.00, '第一学期', '2024-2025', '语文成绩优秀'), (1, 2, 'midterm', '2024-11-02', 142.00, '第一学期', '2024-2025', '数学成绩优秀'), (1, 3, 'midterm', '2024-11-03', 128.00, '第一学期', '2024-2025', '外语成绩良好'), (1, 4, 'midterm', '2024-11-04', 95.00, '第一学期', '2024-2025', '物理成绩优秀'), (1, 5, 'midterm', '2024-11-04', 88.00, '第一学期', '2024-2025', '化学成绩良好'), (1, 6, 'midterm', '2024-11-05', 92.00, '第一学期', '2024-2025', '政治成绩优秀'), (1, 7, 'midterm', '2024-11-05', 85.00, '第一学期', '2024-2025', '历史成绩良好'), (1, 8, 'midterm', '2024-11-05', 90.00, '第一学期', '2024-2025', '地理成绩优秀'), (1, 9, 'midterm', '2024-11-05', 87.00, '第一学期', '2024-2025', '生物成绩良好'), (1, 10, 'midterm', '2024-11-05', 95.00, '第一学期', '2024-2025', '信息科技成绩优秀'), -- 李四的成绩 (2, 1, 'midterm', '2024-11-01', 125.00, '第一学期', '2024-2025', '语文成绩良好'), (2, 2, 'midterm', '2024-11-02', 138.00, '第一学期', '2024-2025', '数学成绩优秀'), (2, 3, 'midterm', '2024-11-03', 135.00, '第一学期', '2024-2025', '外语成绩优秀'), (2, 4, 'midterm', '2024-11-04', 88.00, '第一学期', '2024-2025', '物理成绩良好'), (2, 5, 'midterm', '2024-11-04', 92.00, '第一学期', '2024-2025', '化学成绩优秀'), (2, 6, 'midterm', '2024-11-05', 87.00, '第一学期', '2024-2025', '政治成绩良好'), (2, 7, 'midterm', '2024-11-05', 90.00, '第一学期', '2024-2025', '历史成绩优秀'), (2, 8, 'midterm', '2024-11-05', 85.00, '第一学期', '2024-2025', '地理成绩良好'), (2, 9, 'midterm', '2024-11-05', 88.00, '第一学期', '2024-2025', '生物成绩良好'), (2, 10, 'midterm', '2024-11-05', 92.00, '第一学期', '2024-2025', '信息科技成绩优秀'); -- 计算并插入成绩汇总数据 INSERT INTO grade_summaries (student_id, semester, academic_year, exam_type, ten_subjects_total, three_subjects_total) VALUES (1, '第一学期', '2024-2025', 'midterm', 1037.00, 405.00), (2, '第一学期', '2024-2025', 'midterm', 1032.00, 398.00); -- ==================== 常用查询示例 ==================== -- 1. 查询学生成绩表 (类似图片中的表格格式) -- Query student grades table (similar to the format in the image) SELECT c.class_name AS '班级', s.seat_number AS '座号', s.student_name AS '姓名', COALESCE(ten_total.ten_subjects_total, 0) AS '十门总分', COALESCE(ten_total.ten_subjects_rank, 0) AS '十门年次', COALESCE(chinese.score, 0) AS '语文成绩', COALESCE(math.score, 0) AS '数学成绩', COALESCE(english.score, 0) AS '外语成绩', COALESCE(three_total.three_subjects_total, 0) AS '三总', COALESCE(physics.score, 0) AS '物理成绩', COALESCE(chemistry.score, 0) AS '化学成绩', COALESCE(politics.score, 0) AS '政治成绩', COALESCE(history.score, 0) AS '历史成绩', COALESCE(geography.score, 0) AS '地理成绩', COALESCE(biology.score, 0) AS '生物成绩', COALESCE(it.score, 0) AS '信息科技成绩' FROM students s JOIN classes c ON s.class_id = c.class_id LEFT JOIN grade_summaries ten_total ON s.student_id = ten_total.student_id AND ten_total.semester = '第一学期' AND ten_total.academic_year = '2024-2025' AND ten_total.exam_type = 'midterm' LEFT JOIN grade_summaries three_total ON s.student_id = three_total.student_id AND three_total.semester = '第一学期' AND three_total.academic_year = '2024-2025' AND three_total.exam_type = 'midterm' LEFT JOIN grades chinese ON s.student_id = chinese.student_id AND chinese.subject_id = 1 AND chinese.exam_type = 'midterm' LEFT JOIN grades math ON s.student_id = math.student_id AND math.subject_id = 2 AND math.exam_type = 'midterm' LEFT JOIN grades english ON s.student_id = english.student_id AND english.subject_id = 3 AND english.exam_type = 'midterm' LEFT JOIN grades physics ON s.student_id = physics.student_id AND physics.subject_id = 4 AND physics.exam_type = 'midterm' LEFT JOIN grades chemistry ON s.student_id = chemistry.student_id AND chemistry.subject_id = 5 AND chemistry.exam_type = 'midterm' LEFT JOIN grades politics ON s.student_id = politics.student_id AND politics.subject_id = 6 AND politics.exam_type = 'midterm' LEFT JOIN grades history ON s.student_id = history.student_id AND history.subject_id = 7 AND history.exam_type = 'midterm' LEFT JOIN grades geography ON s.student_id = geography.student_id AND geography.subject_id = 8 AND geography.exam_type = 'midterm' LEFT JOIN grades biology ON s.student_id = biology.student_id AND biology.subject_id = 9 AND biology.exam_type = 'midterm' LEFT JOIN grades it ON s.student_id = it.student_id AND it.subject_id = 10 AND it.exam_type = 'midterm' WHERE c.class_name = '高一(1)班' ORDER BY s.seat_number; -- 2. 计算学生十门总分排名 -- Calculate ranking for ten subjects total score WITH ten_subjects_scores AS ( SELECT s.student_id, s.student_name, c.class_name, s.seat_number, SUM(g.score) AS total_score, ROW_NUMBER() OVER (ORDER BY SUM(g.score) DESC) AS yearly_rank, ROW_NUMBER() OVER (PARTITION BY s.class_id ORDER BY SUM(g.score) DESC) AS class_rank FROM students s JOIN classes c ON s.class_id = c.class_id JOIN grades g ON s.student_id = g.student_id WHERE g.semester = '第一学期' AND g.academic_year = '2024-2025' AND g.exam_type = 'midterm' GROUP BY s.student_id, s.student_name, c.class_name, s.seat_number ) SELECT * FROM ten_subjects_scores ORDER BY yearly_rank; -- 3. 计算学生三门总分排名 (语文、数学、外语) -- Calculate ranking for three subjects total score (Chinese, Math, English) WITH three_subjects_scores AS ( SELECT s.student_id, s.student_name, c.class_name, s.seat_number, SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) AS total_score, ROW_NUMBER() OVER (ORDER BY SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) DESC) AS yearly_rank, ROW_NUMBER() OVER (PARTITION BY s.class_id ORDER BY SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) DESC) AS class_rank FROM students s JOIN classes c ON s.class_id = c.class_id JOIN grades g ON s.student_id = g.student_id JOIN subjects sub ON g.subject_id = sub.subject_id WHERE g.semester = '第一学期' AND g.academic_year = '2024-2025' AND g.exam_type = 'midterm' AND sub.subject_code IN ('CHN', 'MATH', 'ENG') GROUP BY s.student_id, s.student_name, c.class_name, s.seat_number ) SELECT * FROM three_subjects_scores ORDER BY yearly_rank; -- 4. 查询班级成绩统计 -- Query class grade statistics SELECT c.class_name, COUNT(s.student_id) AS student_count, ROUND(AVG(ten_total.ten_subjects_total), 2) AS avg_ten_subjects, ROUND(AVG(three_total.three_subjects_total), 2) AS avg_three_subjects, MAX(ten_total.ten_subjects_total) AS max_ten_subjects, MIN(ten_total.ten_subjects_total) AS min_ten_subjects FROM classes c LEFT JOIN students s ON c.class_id = s.class_id LEFT JOIN grade_summaries ten_total ON s.student_id = ten_total.student_id AND ten_total.semester = '第一学期' AND ten_total.academic_year = '2024-2025' AND ten_total.exam_type = 'midterm' LEFT JOIN grade_summaries three_total ON s.student_id = three_total.student_id AND three_total.semester = '第一学期' AND three_total.academic_year = '2024-2025' AND three_total.exam_type = 'midterm' GROUP BY c.class_id, c.class_name ORDER BY c.class_name; -- 5. 查询科目成绩分布 -- Query subject grade distribution SELECT sub.subject_name, COUNT(g.grade_id) AS exam_count, ROUND(AVG(g.score), 2) AS avg_score, MAX(g.score) AS max_score, MIN(g.score) AS min_score, ROUND(STDDEV(g.score), 2) AS std_deviation FROM subjects sub LEFT JOIN grades g ON sub.subject_id = g.subject_id AND g.semester = '第一学期' AND g.academic_year = '2024-2025' AND g.exam_type = 'midterm' GROUP BY sub.subject_id, sub.subject_name ORDER BY sub.subject_name; -- 6. 更新成绩汇总表的存储过程 -- Stored procedure to update grade summary table DELIMITER // CREATE PROCEDURE UpdateGradeSummaries( IN p_semester VARCHAR(20), IN p_academic_year VARCHAR(20), IN p_exam_type ENUM('midterm', 'final', 'monthly', 'quiz') ) BEGIN -- 更新十门总分和排名 UPDATE grade_summaries gs JOIN ( SELECT student_id, SUM(score) AS ten_total, ROW_NUMBER() OVER (ORDER BY SUM(score) DESC) AS yearly_rank, ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY SUM(score) DESC) AS class_rank FROM grades WHERE semester = p_semester AND academic_year = p_academic_year AND exam_type = p_exam_type GROUP BY student_id ) calc ON gs.student_id = calc.student_id SET gs.ten_subjects_total = calc.ten_total, gs.ten_subjects_rank = calc.yearly_rank, gs.class_rank_ten_subjects = calc.class_rank, gs.calculated_at = CURRENT_TIMESTAMP WHERE gs.semester = p_semester AND gs.academic_year = p_academic_year AND gs.exam_type = p_exam_type; -- 更新三门总分和排名 UPDATE grade_summaries gs JOIN ( SELECT g.student_id, SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) AS three_total, ROW_NUMBER() OVER (ORDER BY SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) DESC) AS yearly_rank, ROW_NUMBER() OVER (PARTITION BY s.class_id ORDER BY SUM(CASE WHEN sub.subject_code IN ('CHN', 'MATH', 'ENG') THEN g.score ELSE 0 END) DESC) AS class_rank FROM grades g JOIN subjects sub ON g.subject_id = sub.subject_id JOIN students s ON g.student_id = s.student_id WHERE g.semester = p_semester AND g.academic_year = p_academic_year AND g.exam_type = p_exam_type AND sub.subject_code IN ('CHN', 'MATH', 'ENG') GROUP BY g.student_id, s.class_id ) calc ON gs.student_id = calc.student_id SET gs.three_subjects_total = calc.three_total, gs.three_subjects_rank = calc.yearly_rank, gs.class_rank_three_subjects = calc.class_rank, gs.calculated_at = CURRENT_TIMESTAMP WHERE gs.semester = p_semester AND gs.academic_year = p_academic_year AND gs.exam_type = p_exam_type; END // DELIMITER ; -- 调用存储过程更新成绩汇总 -- CALL UpdateGradeSummaries('第一学期', '2024-2025', 'midterm');