MySQL 作业:从 MySQL 到 MySQL
在现代数据驱动的世界中,数据库扮演着至关重要的角色,作为最流行的开源关系型数据库管理系统,MySQL被广泛应用于Web应用、大数据处理和嵌入式系统中,本文将通过一系列练习题,帮助读者巩固MySQL的基本使用,涵盖从基础查询到高级数据处理的内容。
一、数据库设计与创建
1.1 需求分析
在进行任何数据库操作之前,首先需要明确需求,假设我们需要设计一个学生信息管理系统,涉及学生、课程、成绩等基本实体。
1.2 数据字典
在设计表结构之前,我们需要定义数据字典,数据字典是对数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述的工具。
学生表 (Student)
学号 (SId): varchar(10), 主键
姓名 (SName): varchar(10)
出生日期 (SBirth): datetime
性别 (SSex): varchar(4)
课程表 (Course)
课程编号 (CId): varchar(10), 主键
课程名称 (CName): varchar(50)
教师编号 (TId): varchar(10), 外键
成绩表 (Score)
学号 (SId): varchar(10), 外键
课程编号 (CId): varchar(10), 外键
分数 (Score): decimal(5,2)
教师表 (Teacher)
教师编号 (TId): varchar(10), 主键
教师姓名 (TName): varchar(20)
二、建表语句与数据插入
我们根据需求分析和数据字典来创建表并插入示例数据。
-创建学生表 CREATE TABLE Student ( SId varchar(10) PRIMARY KEY, SName varchar(10) NOT NULL, SBirth datetime, SSex varchar(4) ); -创建课程表 CREATE TABLE Course ( CId varchar(10) PRIMARY KEY, CName varchar(50) NOT NULL, TId varchar(10), FOREIGN KEY (TId) REFERENCES Teacher(TId) ); -创建成绩表 CREATE TABLE Score ( SId varchar(10), CId varchar(10), Score decimal(5,2), PRIMARY KEY (SId, CId), FOREIGN KEY (SId) REFERENCES Student(SId), FOREIGN KEY (CId) REFERENCES Course(CId) ); -创建教师表 CREATE TABLE Teacher ( TId varchar(10) PRIMARY KEY, TName varchar(20) NOT NULL );
插入示例数据
-插入学生数据 INSERT INTO Student (SId, SName, SBirth, Ssex) VALUES ('01', '赵雷', '1990-01-01', '男'), ('02', '钱电', '1990-12-21', '男'); -插入课程数据 INSERT INTO Course (CId, CName, TId) VALUES ('01', '数学', '01'), ('02', '英语', '02'); -插入成绩数据 INSERT INTO Score (SId, CId, Score) VALUES ('01', '01', 85.5), ('02', '02', 78.0); -插入教师数据 INSERT INTO Teacher (TId, TName) VALUES ('01', '张三'), ('02', '李四');
三、基础查询练习
3.1 简单查询
1、查询所有学生的信息
SELECT * FROM Student;
2、查询所有课程的信息
SELECT * FROM Course;
3、查询所有成绩的信息
SELECT * FROM Score;
3.2 条件查询
4、查询名字为“赵雷”的学生信息
SELECT * FROM Student WHERE SName = '赵雷';
5、查询成绩大于等于90分的学生学号和课程编号
SELECT SId, CId FROM Score WHERE Score >= 90;
3.3 聚合函数与分组查询
6、查询每门课程的平均成绩
SELECT CId, AVG(Score) AS AvgScore FROM Score GROUP BY CId;
7、查询每个学生的成绩总数和平均成绩
SELECT SId, COUNT(*) AS TotalCourses, AVG(Score) AS AvgScore FROM Score GROUP BY SId;
3.4 多表连接查询
8、查询每个学生选修的课程名称和成绩
SELECT Student.SId, Student.SName, Course.CName, Score.Score FROM Student JOIN Score ON Student.SId = Score.SId JOIN Course ON Score.CId = Course.CId;
9、查询每个教师教授的课程及对应的学生名单
SELECT Teacher.TName, Course.CName, Student.SName FROM Teacher JOIN Course ON Teacher.TId = Course.TId JOIN Score ON Course.CId = Score.CId JOIN Student ON Score.SId = Student.SId;
3.5 子查询与嵌套查询
10、查询选修了“张三”老师课程的学生信息
SELECT DISTINCT Student.* FROM Student JOIN Score ON Student.SId = Score.SId JOIN Course ON Score.CId = Course.CId WHERE Course.TId = '01';
11、查询没有选修“01”课程的学生信息
SELECT * FROM Student WHERE SId NOT IN (SELECT SId FROM Score WHERE CId = '01');
四、进阶查询练习
4.1 联合查询(UNION)
12、查询所有学生和教师的姓名和出生日期或入职日期
(SELECT SName, SBirth AS Date FROM Student) UNION ALL (SELECT TName, HireDate AS Date FROM Teacher);
4.2 排序与分页
13、按成绩从高到低排序显示前五条记录
SELECT * FROM Score ORDER BY Score DESC LIMIT 5;
4.3 事务管理与数据完整性
14、开启事务,插入新学生并提交
START TRANSACTION; INSERT INTO Student (SId, SName, SBirth, Ssex) VALUES ('03', '李晓明', '1995-05-20', '女'); COMMIT;
15、开启事务,更新学生信息但回滚
START TRANSACTION; UPDATE Student SET Ssex = '女' WHERE SId = '01'; ROLLBACK;
五、常见问题解答(FAQs)
Q1:如何在MySQL中创建一个用户并赋予其权限?
A1:在MySQL中,可以使用CREATE USER
语句来创建一个新用户,并使用GRANT
语句赋予其权限,创建一个名为newuser
的用户并赋予其对所有数据库的所有权限:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost'; FLUSH PRIVILEGES;
>注意事项:在实际生产环境中,应避免使用ALL PRIVILEGES
,而是根据实际需求赋予最小必要权限。FLUSH PRIVILEGES
用于重新加载权限,确保更改立即生效。
Q2:如何优化MySQL中的慢查询?
A2:优化慢查询可以从多个方面入手,包括但不限于以下几点:
1、索引优化:确保查询中使用的列上有适当的索引,可以通过EXPLAIN
关键字查看查询的执行计划,确认是否使用了索引,对于经常用于查询条件的列,建议创建索引,要注意避免过多的索引,因为写操作时需要维护索引,可能会影响性能,可以使用CREATE INDEX
语句创建索引,CREATE INDEX idx_student_name ON Student(SName);
,对于不再需要的索引,应及时删除以节省资源和维护性能,删除索引的语法是:DROP INDEX index_name ON table_name;
,定期检查索引的使用情况,并根据需要进行优化和调整,如果某些索引长时间未被使用,可以考虑删除它们以减少维护成本,相反,如果发现某些查询频繁执行且没有合适的索引,应该考虑添加相应的索引以提高查询效率,利用工具如MySQL自带的慢查询日志(slow query log)来监控哪些查询执行时间过长,从而有针对性地优化这些查询,可以设置阈值为1秒,记录超过该时间的查询日志:SET GLOBAL long_query_time = 1;
,然后通过分析慢查询日志找出潜在的性能瓶颈并进行优化,还可以使用pt-query-digest
等工具进一步分析和优化慢查询,运行以下命令来分析慢查询日志文件中的查询:pt-query-digest /path/to/mysql-slow.log > digest.txt
,这将生成一个包含详细统计信息的报告文件,帮助你识别最耗时的查询以及可能的优化方案,合理利用缓存机制也是提高性能的有效手段之一,可以配置Query Cache来缓存常用查询的结果,减少数据库直接访问的次数,但是需要注意的是,Query Cache在MySQL 5.7版本开始已经被移除,因此需要寻找其他替代方案,如使用外部缓存系统(如Memcached或Redis),优化慢查询是一个持续的过程,需要结合具体的业务场景和数据特点来进行针对性的调整,通过不断的监控、分析和调整,可以逐步提升数据库的整体性能表现,还可以考虑使用分区表、归档旧数据、优化SQL语句结构等方法来进一步提升性能,对于历史数据量大的表,可以采用分区策略将数据按时间或其他维度分割成多个部分,从而提高查询效率;对于不再频繁访问的历史数据,可以将其归档到其他存储介质中,以减轻主库的压力;而对于复杂的SQL语句,则可以通过重写或拆分成更小的子查询来简化逻辑并提高效率,不要忽视硬件层面的优化潜力,增加服务器内存可以减少磁盘I/O操作带来的开销;升级CPU可以提高计算能力;使用SSD代替传统硬盘可以显著提升读写速度等等,综合运用软硬件两方面的手段才能达到最佳的优化效果,定期备份数据也是非常重要的一环,虽然这不直接关系到慢查询的优化,但良好的备份策略可以在发生意外情况时快速恢复数据,保证业务的连续性和稳定性,可以使用mysqldump工具定期导出数据库备份文件:mysqldump -u root -p database_name > backup.sql
,为了提高备份效率和减少对线上业务的影响,可以考虑使用增量备份或基于快照的备份方案,利用LVM快照功能对虚拟机进行备份,或者使用MySQL Enterprise Backup等专业工具来实现热备份,这样既可以保证数据的一致性和完整性,又能最大限度地减少停机时间和维护成本,优化慢查询是一个系统工程,需要从多个角度综合考虑并实施相应的措施才能取得最佳效果,希望以上建议对你有所帮助!如果有更多具体问题欢迎继续交流讨论。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1467080.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复