实验目的
本实验旨在通过实践操作,加深对MySQL数据库管理系统的理解,掌握数据库的基本概念、数据类型、表的创建与管理、数据的增删改查(CRUD)操作、索引的使用、视图的创建与应用、存储过程和触发器的编写等核心技能,通过解决实际问题,提升分析问题和解决问题的能力,为后续的数据库设计与优化打下坚实基础。
实验环境
操作系统:Windows 10
数据库版本:MySQL 8.0.23
开发工具:MySQL Workbench 8.0,Notepad++
硬件配置:Intel i5处理器,8GB RAM,256GB SSD
与步骤
数据库设计
需求分析
设计一个简易的学生信息管理系统,包括学生基本信息、课程信息及选课信息。
数据库结构设计
1、学生表(students):存储学生基本信息。
学号(id):INT,主键,自增
姓名(name):VARCHAR(50)
性别(gender):ENUM('男', '女')
生日(birthday):DATE
入学日期(admission_date):DATE
2、课程表(courses):存储课程信息。
课程号(id):INT,主键,自增
课程名(name):VARCHAR(100)
学分(credits):FLOAT
3、选课表(enrollments):记录学生选课情况。
学号(student_id):INT,外键,关联学生表
课程号(course_id):INT,外键,关联课程表
成绩(grade):FLOAT
SQL语句实践
创建数据库与表
CREATE DATABASE StudentManagementSystem; USE StudentManagementSystem; CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender ENUM('男', '女') NOT NULL, birthday DATE, admission_date DATE ); CREATE TABLE courses ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, credits FLOAT NOT NULL ); CREATE TABLE enrollments ( student_id INT, course_id INT, grade FLOAT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) );
数据操作
插入数据
INSERT INTO students (name, gender, birthday, admission_date) VALUES ('张三', '男', '20000101', '20180901'); INSERT INTO courses (name, credits) VALUES ('高等数学', 4.0); INSERT INTO enrollments (student_id, course_id, grade) VALUES (1, 1, NULL); 假设张三选了高等数学,但成绩暂未录入
查询数据
查询所有学生的基本信息 SELECT * FROM students; 查询“张三”的详细信息及其所选课程 SELECT s.*, c.name AS course_name, e.grade AS course_grade FROM students s LEFT JOIN enrollments e ON s.id = e.student_id LEFT JOIN courses c ON e.course_id = c.id WHERE s.name = '张三';
更新与删除数据
更新张三的生日信息 UPDATE students SET birthday = '20000102' WHERE name = '张三'; 删除未录入成绩的选课记录 DELETE FROM enrollments WHERE grade IS NULL;
高级功能探索
创建索引
为提高查询效率,对学生表的name
字段创建索引。
CREATE INDEX idx_students_name ON students (name);
使用视图
创建视图以简化复杂查询。
CREATE VIEW v_student_courses AS SELECT s.id AS student_id, s.name AS student_name, c.name AS course_name, e.grade AS course_grade FROM students s JOIN enrollments e ON s.id = e.student_id JOIN courses c ON e.course_id = c.id;
存储过程与触发器
编写存储过程计算学生平均成绩,并创建一个触发器在插入新成绩时自动调用该存储过程。
DELIMITER // CREATE PROCEDURE UpdateAverageGrade(IN studentId INT) BEGIN DECLARE avgGrade FLOAT; SELECT AVG(grade) INTO avgGrade FROM enrollments WHERE student_id = studentId AND grade IS NOT NULL; UPDATE students SET average_grade = avgGrade WHERE id = studentId; END // DELIMITER ; CREATE TRIGGER trg_AfterInsertGrade AFTER INSERT ON enrollments FOR EACH ROW BEGIN IF NEW.grade IS NOT NULL THEN CALL UpdateAverageGrade(NEW.student_id); END IF; END //
实验归纳与反思
本次实验通过构建一个简单的学生信息管理系统,系统地学习了MySQL数据库的基础操作与进阶应用,从数据库设计到实际操作,每一步都加深了对数据库理论与实践结合的理解,特别是在处理多表关联查询、使用索引优化性能、以及编写存储过程和触发器自动化任务时,深刻体会到了数据库设计的艺术性和高效性,将继续探索更复杂的数据库应用场景,如分布式数据库、大数据处理等,不断提升数据库管理与优化能力。
FAQs
Q1: 如何快速定位并优化SQL查询中的瓶颈?
A1:使用EXPLAIN
命令分析查询计划是定位性能瓶颈的有效方法,通过查看查询执行的具体步骤、使用的索引等信息,可以识别出全表扫描、文件排序等低效操作,进而针对性地添加或调整索引、优化查询逻辑,定期进行数据库维护,如更新统计信息、重建索引等,也有助于保持查询性能。
Q2: 在什么情况下应该使用视图而不是直接查询基础表?
A2:视图适用于以下几种情况:当需要简化复杂查询、隐藏底层表结构的复杂性时;当需要提供数据的逻辑抽象,便于不同用户基于同一数据集进行定制化访问时;以及当希望通过只读视图限制对敏感数据的直接访问权限时,视图可以作为一层安全屏障,同时也能提高代码的可读性和重用性,过度依赖视图可能导致性能下降,特别是涉及多层嵌套或大量计算的视图,因此在使用时需权衡利弊。