实战体验:数据库上机实验四成果展示 (数据库上机实验四)

数据库技术是现代计算机科学中一项非常重要的技能。数据库管理系统可以协助企业和组织存储、管理和检索大量的数据,是各行各业的信息处理工具。因此,作为一名计算机科学专业的学生,学习和掌握数据库技术是至关重要的。

为了更好地掌握数据库技术,我们学校在数据库课程中设置了一系列实验课程。作为一名学生,我参加了四次数据库实验,其中实验四是最后一次实验,是整个数据库课程的与展示。在这个实验中,我们需要完成一些复杂的数据库操作,包括查询、修改和优化。接下来我将分享我的实验四成果展示。

实验四分为三个部分,之一个部分是查询优化,第二个部分是多表关联查询,第三个部分是存储过程与触发器的应用。

之一部分:查询优化

查询优化是数据库管理系统设计中的一个重要部分。好的查询优化能够使整个系统更加高效、稳定、可靠,减少系统的开销。在本次实验中,我们需要利用MySQL数据库来实现查询优化。

我们首先要了解数据表的分布情况和数据量大小。基于这些信息,我们可以考虑优化查询的方式。在实验四中,我对以下4个问题进行了查询优化。

问题一:给每个学生查询他/她所有的成绩

原始查询语句:

SELECT *

FROM 成绩表

WHERE 学号 = ‘101’;

这是一个非常简单的查询语句,但是我发现这个查询语句的效率不高。因为在我们的数据库中,一个学生可能有多科成绩,而这条语句会查询出学生的所有成绩。我对这个语句进行了优化,使其只查询当前学期的成绩,而不是所有学期的成绩。

优化后的查询语句:

SELECT *

FROM 成绩表

WHERE 学号 = ‘101’ AND 学期 = ‘2023春季学期’;

这个查询语句速度更快,因为它只需查询当前学期的成绩。

问题二:查询所有成绩及格的学生

原始查询语句:

SELECT *

FROM 成绩表

WHERE 分数 >= 60;

这也是一个简单的查询语句,但是在我们的数据库中,有大量学生的成绩都不是一次性过的。因此,在原始查询语句中,我们需要做大量的遍历和比对。我对这个语句进行了优化,使查询速度得到显著提高。

优化后的查询语句:

SELECT 学号

FROM 成绩表

WHERE 分数 >= 60

GROUP BY 学号;

通过优化后的查询语句,我们仅查询需要的信息,并且通过GROUP BY关键词,使查询变得更加简洁和高效。

问题三:查询年龄大于30岁的学生名单

原始查询语句:

SELECT *

FROM 学生表

WHERE 年龄 > 30;

这个查询语句同样较为简单,但是在我们的数据库中,有较多学生的年龄都是30岁以下,这可能会影响查询速度。为了解决这个问题,我对这个查询语句进行了简单的优化。

优化后的查询语句:

SELECT DISTINCT 姓名, 年龄

FROM 学生表

WHERE 年龄 > 30

ORDER BY 年龄 DESC;

通过DISTINCT关键字,我们可以去除重复的信息,加快查询速度。此外,通过ORDER BY关键字,我们可以使查询结果按年龄逆序排列,让结果更加清晰。

问题四:查询每门课的更高分

原始查询语句:

SELECT 课程, MAX(分数)

FROM 成绩表

GROUP BY 课程;

这个查询语句速度很快,但是我发现有错误。这个查询语句只显示每门课程的更高分,却没有显示对应课程的学生。为了解决这个问题,我对查询语句进行了改进。

优化后的查询语句:

SELECT 学生表.*, 成绩表.分数

FROM 学生表, 成绩表

WHERE 学生表.学号 = 成绩表.学号 AND 成绩表.分数 = (

SELECT MAX(分数)

FROM 成绩表

WHERE 成绩表.课程 = 学生表.课程

)

ORDER BY 成绩表.课程 ASC;

在优化后的查询语句中,我们查询了学生表和成绩表,然后通过嵌套查询语句,找到每门课程中的更高分。此外,我们通过ORDER BY关键字,按照课程号升序排列结果,使查询结果更加清晰。

