MySQL 学习进度笔记
版本日期:2026-10-12
用途:在新聊天中上传或粘贴本文件后,请根据本笔记继续 MySQL 学习,不要从头开始。
============================================================
一、学习方式与批改要求
============================================================
-
使用中文讲解 MySQL,尽量结合具体业务表和数据例子。
-
采用循序渐进、一次一道题的练习方式。
-
出题后先等待我作答,不要提前公布答案。
-
我提交答案后,请:
-
按 10 分制评分;
-
明确指出正确答案;
-
分析我的思路哪里正确、哪里有问题;
-
解释所有选项,不要只解释正确选项;
-
给出可以记住的判断方法;
-
更新累计成绩;
-
总结当前薄弱点,并据此安排下一题。
-
如果一道题分成多个步骤,应按步骤逐个进行;我回答当前步骤后再批改,不要跳到后续步骤。
-
我有时能够正确复述定义,但在应用到题目时容易混淆概念。因此批改时请特别检查"定义是否真正应用到题目条件"。
-
新聊天中如发现累计分数存在算术错误,请以本笔记中的明细重新计算,并说明更正,不要沿用错误总分。
============================================================
二、总体学习进度
============================================================
已知学习过或练习过的主题:
-
JOIN(第六课练习曾进行逐题批改)
-
子查询(曾继续子查询练习)
-
事务(第十课事务练习)
-
数据库设计与规范化(第十二课)
-
函数依赖、属性闭包、候选键、部分函数依赖、传递函数依赖、第三范式(3NF)
注意:
目前可确认的详细知识点和题目成绩主要集中在第十二课。更早课程的每一课具体题目、完整分数及全部知识点没有完整保存在本笔记上下文中;不要凭空编造历史成绩或题目内容。若需要补充早期课程细节,请以我之后提供的旧笔记为准。
============================================================
三、第十二课:数据库设计与规范化
============================================================
已完成题目:
-
第12课题1---15:143/150 分。
-
题16是分步骤题:
-
16.1 确定候选键:10/10。
-
16.2 判断部分函数依赖:6/10。
-
16.3 判断传递函数依赖:4/10。
-
函数依赖方向专项练习第1题:10/10。
根据上述明细,当前可核算的累计成绩为:
143 + 10 + 6 + 4 + 10 = 173 分;
总分为 150 + 10 + 10 + 10 + 10 = 190 分;
即 173/190,约 91.1%。
重要:此前一次批改曾把该成绩写成 173/180,这是分母计算错误。正确分母应为 190。后续请从 173/190 继续累计,并保留上面的分项记录。
当前进度:
-
第12课题1---15已完成。
-
题16的三个步骤已完成。
-
函数依赖方向专项练习第1题已完成。
-
下一步建议继续练习复合候选键、部分函数依赖与传递函数依赖的区分;继续一次一道题,答后再批改。
============================================================
四、已掌握的核心概念
============================================================
- 函数依赖(Functional Dependency)
若属性或属性组 X 的值能够唯一确定属性 Y 的值,记为 X → Y。
依赖方向很重要:X → Y 不代表 Y → X。不能仅因为 X 能确定 Y,就反推 Y 能确定 X。
- 属性闭包(Attribute Closure)
X+ 表示在给定函数依赖集合下,能够由 X 推导出的全部属性。
判断 X 是否为超键,可以计算 X+:
-
若 X+ 覆盖关系中的全部属性,则 X 是超键。
-
若 X 还是最小的,即删除 X 中任何属性后都不能继续决定全部属性,则 X 是候选键。
- 超键与候选键
-
超键:能够唯一确定表中的一条记录的属性集。
-
候选键:满足唯一标识能力,并且具有最小性(不能再删除其中属性)。
-
主键通常从候选键中选出。
-
单字段候选键的最小性通常较容易判断,但仍要确认它能否决定表中的所有属性。
- 主属性与非主属性
-
主属性:至少属于一个候选键的属性。
-
非主属性:不属于任何候选键的属性。
判断 2NF、3NF 时,需要区分主属性和非主属性。
- 部分函数依赖
部分函数依赖与复合候选键有关:非主属性只依赖于复合候选键的真子集,而不是依赖整个候选键。
关键判断:
-
必须先确认候选键。
-
若候选键只有一个字段,就没有可拆分的真子集,因此不存在部分函数依赖。
-
存在普通函数依赖,不等于存在部分函数依赖。
-
复合候选键只是意味着"需要检查是否存在部分依赖",不代表一定存在部分依赖。
- 传递函数依赖
常见判断模式:
候选键 X → 非候选键属性 A → 非主属性 B。
如果候选键通过一个非候选键属性间接决定非主属性,就需要检查传递函数依赖。
单字段候选键也可能存在传递函数依赖;"没有部分依赖"不等于"没有传递依赖"。
- 第二范式(2NF)与第三范式(3NF)
-
2NF重点检查非主属性是否部分依赖于候选键。
-
3NF需要进一步检查传递依赖等情况。
-
不能因为一张表的候选键只有一个字段,就认定它自动满足3NF。
-
当公会名称依赖于公会编号,而玩家记录通过公会编号关联公会名称时,可能产生传递函数依赖。
============================================================
五、已练习题目与错题记录
============================================================
【第12课题15:候选键与2NF/3NF】
题目业务规则:
每个玩家最多加入一个公会;
userId → userName, guildId;
guildId → guildName;
joinTime 表示加入当前公会的时间。
用户答案:B。
成绩:4/10。正确答案:C。
关键教训:
-
候选键是 userId。
-
userId 是单字段候选键,因此不存在部分函数依赖。
-
但 userId → guildId → guildName 形成传递函数依赖。
-
单字段候选键并不自动保证3NF。
-
需要区分2NF的部分依赖问题与3NF的传递依赖问题。
【第12课题16:装备表分步骤题】
表结构:
PlayerEquip(userId, equipId, equipTypeId, equipName, strengthLevel)
业务规则:
-
每件装备实例有唯一 equipId。
-
每件装备属于一个玩家。
-
equipId → userId, equipTypeId, strengthLevel。
-
equipTypeId → equipName。
-
没有给出其他函数依赖。
步骤16.1:确定候选键
用户答案:C(equipId)。
成绩:10/10。
结论:equipId 是候选键,因为它能够唯一确定该装备实例的其他属性。
步骤16.2:判断部分函数依赖
用户答案:A(存在,因为 equipTypeId 可以确定 equipName)。
成绩:6/10。该选项错误。
正确理解:
-
equipId 是单字段候选键,没有可拆分的真子集,所以不存在部分函数依赖。
-
equipTypeId → equipName 是普通函数依赖,不是部分函数依赖。
-
先确认候选键,再判断部分依赖,不能把任意普通函数依赖都叫作部分依赖。
步骤16.3:判断传递函数依赖
用户答案:C。
成绩:4/10。正确答案:B。
正确依赖链:
equipId → equipTypeId → equipName。
错误选项C假设 userId → equipId,但题目只给出了 equipId → userId,不能反转方向。
结论:equipName 通过 equipTypeId 传递依赖于候选键 equipId。
重要提醒:函数依赖方向不可随意反推。
【函数依赖方向专项练习第1题】
表:
PlayerGuild(userId, userName, guildId, guildName)
已知:
userId → userName, guildId;
guildId → guildName。
用户答案:B,得分10/10。
用户的分析包括:
-
userId 是候选键,因为 userId 的属性闭包覆盖表中全部属性,且它是单字段键。
-
依赖链为 userId → guildId → guildName。
-
guildName → guildId 和 guildId → userId 均不能从已知依赖中反推。
-
guildName 通过 guildId 传递依赖于 userId,违反3NF。
-
可将公会信息拆分到独立的公会表中。
补充严谨表述:
从传递性可推导出 userId → guildName,所以不要说数学意义上"userId 无法决定 guildName"。更准确的说法是:guildName 通过非候选键属性 guildId 传递依赖于 userId。
============================================================
六、当前薄弱点与答题检查清单
============================================================
薄弱点:
-
有时能够说出定义,但在题目应用时混淆普通函数依赖与部分函数依赖。
-
容易把"单字段候选键不存在部分依赖"误认为"没有传递依赖"。
-
必须特别检查函数依赖箭头方向,不能反推。
-
需要熟练区分2NF与3NF的检查重点。
每道依赖判断题,建议按以下顺序分析:
第一步:列出题目明确给出的所有函数依赖,不添加题目没有给出的依赖。
第二步:求候选键或属性闭包,确认候选键。
第三步:标记主属性与非主属性。
第四步:判断候选键是单字段还是复合字段。
第五步:若是复合候选键,检查是否有非主属性依赖于候选键的真子集(部分依赖)。
第六步:检查是否存在"候选键 → 非候选键属性 → 非主属性"的传递链。
第七步:根据题目问的是候选键、部分依赖、传递依赖、2NF还是3NF,选择对应结论。
答题时可使用模板:
-
候选键是:____,因为其属性闭包为 ____。
-
已知依赖链是:____ → ____ → ____。
-
依赖方向不能反转,因此不能推出 ____ → ____。
-
该依赖属于:普通函数依赖 / 部分函数依赖 / 传递函数依赖。
-
对范式的影响是:____,理由是 ____。
============================================================
七、下一步学习安排
============================================================
下一次聊天请从以下内容继续:
"第12课函数依赖方向与部分/传递函数依赖专项练习第2题"。
要求:
-
先出一道题,不公布答案。
-
题目最好使用复合候选键,让我练习判断部分函数依赖;同时可以设置另一条依赖链用于区分传递依赖。
-
等我作答后再按10分制批改。
-
解释所有选项。
-
更新累计成绩:当前基准为173/190,约91.1%。
-
持续记录错题、正确思路和薄弱点。
-
不要因为我能复述定义就默认我已掌握;要看我是否能正确应用到具体依赖关系。
============================================================
八、给新聊天的启动指令
============================================================
请先读取并理解这份《MySQL 学习进度笔记》,把它作为本次学习的进度依据。不要从头讲课,也不要重复已经完成的题目。请从"第12课函数依赖方向与部分/传递函数依赖专项练习第2题"开始,一次只出一道题,等我回答后再批改,按10分制评分、解释全部选项、更新累计成绩和薄弱点。
当前累计成绩:173/190(约91.1%)。