【MySQL】实验05 存储过程
实验五 存储过程
一. 简答题(共17题,100分)
-
(简答题, 2分) 本实验的实验目的是:
掌握存储过程的概念、功能;
学会创建和调用存储过程;
知道如何删除存储过程。 -
(简答题, 7分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuRepInfo_学号最后两位
利用学生学号查询该名学生各学期的选修课程情况,要求显示学生的学号,姓名,选修的学年,学期,选修的课程号,课程名及其成绩,显示结果按学年和学期升序排列。USE Jxdb59; DELIMITER // # 创建存储过程 CREATE PROCEDURE PROC_StuRepInfo_59(IN p_sno CHAR(12)) BEGIN # 要求显示学生的学号,姓名,选修的学年,学期,选修的课程号,课程名及其成绩 SELECT s.Sno, s.Sname, r.Racademicyear, r.Rterm, c.Cno, c.Cname, r.Grade FROM Students59 s JOIN Reports59 r ON s.Sno = r.Sno JOIN Courses59 c ON r.Cno = c.Cno WHERE s.Sno = p_sno # 显示结果按学年和学期升序排列 ORDER BY r.Racademicyear, r.Rterm; END // DELIMITER ; # 调用查询 CALL PROC_StuRepInfo_59('202003005103');
-
(简答题, 2分)
请写出下列调用存储过程PROC_StuRepInfo_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
查询学号为202103005101的选课情况USE Jxdb59; CALL PROC_StuRepInfo_59('202103005101');
-
(简答题, 7分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuGrade_学号最后两位
查询某位学生指定课程的成绩和可获得这门课程的学分
(注:若该学生的课程成绩小于60分或是为空,则学分要显示为0分)USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_StuGrade_59(IN p_sno CHAR(12), IN p_sname VARCHAR(4), IN p_cno CHAR(8), IN p_cname VARCHAR(20)) BEGIN # 查询某位学生指定课程的成绩和可获得这门课程的学分 SELECT r.Grade, IF(r.Grade >= 60, c.Ccredit, 0) AS Credit FROM Students59 s JOIN Reports59 r ON s.Sno = r.Sno JOIN Courses59 c ON r.Cno = c.Cno WHERE (s.Sno = p_sno OR s.Sname = p_sname) AND (c.Cno = p_cno OR c.Cname = p_cname); END // DELIMITER ;
-
(简答题, 4分)
请写出下列调用存储过程PROC_StuGrade_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询'张建国'选修的'数据库系统原理'课程的成绩和学分
(2)查询'朱玉玲'选修的'计算机科学概论'课程的成绩和学分USE Jxdb59; CALL PROC_StuGrade_59(NULL, '张建国', NULL, '数据库系统原理'); CALL PROC_StuGrade_59(NULL, '朱玉玲', NULL, '计算机科学概论');

-
(简答题, 7分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_DepNativeInfo_学号最后两位
统计指定入学年级指定学院名中,各省的生源人数,要求显示入学年级,学院名,生源地(只显示省份)及生源人数。USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_DepNativeInfo_59(IN p_grade VARCHAR(4), IN p_dname VARCHAR(15)) BEGIN SELECT p_grade AS Grade, p_dname AS Department, SUBSTRING_INDEX(s.Snative, '省', 1) AS Province, COUNT(*) AS StuCount FROM Students59 s JOIN Department59 d ON s.Dno = d.Dno WHERE LEFT(s.Sno, 4) = p_grade AND d.Dname = p_dname GROUP BY SUBSTRING_INDEX(s.Snative, '省', 1); END // DELIMITER ;
-
(简答题, 2分)
请写出下列调用存储过程PROC_DepNativeInfo_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
查询2020级计算机与信息工程学院的生源情况USE Jxdb59; CALL PROC_DepNativeInfo_59('2020', '计算机与信息工程学院');
-
(简答题, 9分)
(1)请写出下列函数的MySQL语句,函数名命名为FUNC_GradeSegment_学号最后两位(Score TINYINT)
其中,参数Score为0-100的整数,即学生成绩,要求该函数返回学生成绩Score所处的分值段,
分支段分为:90-100, 80-89, 70-79, 60-69, 0-59),若此学生的成绩为NULL,即还未考试,则返回“未考”
(2)请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuGradeNum_学号最后两位
统计指定班级指定课程的考试情况,要求显示出不同分值段以及尚未考试的学生人数,如(90-100, 2人;80-89, 7人;…未考, 2人)。USE Jxdb59; # 创建函数 DELIMITER // CREATE FUNCTION FUNC_GradeSegment_59(Score TINYINT) RETURNS VARCHAR(10) DETERMINISTIC BEGIN IF Score IS NULL THEN RETURN '未考'; ELSEIF Score >= 90 THEN RETURN '90~100'; ELSEIF Score >= 80 THEN RETURN '80~89'; ELSEIF Score >= 70 THEN RETURN '70~79'; ELSEIF Score >= 60 THEN RETURN '60~69'; ELSE RETURN '0~59'; END IF; END // DELIMITER ; # 创建存储过程 DELIMITER // CREATE PROCEDURE PROC_StuGradeNum_59( IN p_class_no VARCHAR(20), IN p_cname VARCHAR(50) ) BEGIN SELECT FUNC_GradeSegment_59(r.Grade) AS Segment, COUNT(*) AS Count FROM Students59 s JOIN Reports59 r ON s.Sno = r.Sno JOIN Courses59 c ON r.Cno = c.Cno WHERE s.Sclass = p_class_no AND c.Cname = p_cname GROUP BY FUNC_GradeSegment_59(r.Grade); END // DELIMITER ;
-
(简答题, 2分)
请写出下列调用存储过程PROC_StuGradeNum_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
查询2021160261班计算机科学概论的考试情况USE Jxdb59; CALL PROC_StuGradeNum_59('2021160261', '计算机科学概论');
-
(简答题, 9分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuCreditInfo_学号最后两位
利用学生学号查询该名学生在指定学年,指定学期所获得的学分数以及还未获得的学分数,若该门课程尚无成绩或成绩小于60分,则为尚未获得的学分,结果以变量形式输出(OUTPUT)。USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_StuCreditInfo_59( # 输入 IN p_sno CHAR(12), IN p_year CHAR(4), IN p_semester CHAR(1), # 输出 OUT p_got TINYINT, OUT p_notgot TINYINT ) BEGIN SELECT IFNULL(SUM(IF(r.Grade >= 60, c.Ccredit, 0)), 0), IFNULL(SUM(IF(r.Grade < 60 OR r.Grade IS NULL, c.Ccredit, 0)), 0) INTO p_got, p_notgot FROM Reports59 r JOIN Courses59 c ON r.Cno = c.Cno WHERE r.Sno = p_sno AND r.Racademicyear = p_year AND r.Rterm = p_semester; END // DELIMITER ;
-
(简答题, 4分)
请写出下列调用存储过程PROC_StuCreditInfo_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询学号为202203038101的学生2023年第2学期的学分情况
(2)查询学号为202003005104的学生2020年第1学期的学分情况
要求:若已获学分或未获学分返回为NULL,则结果要显示为0USE Jxdb59; # (1) 查询学号为202203038101的学生2023年第2学期的学分情况 SET @got = 0, @notgot = 0; CALL PROC_StuCreditInfo_59('202203038101', '2023', 2, @got, @notgot); SELECT IFNULL(@got, 0) AS 已获学分, IFNULL(@notgot, 0) AS 未获学分; # (2) 查询学号为202003005104的学生2020年第1学期的学分情况 SET @got = 0, @notgot = 0; CALL PROC_StuCreditInfo_59('202003005104', '2020', 1, @got, @notgot); SELECT IFNULL(@got, 0) AS 已获学分, IFNULL(@notgot, 0) AS 未获学分;

-
(简答题, 8分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaWork_学号最后两位
统计指定教师指定学年的教学工作量(教学工作量=所有教授的课程学时数的总和),教学工作量要求作为输出参数(OUT)USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_TeaWork_59( IN p_tname VARCHAR(4), IN p_year VARCHAR(4), OUT p_workload INT ) BEGIN SELECT IFNULL(SUM(c.Chours), 0) INTO p_workload FROM Teachers59 t JOIN Tutors59 te ON t.Tno = te.Tno JOIN Courses59 c ON te.Cno = c.Cno WHERE t.Tname = p_tname AND te.Tacademicyear = p_year; END // DELIMITER ;
-
(简答题, 4分)
请写出下列调用存储过程PROC_TeaWork_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询教师刘伟2024学年的教学工作量
(2)查询教师王一凡2022学年的教学工作量
要求:若教学工作量返回为NULL,则结果要显示为0USE Jxdb59; # (1) 查询教师刘伟2024学年的教学工作量 SET @workload = 0; CALL PROC_TeaWork_59('刘伟', '2024', @workload); SELECT IFNULL(@workload, 0) AS 教学工作量; # (2) 查询教师王一凡2022学年的教学工作量 SET @workload = 0; CALL PROC_TeaWork_59('王一凡', '2022', @workload); SELECT IFNULL(@workload, 0) AS 教学工作量;

-
(简答题, 10分)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaTax_学号最后两位
统计指定教师每月需要缴纳的税金是多少,并将统计结果以变量形式输出(OUT)
如果是中级以下职称(含中级),则税金=(工资+岗位津贴-1500)5%;
如果是副高级职称,则税金=(工资+岗位津贴-2000)5%;
如果是正高级职称,则税金=(工资+岗位津贴-2500)*5%
提示:IF… ELSE…
注意:返回的税金应是实数USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_TeaTax_59( IN p_tname VARCHAR(20), OUT p_tax DECIMAL(10,2) ) BEGIN DECLARE v_prof VARCHAR(8); DECLARE v_salary DECIMAL(10,2); DECLARE v_allowance DECIMAL(10,2); SELECT Tprof, Tsal, Tcomm INTO v_prof, v_salary, v_allowance FROM Teachers59 WHERE Tname = p_tname; IF v_prof IN ('教授') THEN SET p_tax = (v_salary + v_allowance - 2500) * 0.05; ELSEIF v_prof IN ('副教授') THEN SET p_tax = (v_salary + v_allowance - 2000) * 0.05; ELSE SET p_tax = (v_salary + v_allowance - 1500) * 0.05; END IF; END // DELIMITER ; -
(简答题, 4分)
请写出下列调用存储过程PROC_TeaTax_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询教师张雪应缴纳的税金
(2)查询教师田锋应缴纳的税金
要求:显示的税金只保留小数点后两位USE Jxdb59; # (1) 查询教师张雪应缴纳的税金 SET @tax = 0; CALL PROC_TeaTax_59('张雪', @tax); SELECT ROUND(@tax, 2) AS 应缴税金; # (2) 查询教师田锋应缴纳的税金 SET @tax = 0; CALL PROC_TeaTax_59('田锋', @tax); SELECT ROUND(@tax, 2) AS 应缴税金;
-
(简答题, 15分)
请写出下列创建存储过程的MySQL语句(选课情况综合查询),存储过程名命名为PROC_StuRepSel_学号最后两位
此存储过程可按照用户指定的查询字段,包括学号,学生姓名,课程编号,课程名称、学年或班级编号查询学生的选课情况,查询结果显示(班级编号,学号,学生姓名,课程编号,课程名称,选修学年,选修学期,成绩)
提示:需要两个输入参数,一个参数用来指定要查询的字段,另一个参数用来指定要查询字段的具体值,存储过程中需要根据查询字段不同,分别写出对应的查询语句USE Jxdb59; DELIMITER // CREATE PROCEDURE PROC_StuRepSel_59( IN p_field VARCHAR(20), IN p_value VARCHAR(50) ) BEGIN SET @sql = CONCAT( 'SELECT s.Sclass, s.Sno, s.Sname, c.Cno, c.Cname, r.Racademicyear, r.Rterm, r.Grade ', 'FROM Students59 s ', 'JOIN Reports59 r ON s.Sno = r.Sno ', 'JOIN Courses59 c ON r.Cno = c.Cno ', 'WHERE ', CASE p_field WHEN '学号' THEN CONCAT('s.Sno = ''', p_value, '''') WHEN '学生姓名' THEN CONCAT('s.Sname = ''', p_value, '''') WHEN '课程编号' THEN CONCAT('c.Cno = ''', p_value, '''') WHEN '课程名称' THEN CONCAT('c.Cname = ''', p_value, '''') WHEN '学年' THEN CONCAT('r.Racademicyear = ''', p_value, '''') WHEN '班级编号' THEN CONCAT('s.Sclass = ''', p_value, '''') END ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ; -
(简答题, 4分)
请写出下列调用存储过程PROC_StuRepSel_学号最后两位的MySQL语句,并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询学号为202003005106的学生的选课情况
(2)查询20022030381班的学生的选课情况USE Jxdb59; # (1) 查询学号为202003005106的学生的选课情况 CALL PROC_StuRepSel_59('学号', '202003005106'); # (2) 查询2002030381班的学生的选课情况 CALL PROC_StuRepSel_59('班级编号', '2002030381');
