创建一个Sql代码项目,系统功能基本要求如下: 学生信息:学号、姓名、性别、专业、年级等 学生成绩信息:包括学号、课程编号、课程名称、分数等 课程信息:包括课程编号、课程名称、任课老师等 需实现基本信息的录入、删除和修改功能;需按照一定条件查询、统计学生成绩,但不能任意修改成绩。至少一个函数,两个存储过程,一个触发器,
时间: 2023-07-04 19:08:17 浏览: 159
以下是一个简单的SQL代码项目,实现了学生信息、学生成绩信息、课程信息的录入、删除和修改功能,并且实现了按照一定条件查询、统计学生成绩的功能。同时,添加了一个触发器,用于在学生成绩信息表中插入记录时,自动更新学生信息表中的总成绩和平均成绩。
```sql
-- 创建学生信息表
CREATE TABLE student_info (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
gender VARCHAR(2) NOT NULL,
major VARCHAR(50) NOT NULL,
grade INT NOT NULL
);
-- 创建课程信息表
CREATE TABLE course_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
teacher VARCHAR(20) NOT NULL
);
-- 创建学生成绩表
CREATE TABLE student_grade (
id INT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
score DECIMAL(5, 2) NOT NULL,
FOREIGN KEY (student_id) REFERENCES student_info(id),
FOREIGN KEY (course_id) REFERENCES course_info(id)
);
-- 添加触发器,计算学生总成绩和平均成绩
CREATE TRIGGER update_student_grade AFTER INSERT ON student_grade
FOR EACH ROW BEGIN
UPDATE student_info SET total_score = total_score + NEW.score, avg_score = total_score / (SELECT COUNT(*) FROM student_grade WHERE student_id = NEW.student_id) WHERE id = NEW.student_id;
END;
-- 创建一个函数,用于查询某个学生的总成绩和平均成绩
CREATE FUNCTION get_student_score_avg(student_id INT) RETURNS DECIMAL(5, 2)
BEGIN
DECLARE student_total_score DECIMAL(5, 2);
DECLARE student_course_count INT;
SELECT total_score INTO student_total_score FROM student_info WHERE id = student_id;
SELECT COUNT(*) INTO student_course_count FROM student_grade WHERE student_id = student_id;
RETURN student_total_score / student_course_count;
END;
-- 创建一个存储过程,用于录入学生信息
CREATE PROCEDURE insert_student_info(
IN student_id INT,
IN student_name VARCHAR(20),
IN student_gender VARCHAR(2),
IN student_major VARCHAR(50),
IN student_grade INT
)
BEGIN
INSERT INTO student_info VALUES(student_id, student_name, student_gender, student_major, student_grade);
END;
-- 创建一个存储过程,用于删除学生信息
CREATE PROCEDURE delete_student_info(
IN student_id INT
)
BEGIN
DELETE FROM student_info WHERE id = student_id;
END;
-- 创建一个存储过程,用于修改学生信息
CREATE PROCEDURE update_student_info(
IN student_id INT,
IN student_name VARCHAR(20),
IN student_gender VARCHAR(2),
IN student_major VARCHAR(50),
IN student_grade INT
)
BEGIN
UPDATE student_info SET name = student_name, gender = student_gender, major = student_major, grade = student_grade WHERE id = student_id;
END;
-- 创建一个存储过程,用于录入学生成绩信息
CREATE PROCEDURE insert_student_grade(
IN grade_id INT,
IN student_id INT,
IN course_id INT,
IN score DECIMAL(5, 2)
)
BEGIN
INSERT INTO student_grade VALUES(grade_id, student_id, course_id, score);
END;
-- 创建一个存储过程,用于删除学生成绩信息
CREATE PROCEDURE delete_student_grade(
IN grade_id INT
)
BEGIN
DELETE FROM student_grade WHERE id = grade_id;
END;
-- 创建一个存储过程,用于修改学生成绩信息
CREATE PROCEDURE update_student_grade(
IN grade_id INT,
IN student_id INT,
IN course_id INT,
IN score DECIMAL(5, 2)
)
BEGIN
UPDATE student_grade SET student_id = student_id, course_id = course_id, score = score WHERE id = grade_id;
END;
-- 查询某个学生的总成绩和平均成绩
SELECT get_student_score_avg(1);
-- 录入学生信息
CALL insert_student_info(1, '张三', '男', '计算机科学与技术', 2018);
-- 删除学生信息
CALL delete_student_info(1);
-- 修改学生信息
CALL update_student_info(1, '李四', '男', '计算机科学与技术', 2019);
-- 录入学生成绩信息
CALL insert_student_grade(1, 1, 1, 85.5);
-- 删除学生成绩信息
CALL delete_student_grade(1);
-- 修改学生成绩信息
CALL update_student_grade(1, 2, 2, 92.0);
-- 按照条件查询学生成绩信息
SELECT student_info.name, course_info.name, student_grade.score FROM student_grade JOIN student_info ON student_grade.student_id = student_info.id JOIN course_info ON student_grade.course_id = course_info.id WHERE student_info.major = '计算机科学与技术' AND course_info.teacher = '王老师';
-- 统计某门课程的平均分和最高分
SELECT AVG(score), MAX(score) FROM student_grade WHERE course_id = 1;
```
阅读全文