当前位置:   article > 正文

MySQL 实验六——存储过程_实验六 存储过程

实验六 存储过程

存储过程

b49f25a852fd4fe5ac80a4761de70590.jpeg

目录

存储过程

一、实验目的及要求

二、实验环境

三、实验内容

四、实验步骤


 

一、实验目的及要求

(1)能够应用某一具体DBMS支持的编程语言和编程规范,规范设计存储过程。

(2)根据数据库应用系统的设计需要,执行存储过程等工具对采集到的实验数据进行整理、分析和解释,得出有效结论。

二、实验环境

操作系统:Windows  

应用软件:MySQL5.6  Navicat 12

三、实验内容

有一个学生数据库,结构如下:

7717a3a844a842c8b2b1ce08176a22a1.png

请使用存储过程完成以下操作:

1. 创建存储过程proce_avg_prade统计指定课程的平均成绩;

2. 统计数据库原理与应用课程的成绩分布情况,即按照各分数段统计人数,分数段有[100,90]、(90,80]、(80,70]、(70,60]和(60,0]等五段;

3. 将学生选课成绩从百分制改为等级制(即[100,90]A、(90,80]B、(80,70]C、(70,60]D、(60,0]E)显示。

四、实验步骤

1. 创建存储过程proce_avg_prade统计指定课程的平均成绩;

运行代码:

  1. DELIMITER $
  2. CREATE PROCEDURE p_Avg_Grade(IN courses VARCHAR(20), OUT avgnum DECIMAL(5,2))
  3. BEGIN
  4. SELECT AVG(sc.Grade) INTO avgnum
  5. FROM sc
  6. JOIN course ON sc.Cno = course.Cno
  7. WHERE course.CName = courses;
  8. END $
  9. DELIMITER ;

运行结果

147234d2dc794968800f388c8ff652e9.png

 2. 统计数据库原理与应用课程的成绩分布情况,即按照各分数段统计人数,分数段有[100,90]、(90,80]、(80,70]、(70,60]和(60,0]等五段;

创建rank表:

  1. create table rank(
  2. division char(66),
  3. sub_sum int
  4. );
  5. insert into rank(division)
  6. VALUES ('[0,60)'),('[60,70]'),('[70,80]'),('[80,90]'),('[90,100]');

运行代码:

  1. DELIMITER $
  2. CREATE PROCEDURE printcourse (IN pcname CHAR(20))
  3. BEGIN
  4. DECLARE pcno CHAR(20);
  5. SELECT Cno INTO pcno FROM Course WHERE Cname = pcname LIMIT 1;
  6. IF pcno IS NULL THEN
  7. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '您输入的课程号不存在,请重新输入!';
  8. ELSE
  9. -- 更新Rank表的sub_sum字段,使用JOIN来计算每个分段的数量
  10. UPDATE Rank r JOIN (
  11. SELECT Cno, COUNT(*) as sub_count
  12. FROM SC
  13. WHERE Grade < 60 AND Cno = pcno
  14. GROUP BY Cno
  15. ) sc ON r.division = '[0,60)'
  16. SET r.sub_sum = sc.sub_count;
  17. UPDATE Rank r JOIN (
  18. SELECT Cno, COUNT(*) as sub_count
  19. FROM SC
  20. WHERE Grade >= 60 AND Grade < 70 AND Cno = pcno
  21. GROUP BY Cno
  22. ) sc ON r.division = '[60,70)'
  23. SET r.sub_sum = sc.sub_count;
  24. UPDATE Rank r JOIN (
  25. SELECT Cno, COUNT(*) as sub_count
  26. FROM SC
  27. WHERE Grade >= 70 AND Grade < 80 AND Cno = pcno
  28. GROUP BY Cno
  29. ) sc ON r.division = '[70,80)'
  30. SET r.sub_sum = sc.sub_count;
  31. UPDATE Rank r JOIN (
  32. SELECT Cno, COUNT(*) as sub_count
  33. FROM SC
  34. WHERE Grade >= 80 AND Grade < 90 AND Cno = pcno
  35. GROUP BY Cno
  36. ) sc ON r.division = '[80,90)'
  37. SET r.sub_sum = sc.sub_count;
  38. UPDATE Rank r JOIN (
  39. SELECT Cno, COUNT(*) as sub_count
  40. FROM SC
  41. WHERE Grade = 90 AND Grade <= 100 AND Cno = pcno
  42. GROUP BY Cno
  43. ) sc ON r.division = '[90,100)'
  44. SET r.sub_sum = sc.sub_count;
  45. END IF;
  46. END $
  47. DELIMITER ;

查询结果

d23b993aec3a41648c7d10cc2ca60a78.png

3. 将学生选课成绩从百分制改为等级制(即[100,90]A、(90,80]B、(80,70]C、(70,60]D、(60,0]E)显示。

先把分数属性定义为字符

0664ba3174474e4b8b380505f7d0904e.png

