实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计

任务六 数据库存储过程设计

文章目录

任务六 数据库存储过程设计

【实训目的与要求】

【实训原理】

【实训步骤】

一、定义、调用存储过程

1.创建不带参数的存储过程

2.创建带输入参数的存储过程

3.创建带输入、输出参数的存储过程

二、查看存储过程

1.使用SHOW STATUS语句查看存储过程的状态

2.从information_schema.Routines表中查看存储过程的信息

三、定义、调用存储函数

1.创建不带参数的存储函数

2.创建带参数的存储函数

【实训总结】

【实训目的与要求】

1、学会创建存储过程;

2、掌握存储过程的调用、查看、修改和删除存储过程。

3、学会创建存储函数;

4、掌握存储函数的调用、查看、修改和删除存储函数。

【实训原理】

MySQL自定义存储函数与存储过程。

【实训步骤】

参考任务二中提供的表数据内容,编写相应SQL语句,实现存储过程、存储函数的定义及调用。参考教材《数据库系统概论》P253-258的内容,以及《MySQL数据库入门》第6章P156-176的内容。

一、定义、调用存储过程

1.创建不带参数的存储过程

(1)功能:创建一个存储过程,返回软件专业本班1998出生的学生学号,姓名,性别,所获学分情况。

命令:(包括存储过程定义及调用)

DELIMITER //

mysql> CREATE PROCEDURE PRO1()

-> BEGIN

-> SELECT SNo,SName,CNo,CName

-> FROM student

-> WHERE SNo LIKE"16041%" AND SBir LIKE"1998%";

-> END//

mysql> DELIMITER ;

mysql> CALL PRO1();

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第1张图片

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第2张图片

(2)功能:查询各学科的最高分,并输出对应科目的学科号和学科名

命令:

DELIMITER //

mysql> CREATE PROCEDURE MAX_SCORE()

-> BEGIN

-> SELECT sc.CNo,CName,MAX(Score)

-> FROM sc,course

-> WHERE sc.CNo=course.CNo

-> GROUP BY sc.CNo;

-> END//

mysql> DELIMITER ;

mysql> CALL MAX_SCORE();

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第3张图片

2.创建带输入参数的存储过程

(1)功能:创建一个存储过程,实现查询某门课程成绩在60~90之间的男学生名单。

(调用存储过程:假设查询“C语言”课程成绩在60~90之间的男学生的名单,调用存储过程,验证该存储过程的定义正确与否。

提示:查询可以用多表连接实现,也可以用in子查询实现。)

命令:(包括存储过程定义及调用)

DELIMITER //

mysql> CREATE PROCEDURE NAME(IN ICName varchar(8),IN ISex varchar(2))

-> BEGIN

-> SELECT student.SNo,SName

-> FROM sc,student

-> WHERE CNo=(SELECT CNo

-> FROM course

-> WHERE CName=ICName)

-> AND Score>=60 AND Score<=90 AND sc.SNo=student.SNo AND SSex=ISex;

-> END//

mysql> DELIMITER ;

mysql> CALL NAME("C语言","男");

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第4张图片

(2)功能:输出对应同学的总分,以及该同学不及格的科目及分数

命令:

DELIMITER //

mysql> CREATE PROCEDURE LOW_SCORE(IN ISNo varchar(8))

-> BEGIN

-> SELECT *

-> FROM sc,(SELECT SUM(Score),SNo

-> FROM sc

-> GROUP BY SNo) AS A

-> WHERE ISNo=sc.SNo AND sc.SNo=A_SNo AND Score<60;

-> END//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第5张图片

3.创建带输入、输出参数的存储过程

(1)功能:创建一个存储过程,实现计算全体学生某门功课的平均成绩的功能。

(调用存储过程:请自行给出指定的课程,验证该存储过程的定义正确与否。)

命令:(包括存储过程定义及调用)

DELIMITER //

mysql> CREATE PROCEDURE AVG_Score(IN ICName varchar(8),OUT OUTCName varchar(8),OUT Score DECIMAL(5,2))

-> BEGIN

