请问能否用MYSQL存储过程实现 已知入参'[{"sName":"姓名1"},{"sName":"姓名2"},{"sName":"姓名3"}]' 字符串, 学生表student(`sName` varchar(100) COMMENT '姓名',`iSocre` INT(11) COMMENT '成绩') 用循环方式,根据学生姓名将成绩 +20分
时间: 2023-05-15 14:07:41 浏览: 332
可以使用MYSQL存储过程实现该功能,以下是示例代码:
DELIMITER $$
CREATE PROCEDURE update_scores(IN student_list TEXT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE student_name VARCHAR(100);
DECLARE student_count INT DEFAULT JSON_LENGTH(student_list);
WHILE i < student_count DO
SET student_name = JSON_EXTRACT(student_list, CONCAT('$[', i, '].sName'));
UPDATE student SET iSocre = iSocre + 20 WHERE sName = student_name;
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
调用该存储过程时,需要将学生列表以JSON格式传入,例如:
CALL update_scores('[{"sName":"姓名1"},{"sName":"姓名2"},{"sName":"姓名3"}]');
该存储过程会循环遍历学生列表,根据学生姓名更新成绩字段。
相关问题
请问能否用MYSQL存储过程实现已知入参T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串 学生表student(sName varchar(100)COMMENT姓 名iSocreINT(11)COMMENT 成绩) 用循环方式
可以使用MYSQL存储过程来实现已知入参T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串,循环插入学生表student中。以下是一个示例代码:
DELIMITER $$
CREATE PROCEDURE insert_students(IN names VARCHAR(100))
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE name VARCHAR(100);
DECLARE names_array JSON;
SET names_array = JSON_EXTRACT(names, '$');
WHILE i <= JSON_LENGTH(names_array) DO
SET name = JSON_EXTRACT(names_array, CONCAT('$[', i-1, ']'));
INSERT INTO student(sName, iSocre) VALUES (name, 0);
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
调用存储过程时,将T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串作为参数传递给存储过程即可:
CALL insert_students('{"sName":"姓名1","sName":"姓名2","sName":"姓名3"}');
这将在学生表中插入三个学生记录,姓名分别为"姓名1"、"姓名2"和"姓名3",成绩默认为0。
mysql学生表 student(sid,sname,sage,ssex),其中, sid:学号,sname:学生姓名,sage:学生年龄,ssex:学生性别, 成绩表 sc(sid,sid,score),其中, sid:学号,sid:课程编号,score:成绩。 查询选修了两门及以上课程的全部学生的学号和姓名。显示sid、sname和课程数
你可以使用以下 SQL 语句查询选修了两门及以上课程的全部学生的学号和姓名,并显示课程数:
```
SELECT s.sid, s.sname, COUNT(sc.cno) AS course_num
FROM student s
JOIN sc ON s.sid = sc.sid
GROUP BY s.sid, s.sname
HAVING COUNT(sc.cno) >= 2;
```
其中,`JOIN` 用于连接两个表,`GROUP BY` 用于分组,`HAVING` 用于过滤分组后的结果。`COUNT()` 函数用于统计选修课程的数量。
阅读全文