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();

截图:
MySQL数据库实验:任务六 数据库存储过程设计_第1张图片
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();

截图:
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语言","男");

截图:
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//

截图:
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);

截图:
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//

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


二、查看存储过程

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

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

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

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

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

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

mysql> select * from information_schema.Routines
    -> where ROUTINE_NAME like "%Score";

截图:
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//

截图:
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//

截图:
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//

截图:
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//

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


【实训总结】

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

你可能感兴趣的:(关于MySQL的那些事儿)