任务描述
本关任务:编写函数fun_2,实现指定学生的GPA计算。输入参数为学号,函数返回值为该生的GPA。
编程要求
在代码文件"step3/query1.sql"中实现函数fun_2; 在代码文件"step3/query2.sql"中实现在select命令中调用函数fun_2,查询所有学生的GPA(按学号的升序输出),结果集数据项:学号、姓名、GPA。
涉及的表和字段:
学生表(student) : 学号(sno) char(10) 姓名(sname) varchar(50) 性别(ssex) char(2) 出生日期(sbirth) date 所在系(sdept) varchar(20) 课程表(course) : 课程号(cno) char(4) 课程名(cname) varchar(50) 先行课(cpno) char(4) 学分(credit) decimal(3,1) 学期(semester) smallint 选修表(sc): 学号(sno) char(10) 课程号(cno) char(4) 成绩(grade) smallint
GPA计算
GPA=(课程学分1×课程绩点1+课程学分2×课程绩点2+......+课程学分n×课程绩点n)÷(课程学分1+课程学分2+......+课程学分n) 课程绩点换算表:
成绩 | 绩点 |
---|---|
100-96 | 5.0 |
95-91 | 4.5 |
90-86 | 4.0 |
85-81 | 3.5 |
80-76 | 3.0 |
75-71 | 2.5 |
70-66 | 2.0 |
65-61 | 1.5 |
60 | 1.0 |
最终代码:
query1.sql
sql
use DB1;
delimiter $$
#请在此处添加函数实现代码
########## Begin ##########
CREATE FUNCTION fun_2(student_id CHAR(10)) RETURNS DOUBLE
BEGIN
DECLARE total_credits DOUBLE;
DECLARE total_points DOUBLE;
DECLARE gpa DOUBLE;
SELECT SUM(course.credit),/*课程学分1+课程学分2+......+课程学分n*/
SUM(((TRUNCATE(((sc.grade-1)/5),0)-9)/2*course.credit))/*(课程学分1x课程绩点1+......*/
INTO total_credits,total_points
FROM sc
JOIN course ON sc.cno = course.cno
WHERE sc.sno = student_id;
SET gpa = total_points / total_credits;
RETURN gpa;
END$$
########## End ##########
delimiter ; #恢复分号来作为语句标识。
query2.sql
sql
use DB1;
#请在此处添加在select命令中调用函数的代码
########## Begin ##########
SELECT student.sno AS 学号,
student.sname AS 姓名,
fun_2(student.sno) AS GPA
FROM student
ORDER BY student.sno;
########## End ##########
**总结:**熟练运用select into语法和变量使用。