scoreaimanage / sample_data_queries.sql
PenceZao's picture
first commit
2a889d3
-- 学生成绩管理系统 - 示例数据和常用查询
-- 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');