第二部分:多表关联查询

多表关联查询是数据处理中常用的技术之一。通过多表关联查询,我们可以更好地整合数据,将不同的数据表组合起来进行查询和操作。在实验4的第二部分,我们需要完成以下两个问题的多表关联查询。

问题五:查询每个学生的成绩,以及他们的专业名称和班级名称

此题需要对学生表、成绩表、专业表和班级表进行多表查询。优化后的查询语句如下:

SELECT 学生表.*, 成绩表.分数, 专业表.专业名称, 班级表.班级名称

FROM 学生表, 成绩表, 专业表, 班级表

WHERE 学生表.学号 = 成绩表.学号 AND 学生表.专业编号 = 专业表.专业编号 AND 学生表.班级编号 = 班级表.班级编号

ORDER BY 成绩表.分数;

这个查询语句通过对4个表进行多表关联查询,查询出每名学生的成绩、专业名称和班级名称。然后通过ORDER BY关键字,按成绩升序排列结果。

问题六:查询学生每个学期的课程信息

此题需要对学生表、选课表、课程表和成绩表进行多表查询。优化后的查询语句如下:

SELECT 学生表.学号, 学生表.姓名, 学期表.学期名称, 课程表.课程名称, 成绩表.分数

FROM 学生表, 选课表, 课程表, 学期表, 成绩表

WHERE 学生表.学号 = 选课表.学号 AND 选课表.课程编号 = 课程表.课程编号 AND 学期表.学期编号 = 选课表.学期编号 AND 成绩表.学号 = 学生表.学号 AND 成绩表.课程 = 课程表.课程编号;

通过多表关联查询,我们可以得到学生每个学期的课程信息。由于我们使用了成绩表,我们可以得知学生每门课的成绩。这个查询语句可以让我们更好地了解学生的学业情况。

第三部分:存储过程与触发器的应用

存储过程和触发器是数据库管理系统的高级工具。存储过程可以将一系列操作封装到一个过程中,方便实现批量操作。触发器可以监控数据库中的数据变化,当特定条件满足时,触发器会自动执行一系列操作。在实验4的第三部分,我们需要利用存储过程和触发器实现以下两个问题。

问题七:存储过程实现批量成绩录入

实验中,我们需要向成绩表中批量录入成绩。这个操作虽然简单,但是要输入的数据非常多。为了避免手动输入,我们可以使用存储过程来实现批量录入成绩。

存储过程代码如下:

DELIMITER $$

CREATE PROCEDURE 批量录入成绩()

BEGIN

DECLARE course_id CHAR(10);

DECLARE student_list CURSOR FOR SELECT 学号, 课程 FROM 选课表;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET @status = `complete`;

SET @status = `not complete`;

OPEN student_list;

WHILE @status != `complete` do

FETCH student_list INTO @student_id, course_id;

INSERT INTO 成绩表(学号, 课程) VALUES(@student_id, course_id);

END WHILE;

CLOSE student_list;

END;

$$

DELIMITER ;

我们首先声明一个存储过程,然后通过游标遍历选课表,以将每名学生选修的每门课程的信息插入成绩表中。

问题八:触发器实现学生转专业

实验中,我们需要为学生表建立一个触发器,当学生更改专业编号时,触发器会自动更新学生的专业名称。

触发器代码如下:

CREATE TRIGGER update_major_name

AFTER UPDATE ON 学生表

FOR EACH ROW

BEGIN

UPDATE 学生表 SET 专业名称 = (SELECT 专业名称 FROM 专业表 WHERE 专业编号 = NEW.`专业编号`) WHERE 学号 = NEW.`学号`;

END;

这个触发器每当学生表中的专业编号发生更改时,就会自动查询专业表,以更新学生的专业名称。

通过这次实验,我对数据库管理系统有了更深入的了解,加强了对数据库技术应用的认识。在实验过程中,我学习了各种查询优化、多表关联查询,以及存储过程和触发器的应用。这些技能对于未来从事相关工作的应届毕业生来说非常有用。


数据运维技术 » 实战体验:数据库上机实验四成果展示 (数据库上机实验四)