资讯详情

MySQL实训通关指南:建表约束、查询连接与存储过程全解析

📅 2026/10/31 11:46:04 | 华诺云谱 👁 阅读
MySQL实训通关指南:建表约束、查询连接与存储过程全解析
简介这份PDF面向正在学习或备考MySQL数据库实训的学生与初学者针对头歌平台实训题目提供可直接对照的参考答案帮助解决建库建表、约束设置与表结构修改等练习中的卡点。资源为单个PDF文件约433KB正文按实训关卡组织并配有目录便于按模块快速定位。内容覆盖数据库定义与操作、主键与外键及唯一约束的应用、查看表结构与修改表名、修改字段名与数据类型、添加删除字段、调整字段排列位置、删除外键约束以及插入与更新数据等典型关卡每关均给出对应SQL语句与执行环境提示。已有18400人学习适合课堂实训跟练、课后核对与考前查漏补缺也可作为教师检查学生操作结果的参照。1. 从一道“建表就翻车”的关卡说起这场实训到底考什么很多人第一次做 MySQL 实训栽的不是复杂查询而是第一关建库建表就报错——密码写错、主机名没加、分号漏了平台直接判不过。这类实训的判分逻辑很直接语句能跑通、结果集对得上、结构改到位三者缺一不可。它考的不是你会不会背语法而是你能不能把“数据定义、表结构变更、单表查询、连接与子查询、聚合与分组、视图索引存储过程”这一整条链路按关卡要求一条条敲对。适合正在刷实训关卡、准备数据库上机考、或者面试前想快速把 SQL 手感捡回来的人。拿分的关键只有一句话先看清题目要的结果长什么样再决定用哪条语句最后检查库名、表名、字段名有没有对上。下面按考点模块拆开讲每一块都配真题和答题思路能直接照着练。2. 数据定义与约束建库建表、主外键、常用约束的必考套路数据定义是整个实训的地基也是失分最集中的地方。这一块题目通常给你一段文字描述要求你建库、建表、加约束判分看的是表结构是否和预期一致。很多人觉得CREATE TABLE谁不会结果一到主键、外键、自增、默认值组合就翻车。先把高频考点列清楚再逐题演练。2.1 建库建表与三类约束的写法对照建库用CREATE DATABASE建表用CREATE TABLE这两条本身不难难的是约束怎么挂。实训里反复出现的是主键、外键、唯一、非空、默认值这几种写法上有单列和联合之分。下面这张对照表把常考约束的写法和易错点摆在一起背下来能省很多试错时间。约束类型典型写法常考场景易错点单列主键userId INT PRIMARY KEY用户表唯一标识主键列不能重复定义联合主键PRIMARY KEY(name, phone)姓名电话唯一写成两行 PRIMARY KEY 会报错外键CONSTRAINT fk_stu_class1 FOREIGN KEY(classId) REFERENCES t_class(id)学生表关联班级表被引用列必须是主键或唯一唯一username VARCHAR(32) NOT NULL UNIQUE用户名不可重复唯一列允许一个 NULL别和主键混默认值sex VARCHAR(4) DEFAULT 男性别默认值字符默认值要加引号这张表里的写法都来自实训原题比如t_user1用单列主键、t_user2用PRIMARY KEY(name, phone)联合主键、t_student用命名外键fk_stu_class1。注意外键那条被引用的t_class(id)必须先建好顺序反了直接报 1215 错误这是血泪经验。2.2 真题演练主键、外键、自增默认值三连题目一创建t_user1userId为主键其余为姓名、密码、电话、邮箱再创建t_user2以name和phone为联合主键。答题思路第一张表主键直接跟在列定义后面第二张表主键单独一行写联合主键。面试官最想听的是你知不知道“联合主键的列顺序会影响索引使用”但实训只判结构先把语句写对。CREATE DATABASE MyDb; USE MyDb; CREATE TABLE t_user1( userId INT PRIMARY KEY, name VARCHAR(32), password VARCHAR(11), phone VARCHAR(11), email VARCHAR(32) ); CREATE TABLE t_user2( name VARCHAR(32), phone VARCHAR(11), email VARCHAR(32), PRIMARY KEY(name, phone) );t_user1的userId INT PRIMARY KEY是列级主键t_user2把PRIMARY KEY(name, phone)放在所有列之后这是表级联合主键的标准写法。参数上注意VARCHAR长度要和题目给的一致长度不对有些平台会判结构不符。题目二创建t_studentid主键classId外键关联t_class(id)外键命名为fk_stu_class1。答题思路先确保t_class已存在再建t_student外键用CONSTRAINT 名字 FOREIGN KEY(列) REFERENCES 父表(列)。命名外键的好处是后面删除时能直接按名字DROP FOREIGN KEY不用去查系统表。CREATE TABLE t_class( id INT PRIMARY KEY, name VARCHAR(22) ); CREATE TABLE t_student( id INT PRIMARY KEY, name VARCHAR(22), classId INT, CONSTRAINT fk_stu_class1 FOREIGN KEY(classId) REFERENCES t_class(id) );CONSTRAINT fk_stu_class1是给外键起名FOREIGN KEY(classId)指定本表哪列做外键REFERENCES t_class(id)指定父表和父列。父列必须是主键或唯一键否则建不出来。题目三创建t_userid主键自增username非空且唯一sex默认“男”字符集 utf8。答题思路自增用AUTO_INCREMENT非空唯一可以连写NOT NULL UNIQUE默认值用DEFAULT表尾加DEFAULT CHARSETutf8。这类题面试常追问“自增主键删了中间行会不会重用”答案是 InnoDB 下重启后可能重用别答死。CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) NOT NULL UNIQUE, sex VARCHAR(4) DEFAULT 男 ) DEFAULT CHARSETutf8;AUTO_INCREMENT必须配合主键或唯一键使用NOT NULL UNIQUE的顺序无所谓但两个都要写DEFAULT CHARSETutf8放在右括号后面位置错了会语法报错。2.3 表结构变更ALTER 系列的五种高频操作这一块实训单独成章题目要求改表名、改字段名、改类型、加字段、删字段、调位置、删外键。核心就一个ALTER TABLE但子句多容易混。把五种操作记成一句话RENAME 改表名CHANGE 改名改类型MODIFY 只改类型ADD 加列DROP 删列或删约束。真题里出现过ALTER TABLE tb_emp RENAME jd_emp、ALTER TABLE tb_emp CHANGE Id prod_id int(11)、ALTER TABLE tb_emp MODIFY Name varchar(30)、ALTER TABLE tb_emp ADD Country varchar(20) AFTER Name、ALTER TABLE tb_emp DROP Salary、ALTER TABLE tb_emp MODIFY Name varchar(25) FIRST、ALTER TABLE tb_emp DROP FOREIGN KEY emp_dept。注意CHANGE后面要跟旧列名、新列名、新类型三样少一样就报错MODIFY只跟列名和新类型不改名。调位置用FIRST或AFTER 某列这是面试里“怎么把字段挪到最前”的标准答案。提示DROP FOREIGN KEY后面跟的是约束名不是列名很多人写成列名导致删不掉这是实训里最常见的翻车点之一。3. 单表查询条件、范围、模糊、排序分页的得分点单表查询是实训里关卡最多的一块从基本SELECT到IN、BETWEEN AND、LIKE、空值判断、去重、多条件、排序、分组、LIMIT全在里面。判分看结果集所以字段顺序、别名、排序方向都要和题目要求对齐。这一块没有捷径就是把这些子句的组合练到条件反射。3.1 条件查询四件套IN、BETWEEN、LIKE、IS NULLIN用于枚举匹配BETWEEN AND用于闭区间LIKE配合%做模糊匹配IS NULL判断空值。四个里最容易错的是空值—— NULL永远不成立必须用IS NULL。真题里有SELECT Name,Salary FROM tb_emp WHERE Id NOT IN (1)、WHERE Salary BETWEEN 3000 AND 5000、WHERE Name LIKE C%、WHERE DeptId IS NULL还有SELECT DISTINCT Name FROM tb_emp去重。答题时先看题目要几列、要不要别名、要不要排序。比如“查询姓名以 C 开头”就写LIKE C%%放右边是前缀匹配放左边%C是后缀匹配两边都放是全模糊索引会失效面试常问这个区别。3.2 真题演练排序、分组、LIMIT 分页三题连做题目一查询 1 班同学所有信息按成绩降序。SELECT * FROM tb_score WHERE class_id 1 ORDER BY score DESC;WHERE先过滤班级ORDER BY score DESC降序。注意DESC只作用于紧跟的列多列排序要每列都写方向。题目二对班级名称进行分组查询。SELECT * FROM tb_class GROUP BY class_id;GROUP BY按class_id分组。这里要提醒一句SELECT *配合GROUP BY在严格模式下可能报错实训平台通常宽松但面试官会追问“分组后非聚合列取哪条”标准答法是“MySQL 5.7 前随机取8.0 默认严格模式会拒绝”别答成“一定取第一条”。题目三查询班级中第 2 名到第 5 名的学生信息按成绩降序。SELECT * FROM tb_score ORDER BY score DESC LIMIT 1, 4;LIMIT 1, 4的意思是跳过前 1 条、取 4 条也就是第 2 到第 5 名。参数第一个是偏移量从 0 开始第二个是条数。很多人写成LIMIT 2,5就变成第 3 到第 7 名这是分页题最经典的失分点。3.3 聚合与分组COUNT、SUM、AVG、MAX、MIN 加 HAVING聚合函数五兄弟在实训里各占一关考法很固定COUNT(*)数行数、SUM求和、AVG求平均、MAX/MIN求极值。真正拉开差距的是GROUP BY配合HAVING——WHERE过滤行HAVING过滤组顺序不能反。真题里有“查询至少有两门课程在 90 分以上的学生信息”写法是GROUP BY sno HAVING COUNT(pno) 2还有“平均成绩大于 90 且语文在 95 以上”用子查询先筛语文再分组HAVING AVG(score) 90。答题模板可以记成先 WHERE 筛行再 GROUP BY 分组再聚合最后 HAVING 筛组需要排序再加 ORDER BY。这个顺序写错比如把 HAVING 写在 GROUP BY 前面直接语法错误。4. 连接与子查询多表关联和嵌套查询的答题主线到了连接查询和子查询题目开始要跨表取数判分看的是关联条件对不对、别名有没有冲突、结果列顺序是否一致。这一块的高频考点是内连接、左右外连接、复合条件连接、比较运算符子查询、ANY/ALL/IN 关键字子查询。面试里也最爱问“内连接和左连接的区别”所以练的时候顺手把概念记牢。4.1 内连接与外连接谁保留、谁过滤内连接只返回两表都匹配的行左外连接保留左表全部、右表不匹配补 NULL右外连接反过来。实训原题里有个细节值得注意题目要“所有学生姓名和对应班级”答案用了tb_class RIGHT JOIN tb_student因为学生是必须全保留的一方右连接等价于把学生放右边保留。写连接时先想清楚“哪张表的数据一条都不能少”那张表就放在保留侧。SELECT tb_student.name AS studentName, tb_class.name AS className FROM tb_student JOIN tb_class ON tb_class.id tb_student.class_id;这是内连接JOIN默认就是INNER JOINON后面写关联条件。别名studentName、className是为了结果列名和题目要求一致别名对不上有些平台判错。4.2 真题演练复合条件连接与三类子查询题目一查询所有班级里分数 90 分以上的学生姓名、成绩、班级按成绩降序。SELECT s1.name AS studentName, score, s2.name AS className FROM tb_student AS s1, tb_class AS s2 WHERE s1.class_id s2.id AND s1.score 90 ORDER BY score DESC;这是隐式连接写法WHERE里同时放关联条件和过滤条件。面试官会问“隐式连接和 JOIN 有什么区别”答“执行计划通常等价但 JOIN 可读性更好、不容易漏关联条件”。题目二查询大于所有平均年龄的员工姓名与年龄。SELECT name, age FROM tb_emp WHERE age (SELECT AVG(age) FROM tb_emp);比较运算符子查询子查询返回单值才能用。如果子查询可能返回多行必须换成ANY、ALL或IN否则报“子查询返回多于一行”。题目三用 ALL、ANY、IN 分别查询薪资高于 Java 岗位最高、最低、等于的岗位和薪资。SELECT position, salary FROM tb_salary WHERE salary ALL(SELECT MAX(salary) FROM tb_salary WHERE position java); SELECT position, salary FROM tb_salary WHERE salary ANY(SELECT MIN(salary) FROM tb_salary WHERE position java); SELECT position, salary FROM tb_salary WHERE position IN (java); ALL(子查询)表示大于子查询里所有值等价于大于最大值 ANY表示大于任意一个等价于大于最小值IN是等值枚举。这三个关键字是子查询章节的必考组合记住“ALL 取极值、ANY 取另一极、IN 做枚举”就不会混。4.3 复杂查询里的排名与换座位窗口函数缺席时的老写法实训里有一批“不用窗口函数”的经典题分数排名、换座位、体育馆人流量。分数排名用相关子查询数“比自己高的不同分数个数”再加 1换座位用IF(Id%20, Id-1, IF(Id5, Id, Id1))做奇偶交换体育馆人流量用三表自连接判断连续三天人数都过百。这些题面试也常出考的是你能不能在没有窗口函数的条件下用自连接和子查询凑出结果。SELECT Score, (SELECT COUNT(DISTINCT score) FROM score WHERE score s.score) AS Rank FROM score AS s ORDER BY Score DESC;外层每取一行子查询数一遍“大于等于当前分数的不同分数个数”这个数就是排名相同分数排名相同。COUNT(DISTINCT ...)保证并列名次不跳号。参数上注意子查询里的score要和外层别名s.score区分开否则相关条件失效。5. 易错点这五类题看着会做一提交就判错这一章专门收那些“觉得自己写对了、结果平台不给过”的题。每一条按“错在哪、为什么错、怎么答对”拆开考前过一遍能少交很多次重试。第一类空值判断写成 NULL。错在把 NULL 当普通值比较DeptId NULL永远返回空结果。原因是 SQL 里 NULL 表示未知任何和 NULL 的等值比较都不成立。正确写法是WHERE DeptId IS NULL取非空用IS NOT NULL这是单表查询里最高频的失分点。第二类LIMIT偏移量算错。错在把“第 2 到第 5 名”写成LIMIT 2,5。原因是LIMIT第一个参数是从 0 开始的偏移量不是起始名次。正确写法是LIMIT 1,4——跳过 1 条、取 4 条。答这类题先在纸上数一遍“前面有几条不要”再填偏移量。第三类外键删除写成列名。错在ALTER TABLE tb_emp DROP FOREIGN KEY classId报错找不到约束。原因是DROP FOREIGN KEY后面要跟约束名不是列名。正确写法是先确认约束名建表时CONSTRAINT后面那个名字或SHOW CREATE TABLE里查再DROP FOREIGN KEY emp_dept。第四类WHERE和HAVING用反。错在把聚合条件写进WHERE比如WHERE COUNT(*) 2直接语法错误。原因是WHERE在分组前过滤行聚合函数此时还不存在组级条件必须放HAVING。正确顺序是WHERE筛行、GROUP BY分组、HAVING筛组。第五类连接查询漏关联条件导致笛卡尔积。错在多表查询只写过滤条件不写关联条件结果行数爆炸。原因是两张表没有关联就会两两组合。正确做法是WHERE或ON里必须有一句a.class_id b.id把表连起来写完先看结果行数是否合理。注意这五类错误在实训平台上的表现往往是“结果为空”或“行数不对”而不是明确报错所以提交前先自己SELECT看一眼结果集比反复猜有用得多。6. 视图、索引、存储过程与上机答题节奏把最后几分稳住视图、索引、存储过程这三块在实训里各占一章题量不大但概念题和手写题混着来很多人前面查询全对栽在存储过程的分隔符上。这一章把这三块的必考写法和上机节奏一起讲最后给一套我自己每次上机都强制走的检查流程。6.1 视图与索引创建语句和适用场景视图用CREATE VIEW 视图名 AS SELECT ...单表视图和多表视图的区别只在SELECT部分。索引分单列、唯一、组合CREATE INDEX建普通索引CREATE UNIQUE INDEX建唯一索引ALTER TABLE ... ADD INDEX建组合索引。真题里有CREATE VIEW stu_view AS SELECT math, chinese, mathchinese FROM student、CREATE UNIQUE INDEX name_index ON student(name)、ALTER TABLE person ADD INDEX name_city_score (name, age, address)。CREATE VIEW stu_classes AS SELECT student.stu_id, student.name, stu_info.classes FROM student, stu_info WHERE student.stu_id stu_info.stu_id; CREATE UNIQUE INDEX name_index ON student(name); CREATE INDEX score_index ON student(score); ALTER TABLE person ADD INDEX name_city_score (name, age, address);视图那条把两表关联结果固化成一个虚拟表注意视图里不能用ORDER BY除非配合LIMIT。唯一索引要求列值不重复普通索引只加速查询。组合索引(name, age, address)遵循最左前缀面试常问“只查 age 能不能用这个索引”答案是单独 age 用不上这是索引章节的核心考点。6.2 存储过程分隔符、IN/OUT 参数和 IF 分支存储过程是这一块最容易翻车的地方核心有三点改分隔符DELIMITER $$、参数分IN和OUT、分支用IF ... THEN ... ELSEIF ... END IF。真题要求根据信用额度返回客户等级写法如下。DROP PROCEDURE IF EXISTS GetCustomerLevel; DELIMITER $$ CREATE PROCEDURE GetCustomerLevel( IN p_customNumber INT(11), OUT p_customerLevel VARCHAR(10) ) BEGIN DECLARE levels INT; SELECT creditlimit INTO levels FROM customers WHERE customerNumber p_customNumber; IF levels 5000 THEN SET p_customerLevel SILVER; ELSEIF levels 10000 THEN SET p_customerLevel GOLD; ELSE SET p_customerLevel PLATINUM; END IF; END$$ DELIMITER ;DELIMITER $$把语句结束符临时改成$$这样过程体里的分号不会被提前截断结束后再改回;。IN参数传进来OUT参数带出去SELECT ... INTO把查询结果赋给变量。IF分支必须END IF收尾少写就报错。面试追问“存储过程和函数的区别”答“函数必须返回值、能在 SQL 里调用存储过程用 CALL 调用、可以有多个 OUT 参数”。6.3 上机答题节奏我每次必走的四步检查上机时间有限但返工更费时间。我自己的习惯是每道题提交前强制走四步第一步看库名USE的库和题目要求是否一致库错了后面全错第二步看表名字段名拼写实训平台对大小写和拼写很敏感第三步单独跑一遍SELECT看结果集列数、列名、行数对不对第四步检查分号、引号、括号是否配对尤其是存储过程的分隔符有没有改回来。这套流程听起来笨但能挡掉八成“明明会做却判错”的情况。从那以后我每次上机都强制走一遍这四步宁可多花两分钟检查也不愿反复重试耗掉半小时。这份实训答案按关卡整理、带目录建库建表、约束、查询、连接、子查询、聚合、视图索引存储过程都覆盖到了照着关卡顺序练一遍把每道题的语句亲手敲进去跑通比只看答案有用得多。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