news 2026/10/31 11:46:01

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_user1,userId为主键,其余为姓名、密码、电话、邮箱;再创建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_student,id主键,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_user,id主键自增,username非空且唯一,sex默认“男”,字符集 utf8。

答题思路:自增用AUTO_INCREMENT,非空唯一可以连写NOT NULL UNIQUE,默认值用DEFAULT,表尾加DEFAULT CHARSET=utf8。这类题面试常追问“自增主键删了中间行会不会重用”,答案是 InnoDB 下重启后可能重用,别答死。

CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) NOT NULL UNIQUE, sex VARCHAR(4) DEFAULT '男' ) DEFAULT CHARSET=utf8;

AUTO_INCREMENT必须配合主键或唯一键使用;NOT NULL UNIQUE的顺序无所谓,但两个都要写;DEFAULT CHARSET=utf8放在右括号后面,位置错了会语法报错。

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 NULL

IN用于枚举匹配,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 JOIN,ON后面写关联条件。别名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%2=0, Id-1, IF(Id=5, Id, Id+1))做奇偶交换;体育馆人流量用三表自连接判断连续三天人数都过百。这些题面试也常出,考的是你能不能在没有窗口函数的条件下用自连接和子查询凑出结果。

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, math+chinese 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看结果集列数、列名、行数对不对;第四步检查分号、引号、括号是否配对,尤其是存储过程的分隔符有没有改回来。这套流程听起来笨,但能挡掉八成“明明会做却判错”的情况。

从那以后我每次上机都强制走一遍这四步,宁可多花两分钟检查,也不愿反复重试耗掉半小时。这份实训答案按关卡整理、带目录,建库建表、约束、查询、连接、子查询、聚合、视图索引存储过程都覆盖到了,照着关卡顺序练一遍,把每道题的语句亲手敲进去跑通,比只看答案有用得多。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 11:46:00

针灸AI化:知识图谱与大模型融合实践

1. 针灸医学AI化的时代机遇与挑战 针灸作为传统医学的瑰宝&#xff0c;其临床价值已得到全球认可。但在数字化浪潮中&#xff0c;这门依赖经验传承的技艺正面临两大核心矛盾&#xff1a;一方面&#xff0c;老中医的"望闻问切"经验难以量化传承&#xff1b;另一方面&a…

作者头像 李华
网站建设 2026/10/31 11:46:00

MySQL 5.7到8.0升级指南与性能优化实践

1. 升级背景与必要性分析 MySQL 5.7作为长期支持版本&#xff08;LTS&#xff09;已于2023年10月结束官方支持周期&#xff0c;这意味着后续将不再获得安全补丁和错误修复。根据Oracle官方发布的生命周期规划&#xff0c;5.7版本已进入"Extended Support"阶段&#x…

作者头像 李华
网站建设 2026/10/31 11:44:28

OpenClaw自动化工具跨平台安装指南

1. 小龙虾安装手册概述 OpenClaw&#xff08;小龙虾&#xff09;是一款功能强大的开源自动化工具平台&#xff0c;能够帮助开发者快速构建和部署各类自动化工作流。这份安装手册将详细介绍在不同操作系统环境下安装OpenClaw的完整流程&#xff0c;包括Windows PowerShell和Linu…

作者头像 李华
网站建设 2026/10/31 11:43:07

DE-Transformer在多变量时序预测中的原理与应用

1. 项目概述&#xff1a;DE-Transformer在多变量时序预测中的应用 这个项目本质上是在解决一个经典但极具挑战性的问题&#xff1a;如何利用多个相关变量的历史数据&#xff0c;准确预测单一目标变量的未来值。想象一下气象预报的场景——我们需要综合气压、温度、湿度等多个指…

作者头像 李华
网站建设 2026/10/31 11:42:48

MySQL 5.7+ Windows启动失败:初始化缺失导致服务秒退的根因与修复

简介&#xff1a;本资源是一份针对Windows环境下MySQL服务启动后自动停止问题的完整排错与重装指南&#xff0c;面向数据库初学者、运维新手及开发人员&#xff0c;解决MySQL 5.7及以上版本因服务注册异常、data目录缺失或配置错误导致的启动失败顽疾。文档以实操为主线&#x…

作者头像 李华
网站建设 2026/10/31 11:41:46

IP网络广播系统服务器选型、带宽测算与部署排障指南

干这行十来年&#xff0c;我经手的公共广播项目从最早一栋楼里塞满定压功放的年代&#xff0c;一路走到现在动辄上千个终端的 IP网络广播系统服务器 架构。每次跟甲方或者施工队聊需求&#xff0c;只要提到"IP网络广播服务器"这几个字&#xff0c;经常会出现两种极…

作者头像 李华