``` use school_db; CREATE TABLE class ( cid INT PRIMARY KEY, caption VARCHAR(50) ); -- 班级表 INSERT INTO class (cid, caption) VALUES (1, '三年二班'), (2, '一年三班'), (3, '三年一班'); CREATE TABLE student ( sid INT PRIMARY KEY, sname VARCHAR(50), gender ENUM('男', '女'), class_id INT, FOREIGN KEY (class_id) REFERENCES class(cid) );-- 学生表 INSERT INTO student (sid, sname, gender, class_id) VALUES (1, '钢蛋', '女', 1), (2, '铁锤', '女', 1), (3, '山炮', '男', 2); CREATE TABLE teacher ( tid INT PRIMARY KEY, tname VARCHAR(50) );-- 教师表 INSERT INTO teacher (tid, tname) VALUES (1, '叶平'), (2, '李大圣'), (3, '叶问'); CREATE TABLE course ( cid INT PRIMARY KEY, cname VARCHAR(50), teacher_id INT, FOREIGN KEY (teacher_id) REFERENCES teacher(tid) );-- 课程表 INSERT INTO course (cid, cname, teacher_id) VALUES (1, '生物', 1), (2, '体育', 1), (3, '物理', 2); CREATE TABLE score ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT, course_id INT, number INT, FOREIGN KEY (student_id) REFERENCES student(sid), FOREIGN KEY (course_id) REFERENCES course(cid) );-- 成绩表 INSERT INTO score (student_id, course_id, number) VALUES (1, 1, 60), (1, 2, 59), (2, 2, 100);```使用MySQL语句1.请在navicat中新建表之间的关系模型 2.定义一个存储过程,能实现输入一个学生的性别,输出对应的该性别的人数 3.定义一个函数,能实现对学生的成绩按阶段划分等级,0-59为”D”,60-79为”C”, 80-89为”B”,90-100为”A”; 4.现在为提高学生的及格率,对每一个学生实现加分,先查看学生的不及格情况,如果出现有学生不及格,对所有学生+2分,如果还是存在学生不及格,则继续+2,直到所有学生都及格为止。
时间: 2025-03-07 12:08:01 浏览: 44
### 1. 新建表之间的关系模型
在Navicat中创建表之间的关系模型非常直观。你可以按照以下步骤操作:
1. 打开 **Navicat** 并连接到你的 MySQL 数据库。
2. 导入给定的 SQL 脚本,确保所有的表格已经成功创建并且数据已插入。
3. 进入数据库设计视图,在这里你可以通过拖拽的方式来建立外键约束的关系。
对于这些表,你需要设置如下的关联关系:
- `student` 表中的 `class_id` 引用自 `class` 表的主键 `cid`
- `score` 表中的 `student_id` 和 `course_id` 分别引用自 `student` 的 `sid` 和 `course` 的 `cid`
- `course` 表中的 `teacher_id` 引用了来自 `teacher` 表的主键 `tid`
### 2. 创建存储过程统计特定性别学生人数
接下来是一个简单的存储过程示例,它接受一个字符串参数作为性别的标识,并返回符合条件的学生总数:
```sql
DELIMITER //
CREATE PROCEDURE count_students_by_gender(IN gender_input ENUM('男','女'))
BEGIN
SELECT COUNT(*) AS total_students FROM student WHERE gender = gender_input;
END//
DELIMITER ;
```
调用这个存储过程的方式如下所示:
```sql
CALL count_students_by_gender('女');
```
这将会返回指定性别的学生数量。
### 3. 定义函数评定学生成绩等级
下面是一个可以用于评估成绩级别的 MySQL 函数定义例子:
```sql
DELIMITER $$
CREATE FUNCTION grade_score(score INT) RETURNS CHAR(1)
DETERMINISTIC
BEGIN
DECLARE result_grade CHAR(1);
IF score BETWEEN 0 AND 59 THEN SET result_grade='D';
ELSEIF score BETWEEN 60 AND 79 THEN SET result_grade='C';
ELSEIF score BETWEEN 80 AND 89 THEN SET result_grade='B';
ELSEIF score >= 90 THEN SET result_grade='A';
END IF;
RETURN(result_grade);
END$$
DELIMITER ;
```
然后就可以像这样使用此函数了:
```sql
SELECT s.sname, c.cname, sc.number, grade_score(sc.number) as Grade
FROM student s JOIN score sc ON s.sid=sc.student_id
JOIN course c ON sc.course_id=c.cid;
```
这将展示每个学生的姓名、所选科目以及相应的分数级别。
### 4. 实现自动加分为保证所有学生及格的功能
为了完成这项任务,我们需要编写一段较为复杂的SQL脚本来检查并更新未达标的记录。考虑到事务处理的重要性,我们可以这样做:
首先,我们定义一个临时变量来跟踪是否还需要进一步增加分值;其次,循环遍历直至不存在任何不及格的成绩为止:
```sql
SET @more_additions_needed=TRUE; -- 初始化标志位为真表示需要额外添加
WHILE (@more_additions_needed IS TRUE) DO
UPDATE score SET number = LEAST(number + 2 , 100) WHERE number < 60 ; -- 对于低于60分的所有条目做最大不超过100的操作
/* 检查是否有仍然不合格的数据 */
SET @has_failing_scores := EXISTS(SELECT * FROM score WHERE number<60 );
/* 如果还有失败,则保持标志位置“真的”,否则置假*/
SET @more_additions_needed=@has_failing_scores ;
END WHILE;
```
请注意上述代码块应该放置在一个适当的上下文中执行——比如作为一个完整的批处理命令的一部分或是在某个事件触发器内部等。
---
以上就是针对您的需求提供的解决方案说明,请确认这些信息对您有所帮助!
阅读全文
相关推荐













