
简介这份PDF面向正在学习MySQL数据库课程的高校学生与自学者针对头歌平台实训作业中数据库定义、表结构管理与约束应用等练习提供参考答案帮助读者在卡关时对照思路、验证语句正确性。资源包共1个PDF文件大小约433KB内容按实训关卡组织并附有目录涵盖创建数据库与数据表、主键与外键约束、唯一约束与默认值设置以及查看表结构、修改表名、调整字段名与数据类型、增删字段、修改字段排列位置、删除外键约束、插入与更新数据等操作每关均给出可直接参考的SQL语句与执行环境提示。目前已有18353人学习下载适合需要系统梳理MySQL基础语法、对照实训任务查漏补缺的初学者也可作为复习表操作与约束知识点的速查材料。1. 头歌MySQL数据库实训答案有目录.pdf一份被误读的复习索引头歌平台的 MySQL 数据库实训几乎每个计算机专业的学生都会撞上。题目按关卡推进每关给一段描述、一张表结构、若干条约束要求你写出能通过校验的 SQL。很多人卡在第三四关就开始找「头歌MySQL数据库实训答案有目录.pdf」以为拿到一份带目录的 PDF 就能照着抄完收工。实际情况是这份 PDF 的价值不在于答案本身而在于它把整个实训的知识点按目录串成了一条线——建库建表、增删改查、索引视图、存储过程、触发器、事务。你真正需要的不是抄答案而是理解每一关背后的 SQL 语法和约束逻辑这样换一道题你也能写出来。这篇文章面向正在做头歌 MySQL 实训、或者已经做完但想系统梳理一遍的人把从环境准备到高阶语法的完整路径拆开讲清楚每一段都给出可复现的代码和参数说明。2. 头歌MySQL实训的环境底座从安装到连接2.1 本地跑通MySQL的两种路径与选择依据头歌平台本身提供在线环境但很多人想在本机复现一遍方便调试和反复试错。本地跑 MySQL 有两条路一是直接装 MySQL Community Server二是用 Docker 拉一个镜像。前者适合长期使用、需要改配置文件比如my.cnf里的字符集和sql_mode的场景后者适合快速起停、不想污染本机环境的场景。Windows 下装 MySQL官网下载 MSI 安装包安装时注意三个参数端口默认 3306如果本机已有 MySQL 实例会冲突改成 3307认证方式选Use Strong Password Encryption对应 MySQL 8 的caching_sha2_password插件字符集选utf8mb4不要选utf8后者在 MySQL 里是阉割版存不了 emoji 和部分生僻字。Linux 下用 apt 或 yum 装完需要手动跑mysql_secure_installation它会引导你设置 root 密码、移除匿名用户、禁止 root 远程登录。这一步别跳过否则本地开发环境的安全性约等于零。Docker 方式最省事docker run -d \ --name mysql-lab \ -p 3307:3306 \ -e MYSQL_ROOT_PASSWORDLab2024 \ -e MYSQL_DATABASEshixun \ -e MYSQL_CHARACTER_SET_SERVERutf8mb4 \ -e MYSQL_COLLATION_SERVERutf8mb4_unicode_ci \ mysql:8.0 \ --default-authentication-pluginmysql_native_password这段命令做了几件事容器名mysql-lab宿主机 3307 映射到容器 3306root 密码设为Lab2024自动创建shixun库字符集和排序规则都设为 utf8mb4 系列最后把认证插件改成mysql_native_password这样老版本的客户端工具比如某些版本的 Navicat也能连上。参数--default-authentication-plugin在 MySQL 8.0 之后被标记为废弃8.4 里已经移除如果你拉的是 8.4 镜像这行要去掉改用--authentication-policymysql_native_password。2.2 连接工具选型与头歌在线环境的差异本地连 MySQL 常用三种工具命令行mysql客户端、Navicat、DBeaver。命令行适合快速验证Navicat 适合可视化建表和查数据DBeaver 免费且对多种数据库支持好。头歌在线环境一般只给一个 Web 终端或者内置的 SQL 编辑器没有图形界面所以你在本地练的时候最好也强迫自己用命令行避免到了平台上不会写source导入脚本。连接命令mysql -h 127.0.0.1 -P 3307 -u root -p --default-character-setutf8mb4-h指定主机-P大写指定端口小写-p是密码提示--default-character-set确保客户端和服务端字符集一致否则中文会变问号。连上之后先跑一句SELECT VERSION();确认版本再跑SHOW VARIABLES LIKE character_set%;看字符集配置。如果character_set_client和character_set_server不一致后面建表存中文必出问题。头歌平台的实训环境通常是 MySQL 5.7 或 8.0具体版本看关卡说明。5.7 和 8.0 在语法上有几个关键差异8.0 支持窗口函数、CTEWITH子句、JSON_TABLE5.7 不支持。如果你在本地用 8.0 写了一道用窗口函数的题提交到头歌 5.7 环境会直接报语法错误。所以本地环境最好和平台版本对齐或者至少知道哪些语法是 8.0 独有的。3. 头歌MySQL实训的关卡拆解从建表到查询的完整链路3.1 建库建表约束条件才是得分点头歌的建表关卡题目会给你一张表的需求描述比如「创建一个学生表包含学号、姓名、性别、出生日期、班级学号为主键姓名非空性别默认为男」。很多人只写了列名和类型就提交结果校验不通过因为漏了约束。一个典型的建表语句CREATE TABLE student ( stu_id VARCHAR(12) NOT NULL COMMENT 学号, stu_name VARCHAR(20) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT M COMMENT 性别, birth_date DATE COMMENT 出生日期, class_name VARCHAR(30) COMMENT 班级, PRIMARY KEY (stu_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci;逐项说明VARCHAR(12)对学号够用如果学校学号是 10 位就写 10NOT NULL对应题目里的「非空」DEFAULT M对应「默认为男」PRIMARY KEY单独一行声明也可以写在列后面但多列主键必须单独声明ENGINEInnoDB是事务引擎头歌默认用这个CHARSETutf8mb4和COLLATEutf8mb4_unicode_ci保证中文和排序正确。常见的翻车点题目要求「性别只能是男或女」你需要加CHECK约束gender CHAR(1) DEFAULT M CHECK (gender IN (M, F))MySQL 8.0.16 之后才真正强制执行CHECK约束之前的版本会解析但忽略。头歌如果跑在 5.7 上写了CHECK也不报错但不起作用校验可能通过也可能不通过取决于平台的校验逻辑。稳妥做法是用ENUMgender ENUM(M, F) DEFAULT MENUM在 5.7 和 8.0 都生效插入非枚举值会报错或插入空字符串取决于sql_mode。3.2 增删改查头歌校验的隐藏规则头歌的查询关卡题目会描述「查询选修了课程号为 C01 的学生姓名和成绩按成绩降序排列」。你写的 SQL 要完全匹配预期的结果集包括列名、列顺序、行顺序。列名如果题目没指定别名默认用原列名如果题目说「查询学生姓名和成绩」你SELECT stu_name, score就行别自作主张加AS。一个多表连接的例子SELECT s.stu_name, sc.score FROM student s JOIN score sc ON s.stu_id sc.stu_id WHERE sc.course_id C01 ORDER BY sc.score DESC;逻辑说明JOIN默认是INNER JOIN只返回两表都匹配的行ON后面写连接条件WHERE过滤课程号ORDER BY降序排列。如果题目要求「包括没有选课的学生」就要用LEFT JOIN并且把WHERE条件移到ON后面否则LEFT JOIN会退化成INNER JOINSELECT s.stu_name, sc.score FROM student s LEFT JOIN score sc ON s.stu_id sc.stu_id AND sc.course_id C01 ORDER BY sc.score DESC;这个坑在头歌的「外连接」关卡里反复出现很多人写了LEFT JOIN但结果和INNER JOIN一样就是因为把条件写在了WHERE里。INSERT语句的坑在于自增主键和默认值。如果表的主键是AUTO_INCREMENT插入时不要写主键列INSERT INTO student (stu_name, gender, birth_date, class_name) VALUES (张三, M, 2004-05-12, 计科2101);如果写了主键列但传NULLMySQL 会自动分配下一个自增值如果传了具体值就用你传的值。头歌的插入关卡有时会校验自增 ID 是否连续所以别手动指定主键。UPDATE和DELETE的坑在于忘记WHERE。头歌的题目一般会限定条件但如果你漏了WHERE整张表的数据都会被改或删校验直接失败。建议在本地练的时候先SELECT一遍确认条件再改成UPDATE或DELETE。3.3 索引与视图头歌里最容易忽略的语法细节索引关卡通常要求「在 student 表的 stu_name 列上创建普通索引」。语法CREATE INDEX idx_stu_name ON student (stu_name);如果要唯一索引CREATE UNIQUE INDEX idx_stu_id ON student (stu_id);但主键已经是唯一索引了再建一个重复的唯一索引会报错。头歌的题目如果要求「创建唯一索引」一般会指定一个非主键列比如email。视图关卡要求「创建一个视图显示学生的学号、姓名和选课门数」。这里涉及分组聚合CREATE VIEW v_stu_course_count AS SELECT s.stu_id, s.stu_name, COUNT(sc.course_id) AS course_count FROM student s LEFT JOIN score sc ON s.stu_id sc.stu_id GROUP BY s.stu_id, s.stu_name;注意GROUP BY后面要跟SELECT里所有非聚合列MySQL 5.7 之后默认开启ONLY_FULL_GROUP_BY不写全就报错。COUNT(sc.course_id)统计的是选课记录数如果用COUNT(*)没选课的学生也会被算成 1因为LEFT JOIN产生了一行 NULL 记录。视图创建后可以像表一样查询SELECT * FROM v_stu_course_count WHERE course_count 2;但视图不能直接建索引查询性能取决于底层表的索引。头歌的视图关卡一般只校验视图定义是否正确不校验性能。4. 头歌MySQL实训的避坑与排查那些校验不通过的真正原因4.1 现象SQL 在本地跑通提交到头歌报语法错误原因本地 MySQL 版本和头歌平台版本不一致。最常见的是本地用 8.0 写了窗口函数ROW_NUMBER() OVER (...)头歌跑在 5.7 上直接报ERROR 1064。另一个高频差异是JSON类型和JSON_EXTRACT函数5.7 支持但语法略有不同。解决先确认头歌环境的 MySQL 版本。在头歌的 SQL 编辑器里跑SELECT VERSION();如果平台不让你跑非题目要求的语句就看关卡说明里的环境描述。确认版本后本地用 Docker 拉一个对应版本的镜像比如mysql:5.7在同一个版本上调试。4.2 现象建表语句校验不通过但语法没报错原因约束条件漏写或写错。头歌的建表校验不仅看语法还看表结构是否完全匹配题目要求。比如题目要求「学号为主键且自增」你只写了PRIMARY KEY没写AUTO_INCREMENT语法通过但校验失败。又比如题目要求「班级默认值为‘未分班’」你写了DEFAULT 未分班但字符集不对存进去变成乱码校验也失败。解决把题目里的每一个约束词圈出来逐条对应到 SQL 里。「主键」对应PRIMARY KEY「非空」对应NOT NULL「唯一」对应UNIQUE「默认值」对应DEFAULT「自增」对应AUTO_INCREMENT「外键」对应FOREIGN KEY ... REFERENCES。写完对照一遍别凭记忆。4.3 现象查询结果的行顺序和预期不一致原因题目要求「按成绩降序排列」你写了ORDER BY score DESC但成绩相同的行顺序不确定头歌的校验可能按主键或其他列做了二次排序。MySQL 的ORDER BY在值相同时不保证稳定顺序除非你显式指定第二排序键。解决在ORDER BY里加上主键作为第二排序键ORDER BY sc.score DESC, s.stu_id ASC;这样成绩相同的行按学号升序排列结果集完全确定。头歌的校验脚本一般会对比整个结果集顺序不一致就算错。4.4 现象中文数据插入后变成问号或乱码原因客户端、连接、服务端、表、列五个层级的字符集不一致。常见的是服务端utf8mb4但客户端连接默认latin1插入中文时被转码成问号。解决在连接命令里加--default-character-setutf8mb4在建表语句里加DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci在my.cnf里加[client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci改完重启 MySQL 服务。头歌在线环境一般已经配好了字符集但本地环境经常漏配。4.5 现象存储过程或触发器创建失败报权限错误原因头歌的在线环境可能限制了CREATE ROUTINE或CREATE TRIGGER权限或者binlog开启时创建函数需要DETERMINISTIC声明。解决先跑SHOW GRANTS FOR CURRENT_USER();看当前用户有没有CREATE ROUTINE权限。如果没有头歌的存储过程关卡一般会给你足够的权限可能是语法问题。创建函数时加上DETERMINISTIC或READS SQL DATACREATE FUNCTION get_stu_name(s_id VARCHAR(12)) RETURNS VARCHAR(20) DETERMINISTIC READS SQL DATA BEGIN DECLARE s_name VARCHAR(20); SELECT stu_name INTO s_name FROM student WHERE stu_id s_id; RETURN s_name; END;DETERMINISTIC表示同样的输入永远返回同样的输出READS SQL DATA表示函数会读数据但不修改。不加这两个声明在开启了binlog的环境里会报ERROR 1418。5. 从头歌实训到真实项目把答案变成能力的三个练习方法头歌的实训关卡是封闭的每道题都有唯一答案但真实项目里没有标准答案。想把实训里学到的东西变成实际能力我一般会做三件事。第一把每道题的 SQL 存成一个.sql文件按关卡编号命名比如level_01_create_table.sql、level_02_insert_data.sql。然后用source命令从头到尾跑一遍mysql -h 127.0.0.1 -P 3307 -u root -p shixun level_01_create_table.sql如果中间某一步报错说明前面的表结构或数据有问题回头改。这个习惯能帮你建立「脚本化」的意识真实项目里没人会在命令行手敲建表语句。第二给每张表造一批测试数据至少 100 行用INSERT INTO ... SELECT配合RAND()生成INSERT INTO score (stu_id, course_id, score) SELECT CONCAT(2021, LPAD(FLOOR(RAND() * 10000), 4, 0)), CONCAT(C, LPAD(FLOOR(RAND() * 10) 1, 2, 0)), FLOOR(RAND() * 61) 40 FROM information_schema.tables LIMIT 100;这段代码从information_schema.tables里借行生成 100 条随机成绩分数在 40 到 100 之间。有了数据之后你写的查询才有意义ORDER BY、GROUP BY、JOIN的结果才能看出对错。第三把实训里的单表查询改写成多表关联。头歌的题目为了简化经常把数据放在一张宽表里但真实项目一定是多表拆分的。比如头歌有一关是「查询每个学生的选课门数和平均分」单表就能做你把它改成三张表——student、course、score——再写一遍SELECT s.stu_name, COUNT(sc.course_id) AS course_count, ROUND(AVG(sc.score), 2) AS avg_score FROM student s LEFT JOIN score sc ON s.stu_id sc.stu_id GROUP BY s.stu_id, s.stu_name HAVING course_count 0 ORDER BY avg_score DESC;HAVING过滤分组后的结果WHERE过滤分组前的行这两个别搞混。ROUND(AVG(sc.score), 2)保留两位小数头歌的校验有时对小数位数有要求真实项目里也建议统一保留两位。最后说一个我自己的习惯每次做完一个实训模块我会把这一模块的 SQL 语法点写在一张便签上贴在显示器边上。建表模块写「约束、字符集、引擎」查询模块写「JOIN、GROUP BY、HAVING、ORDER BY」高级模块写「视图、存储过程、触发器、事务」。下次做新题之前先看一眼便签回忆语法结构而不是直接翻答案。这个习惯让我在后来做真实项目时写 SQL 之前会先想清楚表结构和约束而不是边写边查。希望帮到你。本文还有配套的精品资源点击获取