-> SELECT CName into OUTCName

-> FROM course

-> WHERE CName=ICName;

-> SELECT AVG(Score) INTO Score

-> FROM sc,(SELECT CNo TCNo

-> FROM course

-> WHERE CName=ICName) AS T

-> WHERE CNo=TCNo

-> GROUP BY CNo;

-> END//

mysql> DELIMITER ;

mysql> CALL AVG_Score("C语言",@OUTCName,@Score);

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第6张图片

(2)功能:查询每个科目获得第一名的分数及其学号和姓名

命令:

DELIMITER //

mysql> Create procedure Top1_score(IN icname varchar(8),OUT outsname varchar(8),OUT outsno varchar(8),OUT SCO int)

-> BEGIN

-> select SName into outsname

-> from sc,student,(select CNo Tcno

-> from course

-> Where CName= icname

-> )

-> AS T

-> Where CNo=Tcno and sc.SNo=student.SNo

-> order by Score desc limit 0,1;

-> select SNo into outsno

-> from sc,(select CNo Tcno

-> from course

-> Where CName= icname)AS T

-> Where CNo=Tcno

-> order by Score desc limit 0,1;

-> select Score into SCO

-> from sc ,(select CNo Tcno

-> from course

-> Where CName= icname) AS T

-> Where CNo=Tcno

-> order by Score desc limit 0,1;

-> END//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第7张图片

二、查看存储过程

1.使用SHOW STATUS语句查看存储过程的状态

(1)功能:查询带有Score字符的存储过程的状态

命令:

mysql> SHOW PROCEDURE STATUS LIKE "%Score%"\G;

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第8张图片

2.从information_schema.Routines表中查看存储过程的信息

(1)功能:查询存储过程名中含有Score字符的存储过程的信息

命令:

mysql> select * from information_schema.Routines

-> where ROUTINE_NAME like "%Score";

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第9张图片

三、定义、调用存储函数

1.创建不带参数的存储函数

(1)功能:创建一个存储函数,返回student表中学生的数目作为结果,有结果返回实际学生数,无结果显示“此表为空”。

命令:(包括存储函数定义及调用)

Delimiter //

mysql> Create function student_number()

-> Returns int(6)

-> Begin

-> Declare sum int(6);

-> Declare note char(6);

-> set note="此表为空";

-> select count(*) into sum

-> From student;

-> If sum=0 then

-> return note;

-> Else return sum;

-> End if;

-> End//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第10张图片

(2)功能:查询“数据结构”的最高分

命令:

Delimiter //

mysql> Create function score_max()

-> Returns int(6)

-> Begin

-> Declare sum int(6);

-> Declare note char(6);

-> set note="此表为空";

-> select max(score) into sum

-> From sc

-> Where cno="00004"

-> group by cno;

-> return sum;

-> end//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第11张图片

2.创建带参数的存储函数

(1)功能:创建一个存储函数,实现计算全体学生某门功课的平均成绩的功能。

命令:(包括存储函数定义及调用)

mysql> Create function avg_score( icname varchar(8))

-> Returns varchar(255)

-> BEGIN

-> Declare a_score varchar(255);

-> select avg(score) INTO a_score

-> from sc ,(select cno Tcno

-> From course

-> Where cname= icname

-> )

-> As T

-> Where cno=Tcno

-> group by cno;

-> return a_score;

-> END//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第12张图片

(2)功能:查询学号为16044905同学的总成绩

命令:

Delimiter //

mysql> Create function sum_score( Tisno varchar(8))

-> Returns varchar(255)

-> BEGIN

-> Declare sum_score varchar(255);

-> select sum(score) INTO sum_score

-> From sc

-> Where sno=Tisno

-> group by sno;

-> return sum_score;

-> END//

截图:

实验6 存储过程mysql_MySQL数据库实验:任务六 数据库存储过程设计_第13张图片

【实训总结】

这一章的存储过程较为复杂,需要多加练习,所学知识与实践相结合才算是学到知识。

你可能感兴趣的:(实验6,存储过程mysql)