代码:

  1. ALTER TABLE SC MODIFY Grade CHAR(5);
  2. DELIMITER $
  3. CREATE PROCEDURE ConvertGradesToLevel()
  4. BEGIN
  5. UPDATE SC
  6. SET Grade = CASE
  7. WHEN Grade >= 90 THEN 'A'
  8. WHEN Grade > 80 THEN 'B'
  9. WHEN Grade > 70 THEN 'C'
  10. WHEN Grade > 60 THEN 'D'
  11. ELSE 'E'
  12. END;
  13. END $
  14. DELIMITER ;

运行结果:

48122dbe75634d70b0793b0391167b98.png

 

 

该学生数据库为stu_course,sql语句如下:

  1. /*创建表student*/
  2. CREATE TABLE Student
  3. (
  4. Sno CHAR(8) PRIMARY KEY, /* 列级完整性约束条件*/
  5. Sname VARCHAR(20) ,
  6. Ssex CHAR(6),
  7. Sbirthdate Date,
  8. Smajor VARCHAR(40)
  9. );
  10. /*创建表course*/
  11. CREATE TABLE Course
  12. (
  13. Cno CHAR(5) PRIMARY KEY,
  14. Cname VARCHAR(40) ,
  15. Ccredit SMALLINT,
  16. Cpno CHAR(5),
  17. FOREIGN KEY (Cpno) REFERENCES Course(Cno)
  18. );
  19. /*创建表sc*/
  20. CREATE TABLE SC
  21. (
  22. Sno CHAR(8),
  23. Cno CHAR(5),
  24. Grade SMALLINT, /*成绩*/
  25. Semester CHAR(5), /*开课学期*/
  26. Teachingclass CHAR(8), /*学生选修某一门课程所在的教学班*/
  27. PRIMARY KEY (Sno,Cno), /* 主码由两个属性构成,表级约束*/
  28. FOREIGN KEY (Sno) REFERENCES Student(Sno),
  29. /* 表级完整性约束条件,Sno是外码,被参照表是Student */
  30. FOREIGN KEY (Cno) REFERENCES Course(Cno)
  31. /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
  32. );
  33. /*向表中插入数据*/
  34. INSERT INTO student VALUES ('20180001', '李勇', '男', '2000-03-08', '信息安全');
  35. INSERT INTO student VALUES ('20180002', '刘晨', '女', '1999-09-01', '计算机科学与技术');
  36. INSERT INTO student VALUES ('20180003', '王敏', '女', '2001-08-01', '计算机科学与技术');
  37. INSERT INTO student VALUES ('20180004', '张立', '男', '2000-01-08', '计算机科学与技术');
  38. INSERT INTO student VALUES ('20180005', '陈新奇', '男', '2001-11-01', '信息管理与信息系统');
  39. INSERT INTO student VALUES ('20180006', '赵明', '男', '2000-06-12', '数据科学与大数据技术');
  40. INSERT INTO student VALUES ('20180007', '王佳佳', '女', '2001-12-07', '数据科学与大数据技术');
  41. INSERT INTO course VALUES ('81001', '程序设计基础与C语言', 4, NULL);
  42. INSERT INTO course VALUES ('81002', '数据结构', 4, '81001');
  43. INSERT INTO course VALUES ('81003', '数据库系统概论', 4, '81002');
  44. INSERT INTO course VALUES ('81004', '信息系统概论', 4, '81003');
  45. INSERT INTO course VALUES ('81005', '操作系统', 4, '81001');
  46. INSERT INTO course VALUES ('81006', 'Python语言', 3, '81002');
  47. INSERT INTO course VALUES ('81007', '离散数学', 4, NULL);
  48. INSERT INTO course VALUES ('81008', '大数据技术概论', 4, '81003');
  49. INSERT INTO sc VALUES ('20180001', '81001', 85, '20192', '81001-01');
  50. INSERT INTO sc VALUES ('20180001', '81002', 96, '20201', '81002-01');
  51. INSERT INTO sc VALUES ('20180001', '81003', 87, '20202', '81003-01');
  52. INSERT INTO sc VALUES ('20180002', '81001', 80, '20192', '81001-02');
  53. INSERT INTO sc VALUES ('20180002', '81002', 98, '20201', '81002-01');
  54. INSERT INTO sc VALUES ('20180002', '81003', 71, '20202', '81003-02');
  55. INSERT INTO sc VALUES ('20180003', '81001', 81, '20192', '81001-01');
  56. INSERT INTO sc VALUES ('20180003', '81002', 76, '20201', '81002-02');
  57. INSERT INTO sc VALUES ('20180004', '81001', 56, '20192', '81001-02');
  58. INSERT INTO sc VALUES ('20180004', '81002', 97, '20201', '81002-02');
  59. INSERT INTO sc VALUES ('20180005', '81003', 68, '20202', '81003-01');
  60. INSERT INTO sc VALUES ('20180005', '81001', null, '20192', '81001-02');

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/839230
推荐阅读
相关标签
  

闽ICP备14008679号