简介:一份围绕姜桂洪主编《MySQL数据库应用与开发》教材前六章整理的完整实训报告,适合正在学习MySQL 5.7的数据库初学者、高校计算机相关专业学生,以及需要参考课程实训报告结构与写法的人群。内容基于清华大学出版社2018年版教材,在Windows10、MySQL5.7环境下完成手动实践并验证可行,全面覆盖安装MySQL服务器、数据库基本操作、表及数据完整性、数据检索、索引和视图五个核心环节,包含实训目的与要求、SQL语句示例、执行结果和操作要领,读者可按文档步骤逐一复现。资源为单个doc文档,压缩包约6.61MB,适合用于数据库原理课程实训参考、考前复习以及实验报告模板改写。目前已有2475人学习下载,对希望系统梳理MySQL基础操作并快速产出规范实训文档的学习者很实用。
1. MySQL实训报告:一份能跟练到底的数据库实战路线图
这份《MySQL数据库应用与开发实训报告》,不是一篇词藻华丽的课程心得,而是云南民族大学一位计科学生跟着清华大学出版社2018版教材《MySQL数据库应用与开发》逐条手动跑过的实验记录。覆盖的路径非常清晰:安装MySQL 5.7 → 数据库基本操作 → 建表与数据完整性 → 数据检索 → 索引与视图,每一步都有可复现的SQL和结果对照。
适合的人群也很明确:正在做数据库课程设计、准备MySQL实训考核、或者刚入职接手学校旧教务系统想补基础的人。你不需要懂理论推导,照着命令敲,敲完就知道这门课在讲什么。因为它的原点是一份实训报告——学生自己跑通后如实记录的产物,没有官方文档那种漏掉关键步骤的毛病,也没有营销号那种“复制就能用”的虚话。我把它拆开讲清楚,哪些命令可以直接抄,哪些地方容易翻车,以及为什么教程当年这么设计。
2. 安装MySQL 5.7服务器:安装程序选择、root密码与端口检查三个关口
2.1 安装程序:选MSI社区版而不是ZIP解压版
实训报告里写的安装文件是mysql-installer-community-5.7.17.0.msi,这是MySQL官方提供的Windows社区版安装程序。第一次接触MySQL的人容易在这纠结:官网下载页同时提供MSI Installer和ZIP Archive两种格式,很多人看ZIP解压版“免安装”就选了它,结果建服务、初始化数据目录、配环境变量全靠手敲,最后卡死在mysqld --initialize这步。
我的建议和实训报告一致:走MSI向导。理由有三个。第一,MSI安装包自带完整的服务注册和配置流程,把MySQL服务写进Windows服务管理器,开机自启,不需要每次都开管理员终端手动启停。第二,它可以联动安装MySQL Workbench和命令行客户端,后面查表结构、跑SELECT都省事。第三,数据目录默认初始化好了,装完就能登录,ZIP解压版还需要自己初始化data目录和root密码。
双击MSI后,Windows会弹出“打开文件-安全警告”窗口,这是对一个来自网络安装包的标准拦截。单击运行进入许可协议界面,勾选I accept the license terms继续。这一步几乎没有技术含量,但不接受协议流程就走不下去,是新手第一次卡住的地方。
2.2 root密码设置与安装类型选择
安装向导走到“Choosing a Setup Type”时,推荐选Developer Default,它会一起装好MySQL Server、MySQL Workbench、命令行工具和数据库文档。实训机房里没必要全装,但Workbench一定要有——后面SHOW CREATE TABLE的结果横向看很挤,用Workbench的表格视图清楚得多。
进入“Accounts and Roles”界面时,需要为root用户设置密码。实训环境是单机学习,密码简单无所谓,但建议记在笔记本上,因为后面LOAD DATA、Workbench连接都要反复用。MySQL 5.7默认root认证方式是mysql_native_password,所以命令行登录时不需要额外配置认证插件;如果装的是MySQL 8.0,这里会多一个caching_sha2_password认证插件的兼容问题,对老客户端不太友好。
单击Next进入安装和配置界面,保持默认即可。真正容易翻车的是端口这一步:MySQL默认监听3306,如果机器上已经装有旧版MySQL或MariaDB,或者某个开发环境占用了3306,安装到“Starting Server”那一步会直接报Port 3306 is already in use。我习惯装之前先跑一条命令确认端口状态:
netstat -ano | findstr :3306输出为空就说明端口空闲。如果被占用,记下输出里的PID,到任务管理器里找到对应进程结束掉,或者安装时把端口改成3307并在Workbench连接时填写相同端口。实训报告里没有写这一步,但在机房环境里,多台机器交错装过不同版本的数据库,端口冲突几乎必然发生。
2.3 安装后的服务验证:命令行和Workbench都要能通
安装向导点Finish之后,MySQL服务已经注册进Windows服务管理器,服务名通常是MySQL57(5.7版本)或安装时自定义的名称。可以用services.msc打开服务列表看到它,状态应该是“正在运行”。
到这一步先做两个最小验证,别急着建库建表:
net start | findstr MySQLmysql -uroot -p第一条确认服务进程在跑,第二条用刚设置的root密码登录。登录成功后能看到mysql>提示符,说明服务端和用户认证都没问题。
再用Workbench做一次连接。第一次连接时填主机127.0.0.1、端口3306、用户root、密码。如果连不上,先别怀疑密码,优先怀疑防火墙:Workbench走TCP/IP协议,命令行走的是本地协议,Windows防火墙要是拦了3306端口,命令行能进而Workbench进不去。解决办法是在Windows防火墙“高级设置”里添加入站规则放行3306,或者连接时把Workbench的SSL选项关掉(在Advanced标签页)。
这里有一个初学者经常忽略的边界:Command Line Client和Workbench的连接通道不一样,能进一个不代表另一个也通。实训报告里没有详细区分这一点,但排查问题时先确认两种连接方式各自的状态,能省掉一大半玄学问题。
3. 数据库基本操作:CREATE DATABASE、字符集设置与命名规则详解
3.1 登录后第一件事:SHOW DATABASES看家底
打开MySQL 5.7 Command Line Client,输入密码登录。首次登录建议先执行这条:
SHOW DATABASES;输出会列出当前服务器上的所有数据库,包括MySQL自带的系统库:information_schema、mysql、performance_schema,5.7.7之后还有sys。这一步有两个目的:确认安装正常、系统库都初始化出来了,顺便感受一下当前账号能看到哪些库。mysql库里存的是用户权限表,root能看到但不能乱删,删了权限系统就崩了。
然后创建实训要求的第一个库:
CREATE DATABASE mysqltest;这条语句创建默认字符集的数据库。问题就出在这个“默认”上——Windows下MySQL 5.7的默认字符集多继承配置文件my.ini里的character_set_server,通常初始是latin1。如果只执行上面这句就急着建表、插入中文数据,后面SELECT出来大概率是乱码。实训报告特意在后面写了一个带字符集参数的创建范例,就是给这个坑打的补丁。
创建能识别简体中文的库,正确写法是这样:
CREATE DATABASE teaching DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;DEFAULT CHARACTER SET声明库的默认字符集,COLLATE声明默认排序规则。gb2312_chinese_ci里的ci是case insensitive,意思是字母不区分大小写,A和a排序时算同一个字符。如果你需要区分大小写,要换cs结尾的校对规则。
这里解释一个反复被问到的问题:“为什么教程用gb2312而不用utf8?” 这是一本2018年的教材,Windows环境下gb2312覆盖简体中文绰绰有余,当时新旧系统之间的编码兼容性反而比utf8稳。但现在自己写项目建库,我更推荐utf8mb4——它是MySQL 8.0的默认字符集,能直接存emoji和生僻字,gb2312做不到。
3.2 修改已有数据库的字符集:ALTER DATABASE只影响新表
实训给出的管理操作是修改已有数据库字符集,满足“让数据库识别简体中文且字母不区分大小写”这个要求:
ALTER DATABASE mysqltest DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;使用完成后,新库内新建表时会继承这个设置。需要提醒一个边界:ALTER DATABASE只对执行之后新建的表生效,不负责迁移旧表的字符编码。数据库里已经存在的表,存储编码还是旧设置,如果你在改库之前就往里写过中文并落成了乱码,改完库字符集并不会让乱码恢复,必须对表单独执行ALTER TABLE table_name CONVERT TO CHARACTER SET gb2312才有用。
查看数据库现在的结构信息:
SHOW CREATE DATABASE mysqltest\G这里用\G结尾替代分号,输出会纵向展开,一行一个字段,不会因为列太宽被命令行折行挤乱。这个习惯在数据库字段多时尤其好用,比横向输出好读得多。
3.3 命名规则与DROP DATABASE的后悔药问题
实训报告对数据库命名规则的强调很有价值,这四条规则执行时最容易出错的是后两条:
a) 不能与其他数据库重名,重名直接报ERROR 1007b) 名称由字母、数字、下划线、$组成,不能是单独的数字 c) 名称最长64个字符,别名最长256个字符 d) 不能用MySQL关键字当库名、表名
第四点在真实业务里踩坑概率很高。order、group、desc、select这类词长得很像合适的表名,实际全是保留字。教学里不会要求你用这些词命名,但真实项目里大概率会遇到——处理办法是换名,而不是强行用反引号包裹,后患无穷。
删除数据库的语句:
DROP DATABASE mysqltest;执行后,库本身连同里面所有表和数据一起消失,没有后悔药可吃。实训报告特意标红“删除数据库后就会删除该数据库中所有的表和所有数据”。我的习惯是,就算删除练习库,也会先SHOW DATABASES确认拼写,防止手滑删成旁边的正式库。机房环境里练完删除操作,顺手把正在用的teaching数据库重新CREATE出来,能避免下一章节建表时找不着库的尴尬。
4. 建表与数据操作:六张表设计、四种插入方式与UPDATE边界
4.1 teaching库的六张表:从学生表到选课表的字段设计
教学库teaching是典型的教务系统模型,六张表分别为student、course、score、teacher、teach_course、sc。前五张描述实体和实体联系,sc表记录选课明细并带自增主键和默认时间。
学生表的建表语句是实训报告里最完整的一个例子:
CREATE TABLE student ( studentno char(11) PRIMARY KEY COMMENT '学生学号', sname char(8) NOT NULL COMMENT '学生姓名', sex enum('男','女') NOT NULL COMMENT '性别', birthdate date COMMENT '出生日期', entrance int(3) COMMENT '入学成绩', phone varchar(12) COMMENT '电话', Email varchar(20) COMMENT '电子信箱' );字段设计有两处值得留意。studentno用char(11)而不是varchar(11),因为学号是固定长度的定长编码,定长字段在InnoDB里的检索效率比变长前缀更好,且没有空间浪费问题。sex用enum限制了字段只能取两个值之一,数据库层面就挡住非法输入——这就是“用户自定义完整性约束”的直观案例。
课程表course结构和学生表类似,核心是courseno主键。成绩表score是一个简化设计:studentno是主键,意味着一个学生只能有一条成绩记录,放到真实教务系统里这并不合理(一个学生要修多门课)。教材这么设计是为了简化主键演示,并不是最佳业务建模。如果自己扩展,正确做法是studentno和courseno组成复合主键。
教师和课程之间是多对多关系,需要纽带表teach_course拆解:
CREATE TABLE teach_course ( teacherno char(6) NOT NULL COMMENT '教师编号', courseno char(6) NOT NULL COMMENT '课程编号', PRIMARY KEY (teacherno, courseno) );复合主键确保了教师与课程之间的唯一配对,同时两列都保留非空约束。
选课表sc是实训里最能练到默认值语法的表:
CREATE TABLE sc ( sc_no int AUTO_INCREMENT PRIMARY KEY COMMENT '选课号', studentno char(11) COMMENT '学号', courseno char(6) COMMENT '课程号', teacherno char(6) COMMENT '教师号', sc_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '选课时间' );AUTO_INCREMENT主键让sc_no自动增长,DEFAULT CURRENT_TIMESTAMP让选课时间自动取当前时间,插入时不手动填这两个字段也不会报错。CURRENT_TIMESTAMP在报表统计和审计场景里是标配做法。
4.2 查看表结构:DESCRIBE和SHOW CREATE TABLE的粒度差
查看表基本结构的标准语句:
DESCRIBE student;也支持简写DESC student;。输出包含字段名、类型、是否允许NULL、键信息、默认值,适合快速浏览。但它不显示字符集、存储引擎、约束名等信息。
查看更多细节需要另一条:
SHOW CREATE TABLE score\G输出的是完整建表语句,包括ENGINE=InnoDB和DEFAULT CHARSET=gb2312。实训报告里解释的InnoDB是Windows下MySQL默认存储引擎,这半句话里还藏一层意思——InnoDB支持事务和外键约束,而旧版MyISAM不支持,后续做数据完整性验证时引擎选错会很被动。
我实际工作里用SHOW CREATE TABLE最多的场景是“抄表结构”:把输出结果整段复制出来,改成新表名再执行,一秒复制一张生产表,比手动敲CREATE TABLE可靠得多。
4.3 ALTER TABLE四类修改操作
实训报告提供了增列、重命名、改类型、删列四个修改表的例子,正好覆盖日常改动的主要形态:
ALTER TABLE student ADD COLUMN address varchar(30) COMMENT '地址' AFTER Email; RENAME TABLE sc TO se_course; ALTER TABLE course MODIFY type enum('必修课','选修课') DEFAULT '必修课'; ALTER TABLE student DROP COLUMN address;逐一拆开说。第一条在Email列后追加address列,AFTER控制新列位置,不写则默认追加到表末尾。第二条改名,RENAME TABLE比ALTER TABLE ... RENAME TO少敲几个字符,功能一样;改名之前要SHOW TABLES确认新名字没有被占用,否则MySQL直接拒绝执行。第三条最坑:MODIFY整列定义整体重写,不只是改一个属性,如果你原来这列有NOT NULL、默认值这些设置,必须在新定义里重新写一遍,否则会被悄悄改掉。第四条删列,会真的把该列全部数据一起删掉,执行前要万分确认。
4.4 四种插入方式与图片数据落库
实训设计了四种数据插入方式,分别对应不同数据来源。
单行插入用INSERT ... VALUES:
INSERT INTO student (studentno, sname, sex, birthdate, entrance, phone, Email) VALUES ('18137221508', '云辉', '男', '1999-03-15', 605, '13812345678', 'yunhui@163.com');多行插入把多个元组用逗号连在一个VALUES后面:
INSERT INTO student (studentno, sname, sex, entrance) VALUES ('18137221501', '张一', '女', 612), ('18137221502', '李二', '男', 588), ('18137221503', '王三', '男', 634);列清单里没写的字段会自动落默认值或NULL。REPLACE INTO和INSERT的差别在于主键冲突处理:INSERT遇到主键重复直接报错,REPLACE会先删掉旧行再插入新行,适合“不存在则插入、存在则覆盖”的更新场景:
REPLACE INTO course (courseno, cname, type, period, exp, term) VALUES ('c08101', '数据库原理', '必修课', 64, 16, 1);批量导入外部文本用LOAD DATA,实训里把teacher表的数据放在d:\Mysql\teacher.txt,Tab键分隔:
LOAD DATA LOCAL INFILE 'd:/Mysql/teacher.txt' INTO TABLE teacher;LOCAL关键字表示文件在客户端主机上;去掉它MySQL会去服务器端找文件。Windows路径建议写正斜杠,单反斜杠容易被当成转义符,两个反斜杠又容易数错。这个命令的成功条件很苛刻:文件必须用Tab分隔、每一行末尾也要一个Tab、字段数量和表完全一致,任何一环不对就整行读不进去。
SET子句插入适合明确指定列值、其他列走默认的场景:
INSERT INTO sc SET studentno='18137221508', courseno='c08101', teacherno='t0101';sc_no自增,sc_time取当前时间,这句的效率比写全字段VALUES高,也更容易看出选择性赋值逻辑。
图片等二进制数据的插入,需要BLOB类型的支持。实训的做法是先复制表结构、加照片列,再用LOAD_FILE读入图片文件:
CREATE TABLE student01 LIKE student; ALTER TABLE student01 ADD COLUMN photo LONGBLOB COMMENT '照片'; INSERT INTO student01 (studentno, sname, photo) VALUES ('18137221508', '云辉', LOAD_FILE('d:/Mysql/image/picture.jpg'));LOAD_FILE()读取MySQL服务器磁盘上的文件并返回二进制内容,文件路径在Windows下同样推荐正斜杠。MySQL 5.7默认secure_file_priv为空时不会限制读取路径,但很多人用更高版本或改了配置之后会踩到权限报错,报错信息类似于The MySQL server is running with the --secure-file-priv option,这是后话。
4.5 UPDATE更新:精确匹配和条件批量更新
更新操作有两个代表性例子,一精一广:
UPDATE score SET daily = 80 WHERE studentno = '18137221508' AND courseno = 'c08106';UPDATE student01 SET entrance = entrance * 1.08 WHERE entrance < 700;第一条是等值匹配,把特定学生某门课的平时成绩改成80。第二条是条件更新,给所有700分以下的入学成绩统一加8%。第二条语句里entrance = entrance * 1.08这种自引用的写法不常见,但每次都是踩坑高发地——丢WHERE就是全表更新,在键盘上按错一次,生产环境可能就是事故。所以写UPDATE的纪律是:先写WHERE,再写SET,执行前反复确认WHERE条件覆盖到了正确行集。
5. 避坑与排查:MySQL实训里五个典型翻车现场
5.1 安装完成却连不上服务
现象:安装向导最后一步点Finish,打开命令行输入mysql -uroot -p,提示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)。
原因:MySQL服务没有启动,端口被占用或数据目录初始化失败都可能导致服务起不来。最常见的是3306端口被其他程序占用,服务启动被强制中断。
解决:先执行netstat -ano | findstr :3306确认端口占用情况,再到services.msc里找到MySQL57服务手动启动。服务仍不能启动时,打开Windows事件查看器里的MySQL日志,看具体错误码,端口冲突会明确写出bind failed。
5.2 插入中文变成一排问号
现象:执行INSERT写入中文姓名后,SELECT * FROM student查出来的结果是???。
原因:数据库、表、客户端连接三方的字符集不一致。库是latin1、表是gb2312,命令行客户端是utf8,任意一个环节断裂都会乱码。
解决:登录后先执行SET NAMES gb2312;把当前会话字符集对齐;建库时不要依赖默认,显式写DEFAULT CHARACTER SET gb2312或utf8mb4。排查当前整个链路的字符集状态可以用这条命令:
SHOW VARIABLES LIKE 'character_set%';逐个核对character_set_server、character_set_database、character_set_client、character_set_results的取值。
5.3 LOAD DATA导入无数据或报错
现象:LOAD DATA LOCAL INFILE执行成功但SELECT出来是空表,或者报ERROR 1261 (01000): Row N doesn't contain data for all columns。
原因:文件里的分隔符不是Tab、每行末尾漏了Tab、路径里的反斜杠写错、txt文件编码与表字符集不一致。这四条里任意一个都会导致数据读不完整或被整行丢弃。
解决:用记事本或VS Code打开txt确认是Tab分隔,显示空格时所谓“空格”其实是Tab的误判;路径改成正斜杠d:/Mysql/teacher.txt;文件另存为UTF-8或ANSI编码;导入前先用DESCRIBE teacher核对表字段数量与txt列数一致。
5.4 建表撞上MySQL保留字
现象:CREATE TABLE order (...)直接提示ERROR 1064 (42000): You have an error in your SQL syntax。
原因:order是MySQL的保留字,用于排序子句,不能直接做表名或字段名。
解决:命名避开保留字清单,order换成orders、order_info、user_order这类业务名;非要用的时候用反引号包裹——但反引号会让所有后续SQL都变得啰嗦,能不用就不用。实训课程不会刻意踩这个坑,真实项目里几乎必遇。
5.5 DROP TABLE时被外键约束拦下
现象:执行DROP TABLE course,报ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails。
原因:course表被score表的外键引用,存在外键依赖时不能直接删除父表。
解决:先删子表再删父表,或者先ALTER TABLE score DROP FOREIGN KEY解除外键约束再删。这个坑更多是提醒设计阶段想清楚:外键约束能保证数据一致性,但也会抬高DDL操作成本。很多线上团队干脆不用外键,把一致性逻辑放在应用层,就是为了避免做表结构变更时被约束卡死。
6. 检索、索引与视图联动验证:养成EXPLAIN压测的小习惯
数据进去了,课程里真正的重头戏是数据检索。实训报告把索引和视图放在最后,目录顺序刚好对应一个验证链路:建索引 → SELECT验证 → 建视图做固化查询。这三件事串起来做,才不是白学。
先为高频查询字段建索引:
CREATE INDEX idx_studentno ON student(studentno); CREATE UNIQUE INDEX idx_courseno ON course(courseno);索引的物理实现不是黑匣子,InnoDB默认使用B+树结构,等值查询和范围查询都能命中;idx_courseno建的是唯一索引,保证课程编号不重复,这层约束也顺带实现了部分实体完整性。
然后用EXPLAIN看SQL到底走没走索引:
EXPLAIN SELECT * FROM student WHERE studentno = '18137221508';EXPLAIN返回的结果集里,type字段是关键指标。const表示主键或唯一索引的等值查询,这是最快路径;ref代表命中了普通索引;ALL代表全表扫描——数据量一大就会慢。养成写完SELECT就跑一下EXPLAIN的习惯,能直接看穿索引有没有生效。
多表连接的写法:
SELECT s.studentno, s.sname, c.cname, sc.daily, sc.final FROM student s JOIN sc ON s.studentno = sc.studentno JOIN course c ON c.courseno = sc.courseno WHERE sc.final >= 60;两张连接表如果JOIN字段上有索引,连接开销会明显下降。执行计划看type有没有从ALL变成ref,这就是验证索引价值最直观的方式。
子查询是另一种检索路径:
SELECT studentno, sname FROM student WHERE studentno IN ( SELECT studentno FROM sc WHERE courseno = 'c08101' );视图是查询的固化封装:
CREATE VIEW v_student_score AS SELECT s.studentno, s.sname, c.cname, sc.daily, sc.final FROM student s JOIN sc ON s.studentno = sc.studentno JOIN course c ON c.courseno = sc.courseno;创建完成后,直接查视图:
SELECT * FROM v_student_score WHERE final >= 85;视图作用的关键点在于权限控制:可以只开放部分列给应用账号,应用查询时不需要知道背后的表结构。但注意视图并不存储数据,每次查询都会重新执行业务层SQL;单表视图且不含聚合、DISTINCT时可以做有限更新,多表连接视图的更新限制更多,别指望视图当写接口用。
从那以后我每次写完一条检索语句,都强制自己走一遍三层检查:EXPLAIN看索引命中、加LIMIT 10抽样看数据对不对、最后和视图结果集做对比确认口径一致。这个习惯让数据库课设和后来上线项目少挨了不少骂,希望帮到你。
本文还有配套的精品资源,点击获取