无论是数据分析师、后端开发工程师还是数据库管理员,掌握MySQL的精髓都是职业生涯中不可或缺的技能
为了帮助大家系统地提升MySQL应用能力,本文将通过一系列综合练习题,结合理论讲解与实战操作,深度剖析MySQL的关键知识点,助力你在数据库管理的道路上越走越远
一、基础篇:构建坚实的MySQL基础 1. 数据库与表的创建与管理 练习题1: 创建一个名为SchoolDB的数据库,并在其中创建一个名为`Students`的表,包含以下字段:`StudentID`(整型,主键,自增)、`FirstName`(字符型,50字符)、`LastName`(字符型,50字符)、`Age`(整型)、`EnrollmentDate`(日期型)
解析与操作: sql CREATE DATABASE SchoolDB; USE SchoolDB; CREATE TABLE Students( StudentID INT AUTO_INCREMENT PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL, Age INT, EnrollmentDate DATE ); 知识点回顾: CREATE DATABASE用于创建数据库,`USE`命令切换到指定数据库,`CREATE TABLE`定义表结构,包括字段类型、约束等
练习题2: 修改Students表,增加一个新的字段`Email`(字符型,100字符),并允许该字段为空
解析与操作: sql ALTER TABLE Students ADD COLUMN Email VARCHAR(100); 知识点回顾: ALTER TABLE用于修改表结构,如添加、删除或修改列
2. 数据插入与查询 练习题3: 向Students表中插入以下数据,并验证插入是否成功
plaintext FirstName: John, LastName: Doe, Age:20, EnrollmentDate: 2023-09-01, Email: john.doe@example.com FirstName: Jane, LastName: Smith, Age:19, EnrollmentDate: 2023-09-05, Email: NULL 解析与操作: sql INSERT INTO Students(FirstName, LastName, Age, EnrollmentDate, Email) VALUES(John, Doe,20, 2023-09-01, john.doe@example.com); INSERT INTO Students(FirstName, LastName, Age, EnrollmentDate) VALUES(Jane, Smith,19, 2023-09-05); --验证插入 SELECTFROM Students; 知识点回顾: INSERT INTO用于向表中插入数据,`SELECT`语句用于查询数据
二、进阶篇:深入理解MySQL核心功能 3. 数据更新与删除 练习题4: 将Students表中`StudentID`为1的学生的年龄更新为21岁,并将其邮箱修改为`john.newemail@example.com`
解析与操作: sql UPDATE Students SET Age =21, Email = john.newemail@example.com WHERE StudentID =1; 知识点回顾: UPDATE语句用于修改表中现有记录,`WHERE`子句用于指定修改条件
练习题5: 删除Students表中`Email`字段为空的记录
解析与操作: sql DELETE FROM Students WHERE Email IS NULL; 知识点回顾: DELETE FROM语句用于删除表中记录,`WHERE`子句同样用于指定删除条件
4. 索引与查询优化 练习题6: 为Students表的`LastName`字段创建一个索引,并测试该索引对查询性能的影响
解析与操作: sql CREATE INDEX idx_lastname ON Students(LastName); -- 测试查询性能前,可以先查看执行计划(以MySQL8.0及以上版本为例) EXPLAIN SELECT - FROM Students WHERE LastName = Smith; 知识点回顾: 索引可以显著提高查询速度,特别是针对大表
`EXPLAIN`命令用于显示查询执行计划,帮助分析查询性能
5. 联接查询与子查询 练习题7: 假设有一个名为Courses的表,包含字段`CourseID`(整型,主键)、`CourseName`(字符型,100字符)
创建一个查询,列出所有学生的姓名及他们选修的课程名称(假设有一个关联表`Enrollments`,包含`StudentID`和`CourseID`作为外键)
解析与操作: 首先,假设`Courses`表和`Enrollments`表已存在并正确关联
sql --示例表结构(假设已存在) CREATE TABLE Courses( CourseID INT PRIMARY KEY, CourseName VARCHAR(100) ); CREATE TABLE Enrollments( StudentID INT, CourseID INT, FOREIGN KEY(StudentID) REFERENCES Students(StudentID), FOREIGN KEY(CourseID) REFERENCES Courses(CourseID) ); --插入示例数据(略) -- 联接查询 SELECT Students.FirstName, Students.LastName, Courses.CourseName FROM Students JOIN Enrollments ON Students.StudentID = Enrollments.StudentID JOIN Courses ON Enrollments.CourseID = Courses.CourseID; 知识点回顾: JOIN用于根据两个或多个表之间的相关列组合行,`INNER JOIN`返回两个表中匹配的记录
三、高级篇:掌握MySQL高级特性 6. 事务处理 练习题8: 编写一个事务,向Students表中插入一条新记录,如果插入成功,则更新`Courses`表中某课程的选课人数(假设有一个`EnrollmentCount`字段),如果任何一步失败,则回滚整个事务
解析与操作: sql START TRANSACTION; --假设Courses表中有一个EnrollmentCount字段,且课程ID为1的课程存在 INSERT INTO Students(FirstName, LastName, Age, EnrollmentDate, Email) VALUES(Alice, Wonderland,22, 2023-09-10, alice@example.com); -- 获取新插入学生的ID(假设为自动递增,可通过LAST_INSERT_ID()获取) SET @newStudentID = LAST_INSERT_ID(); -- 更新Courses表中课程ID为1的选课人数(假设当前增加1人) UPDATE Courses SET EnrollmentCount = EnrollmentCount +1 WHERE CourseID =1; --假设有一个检查点,如果满足某