# 《数据库原理与应用》工单式教学教材

编写说明:本教材依据泰州职业技术学院工单式教学指导书(第1版)编制,以"为学校图书馆设计并实现一套图书借阅管理系统"为贯穿全课程的总任务,将数据库系统概念、数据模型、数据库设计、MySQL安装与使用、表定义、数据操作、索引、视图、存储过程等知识点分解为24个循序渐进的子任务。针对学生基础较弱的实际情况,每个任务提供详细的操作步骤、SQL语句模板和常见错误提示,确保学生"跳一跳够得着"。

使用对象:高职计算机应用技术、软件技术、大数据技术、电子商务等专业一年级学生 对接岗位:数据库管理员助理、软件开发助理、数据录入与维护员 理论基础:完整行动七步法 × GPCT四层穿透 × COMET八标准


# 课程总体架构

# 一、课程定位

维度 内容
课程名称 数据库原理与应用
适用专业 计算机应用技术、软件技术、大数据技术、电子商务
课程性质 专业核心课
总课时 96课时(24个工单任务,每任务4课时)
对接岗位 数据库管理员助理、软件开发助理、数据录入与维护员
总任务 为学校图书馆设计并实现一套图书借阅管理系统

# 二、课程目标(GPCT四层穿透)

┌─────────────────────────────────────────────────────┐
│  G层:通用素养                                       │
│  • 逻辑思维与问题分析能力                            │
│  • 团队协作与沟通表达能力                            │
│  • 自主学习能力与信息检索能力                        │
│  • 规范意识与文档撰写能力                            │
├─────────────────────────────────────────────────────┤
│  P层:专业群能力(计算机专业群)                      │
│  • 数据库设计与实现能力                              │
│  • SQL语言编程能力                                   │
│  • 数据库管理与维护能力                              │
│  • 软件项目文档撰写能力                              │
├─────────────────────────────────────────────────────┤
│  C层:课程能力(本课程特有)                          │
│  C1:能理解数据库基本概念和数据模型                   │
│  C2:能进行小型数据库的需求分析和概念设计             │
│  C3:能使用MySQL创建数据库、数据表和完整性约束       │
│  C4:能使用SQL进行数据的增删改查操作                 │
│  C5:能使用索引、视图、存储过程优化和管理数据库      │
│  C6:能完成一个小型数据库应用系统的设计与实现         │
├─────────────────────────────────────────────────────┤
│  T层:任务能力(各工单具体能力)                      │
│  详见各工单任务定位栏                                 │
└─────────────────────────────────────────────────────┘

# 三、总任务与模块架构

总任务:为学校图书馆设计并实现一套"图书借阅管理系统"数据库

任务背景:学校图书馆目前使用Excel表格管理图书和借阅记录,随着藏书量增加,出现了数据重复、查询困难、借阅统计耗时等问题。图书馆委托你所在的小组设计一套数据库系统,实现图书信息、读者信息、借阅记录的高效管理。

模块 任务编号 任务名称 课时 对应知识点 难度
模块一
走进数据库世界
任务1-1 从手工记账到电子管理——认识数据库 4 数据库系统概念
任务1-2 信息怎么组织——认识数据模型 4 信息和数据模型
模块二
设计数据库
任务2-1 图书馆需要什么——需求调研与分析 4 需求分析 ⭐⭐
任务2-2 画一张蓝图——E-R图设计 4 E-R模型 ⭐⭐
任务2-3 从图纸到数据表——关系模型转换与规范化 4 数据库设计方法 ⭐⭐⭐
模块三
MySQL基础操作
任务3-1 搭建工作台——MySQL安装与连接 4 MySQL安装与使用 ⭐⭐
任务3-2 创建数据库——认识存储引擎 4 存储引擎与数据库操作 ⭐⭐
任务3-3 创建数据表——字段类型与表结构 4 表定义 ⭐⭐
任务3-4 给表定规矩——完整性约束 4 完整性约束控制 ⭐⭐⭐
模块四
数据管理
任务4-1 往表里加数据——INSERT语句 4 数据操作管理 ⭐⭐
任务4-2 查数据——简单SELECT查询 4 数据操作管理 ⭐⭐
任务4-3 条件查询与排序——WHERE和ORDER BY 4 数据操作管理 ⭐⭐⭐
任务4-4 多表联查——JOIN连接查询 4 数据操作管理 ⭐⭐⭐
模块五
进阶功能
任务5-1 给数据建目录——索引的创建与使用 4 MySQL索引 ⭐⭐⭐
任务5-2 透过窗户看数据——视图的创建与应用 4 MySQL视图 ⭐⭐⭐
任务5-3 自动化处理——存储过程基础 4 MySQL存储过程 ⭐⭐⭐⭐
任务5-4 带判断的业务逻辑——存储过程进阶 4 MySQL存储过程进阶 ⭐⭐⭐⭐
模块六
综合项目实战
任务6-1 项目启动——系统需求分析与分工 4 综合设计 ⭐⭐⭐
任务6-2 画设计图——E-R图与关系模型设计 4 综合设计 ⭐⭐⭐
任务6-3 建库建表——数据库与表结构实现 4 综合实施 ⭐⭐⭐
任务6-4 数据初始化——导入数据与基础查询 4 综合实施 ⭐⭐⭐
任务6-5 功能实现——视图与存储过程开发 4 综合实施 ⭐⭐⭐⭐
任务6-6 系统测试——功能测试与性能优化 4 综合实施 ⭐⭐⭐⭐
任务6-7 项目汇报——成果展示与答辩评价 4 综合评价 ⭐⭐⭐

# 四、课程实施建议

1. 分组策略

分组要素 具体要求
小组规模 4人/组
分组原则 异质分组:基础好的带基础弱的,男生女生搭配,性格互补
组长产生 第一周组内推选或教师指定,优先选有组织能力、热心助人的学生
角色设置 组长、操作员、记录员、复核员(4个角色)
轮换规则 每2个任务轮换一次角色,确保每人至少担任组长1次、操作员1次
小组公约 各组在第一次课共同制定3条公约并签名,张贴于工位

角色分工与能力培养

角色 主要职责 能力培养重点
组长 统筹任务进度、协调组内分工、组织展示汇报、帮助组员答疑 项目管理与沟通协调能力
操作员 在电脑前主操作(敲键盘)、执行SQL语句、截图记录结果 动手操作与规范执行能力
记录员 填写工单、记录SQL语句、整理操作截图、撰写报告初稿 数据记录与文档撰写能力
复核员 核对SQL语法、检查结果正确性、发现错误及时提醒 质量复核与批判性思维能力

基础薄弱学生的特别支持

  • 操作员由基础较好的学生担任前4个任务,基础弱的学生先担任记录员/复核员,通过"看中学"积累经验
  • 从任务3-1开始,基础弱的学生逐步担任操作员,教师提供更多一对一指导
  • 每组发放"SQL语句速查卡"(塑封卡片),供随时查阅

2. 评分体系

评价维度 权重 评价主体 评价内容
工单完成度 20% 教师 各区域(任务呈现→理论注解)完成质量
操作规范性 20% 教师+复核员 SQL语句规范、操作步骤正确、关键控制点到位
成果质量 20% 教师 SQL运行结果正确、数据准确、截图清晰
同伴互评 20% 组内成员 个人贡献度、协作态度、角色履行情况
自评反思 10% 本人 COMET K1-K8自评真实性、改进计划可行性
组间互评 10% 其他小组 展示效果、答辩表现、成果可信度

个人最终得分计算公式

$$ 个人得分 = 工单完成度得分 + 操作规范性得分 + 成果质量得分 + (同伴互评平均分 \times 协作系数) + 自评反思得分 + 组间互评得分 $$

其中协作系数 = 0.5 + 0.5 × (个人互评平均分 / 5),旨在防止"搭便车"现象,激励全员参与。

3. 前置课程要求

  • 已完成《计算机应用基础》或具备基本计算机操作能力
  • 了解Excel表格的基本操作(会输入数据、筛选、排序)
  • 对编程无前置要求,零基础可学

4. 软件与环境配置

  • MySQL Community Server 8.0+(或MySQL 5.7)
  • MySQL Workbench 8.0+(图形化管理工具)或Navicat for MySQL
  • 操作系统:Windows 10/11
  • 机房要求:每人一台可联网电脑,能安装MySQL


# 模块一 走进数据库世界

模块导语:你可能用过Excel表格记录过班级成绩、社团成员信息或者自己的收支账目。当数据量越来越大时,Excel会出现查找慢、容易重复、多人同时修改会冲突等问题。本模块将带你认识一种更强大的数据管理工具——数据库。你不需要任何编程基础,只需要带着"如何更好地管理信息"这个问题,就能开始数据库之旅。


# 【任务1-1】从手工记账到电子管理——认识数据库 【C→T】


# ■ 任务呈现区

情境:学校图书馆的张老师每天要用Excel记录新到的图书、借阅情况、还书情况。最近她遇到了烦心事:

  • 一本书被多个人同时借走,Excel里登记重复了
  • 想查"所有借过《红楼梦》的学生",要翻十几个表格
  • 她和李老师同时在Excel里改数据,保存时互相覆盖了
  • 有的书信息改了(比如出版社),所有相关表格都要改一遍

你的小组是图书馆请来的"数据管理顾问"。今天的任务是帮张老师分析Excel的问题,了解数据库是如何解决这些问题的。

学习目标

  1. 能说出数据库与Excel表格的3个以上区别
  2. 能解释"数据库""数据库管理系统""数据库系统"三者的关系
  3. 能列举生活中3个以上使用数据库的场景
  4. 能完成一份"Excel vs 数据库"对比分析表

核心输出物

  • [ ] "Excel管理图书的问题清单"(至少列出5个问题)
  • [ ] "数据库vs Excel"对比分析表
  • [ ] 小组讨论记录(每人发言要点)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:① 知识激活型(概念理解与对比分析)

行动维度:资讯→计划→决策→展示→评价(轻量六步)

需求维度:目标水平=L1→L2 | 核心K标准:K1/K2

向上穿透:T层"认识数据库基本概念"→C层"数据库基础认知能力"→P层"数据管理基础能力"→G层"逻辑思维与信息素养"


# ■ 分组与角色分配

分组原则:4人/组,异质分组(操作能力、理论基础、性格特点均衡搭配)。每组设组长1名,由组内推选或教师指定,负责进度统筹和组间协调。

角色分工(本任务建议角色分配,每2个任务轮换一次):

角色 主要职责 本任务重点能力培养
组长 统筹任务进度、协调组内分工、组织展示汇报 项目管理与沟通协调能力
操作员 在电脑上操作Excel演示、搜索资料 动手操作能力
记录员 填写对比分析表、记录小组讨论要点 数据记录与文档撰写能力
复核员 核对对比项是否完整、检查逻辑是否正确 质量复核与批判性思维能力

轮换规则:模块一(任务1-1至1-2)内每任务轮换一次。

小组公约(各组在第一次课共同制定并签名):





# ■ 知识准备区

1. 什么是数据库?

数据库(Database,简称DB)是按照数据结构来组织、存储和管理数据的仓库。你可以把它想象成一个"超级Excel",但它比Excel强大得多。

对比项 Excel表格 数据库
存储容量 约100万行就卡顿 可以轻松存储上亿条记录
多人使用 同时打开会冲突覆盖 支持多人同时读写,不冲突
数据重复 容易在不同表格中重复录入 数据只存一处,其他地方"引用"
查询速度 数据多了查找很慢 有专门的"索引"机制,查找极快
安全性 谁打开都能改 可以设置权限,不同的人看不同的数据
复杂查询 筛选、排序功能有限 可以用SQL语言进行各种复杂查询

2. 数据库系统的组成

┌─────────────────────────────────┐
│         数据库系统 (DBS)         │
│  ┌─────────────────────────┐   │
│  │   数据库管理系统 (DBMS)  │   │  ← 软件,如MySQL、Oracle
│  │   · 数据定义功能         │   │
│  │   · 数据操纵功能         │   │
│  │   · 数据控制功能         │   │
│  └─────────────────────────┘   │
│           ↓                      │
│  ┌─────────────────────────┐   │
│  │      数据库 (DB)         │   │  ← 实际存储的数据
│  └─────────────────────────┘   │
│           ↓                      │
│  ┌─────────────────────────┐   │
│  │    数据库管理员 (DBA)     │   │  ← 管理和维护的人
│  └─────────────────────────┘   │
└─────────────────────────────────┘

3. 生活中遇到的数据库

场景 数据库作用
学校教务系统 存储学生信息、课程表、成绩
图书馆借阅系统 存储图书信息、读者信息、借阅记录
手机通讯录 存储联系人姓名、电话、地址
淘宝/京东购物 存储商品信息、订单信息、用户信息
微信/QQ 存储好友关系、聊天记录、朋友圈
银行ATM机 存储账户余额、交易记录

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
发现Excel问题 打开Excel示例文件,体验查找慢、重复录入、多人修改冲突 60分钟
学习数据库概念 阅读知识准备区,理解DB、DBMS、DBS的关系 45分钟
完成对比分析 小组讨论,填写"数据库vs Excel"对比表 45分钟
展示与互评 各组展示对比表,互相补充 30分钟

行动方案

  1. 教师发放"图书馆Excel模拟数据"(含重复数据、多表格关联)
  2. 各组操作员打开Excel,体验查找一条记录需要多长时间
  3. 记录员记录发现的Excel问题(至少5个)
  4. 阅读知识准备区,理解数据库基本概念
  5. 小组讨论,完成对比分析表
  6. 各组展示,教师点评

# ■ 决策区

关键决策点:图书馆应该先解决哪个问题?

张老师面临5个问题:数据重复、查询慢、多人冲突、修改麻烦、数据易丢失。如果只能先解决一个,你们组建议先解决哪个?

方案 优先解决的问题 理由 风险
A 数据重复 重复导致数据不一致,是基础问题 需要重新整理所有数据,工作量大
B 查询慢 直接影响日常工作效率 如果不解决重复,查询结果可能不准确
C 多人冲突 导致数据丢失,后果严重 可以通过约定时间错开修改来临时解决

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] "Excel管理图书的问题清单"(至少5条,附具体例子)
  • [ ] "数据库vs Excel"对比分析表(至少6个维度)
  • [ ] 小组讨论中最有价值的1个发现

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:体验Excel的问题 【执行】

  1. 操作员打开教师发放的"图书馆Excel模拟数据.xlsx"。
  2. 尝试完成以下操作,记录员计时并记录体验:
    • 任务A:找到书名是"数据库原理"的图书,记录用了多少秒?______秒
    • 任务B:统计"计算机类"图书有多少本,记录用了多少秒?______秒
    • 任务C:查看"张三"同学借了几本书,需要在几个表格间切换?______个
  3. 记录员在下方记录发现的Excel问题:
序号 发现的问题 具体表现 严重程度
1 ⭐⭐⭐
2
3
4
5

Step 2:理解数据库概念 【执行】

  1. 各组员轮流朗读"知识准备区"的内容(每人一段)。
  2. 遇到不懂的词,先小组讨论,讨论不出再请教教师。
  3. 复核员检查:组内4人是否都能用自己的话解释"数据库"是什么?
    • □ 组长能解释
    • □ 操作员能解释
    • □ 记录员能解释
    • □ 复核员能解释

Step 3:完成对比分析表 【执行】

小组讨论,从以下维度对比Excel和数据库,记录员填写:

对比维度 Excel表格 数据库 winner(谁更好)
存储数据量
多人同时使用
查找速度
数据重复问题
数据安全性
复杂统计功能
学习难度

# ■ 成果提交区

交付物清单

  1. [ ] "Excel管理图书的问题清单"(至少5条,有具体例子)
  2. [ ] "数据库vs Excel"对比分析表(至少6个维度)
  3. [ ] 小组讨论记录(每人发言1-2个要点)

格式要求:手写或电子填写均可,建议打印工单后手写——体验一次"填写工单"的过程。


# ■ 评价反思区

【K1-K8产出评价】 使用COMET八标准中的相关维度对本任务产出进行评价。

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K1 直观性 我的对比表清晰易懂,他人一看就懂 混乱难懂 基本可读 清晰规范 可作模板
K2 功能性 我能准确说出数据库与Excel的核心区别 说错或说不出 能说出2-3条 能说出4-5条 能举例说明
K6 社会责任 我能积极参与小组讨论,不挂机 不参与 偶尔发言 积极发言 能引导讨论

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分:是否全程参与、不缺席不怠工
角色履行度 30% 1-5分:是否胜任角色职责、不推诿
协作配合度 20% 1-5分:是否主动配合他人、共享资源
成果贡献度 20% 1-5分:对最终成果的实际贡献大小
加权总分(满分5分) 计算:∑(单项评分×权重)

协作系数计算:协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

我的协作系数 = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量、字迹工整、逻辑清晰
操作规范性 20 认真体验Excel操作、记录真实
成果质量 20 对比表维度完整、分析到位
展示答辩 20 展示清晰、回答准确
创新与改进 20 有自己的思考、能提出新问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
操作规范性 20% 教师+复核员评
成果质量 20% 教师评
同伴互评 20% 协作系数加权
自评反思 10% 本人自评
组间互评 10% 他组评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 本任务中我对数据库的概念最不清楚的是:________________________
  2. 下一个任务中我要重点学习的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 数据库发展简史】

数据库技术经历了三个主要发展阶段:

  • 1960年代:层次数据库和网状数据库(IBM的IMS系统)
  • 1970年代:关系数据库诞生(IBM的E.F.Codd提出关系模型,后来发展出Oracle、DB2、SQL Server等)
  • 2000年代至今:NoSQL数据库(应对大数据、高并发场景,如MongoDB、Redis)

MySQL是最流行的开源关系数据库之一,被广泛用于网站后台(如淘宝、 Facebook早期都使用MySQL)。关系数据库的核心思想是:把所有数据组织成"表格"的形式,表与表之间通过共同字段建立关系。



# 【任务1-2】信息怎么组织——认识数据模型 【C→T】


# ■ 任务呈现区

情境:上一节课,张老师知道了数据库能解决Excel的很多问题。但她又问了新问题:"数据库里的数据是怎么放的?是不是也像Excel一样排成一张大表?"今天你需要帮助张老师理解:数据库不是简单地把所有数据堆在一张大表里,而是按照一定的"模型"来组织数据。就像图书馆的书不是随便堆在地上,而是按类别、编号、书架位置来摆放一样。

学习目标

  1. 能用自己的话解释什么是"数据模型"
  2. 能区分概念模型(E-R图)、逻辑模型(关系模型)和物理模型
  3. 能说出关系数据库中"表""行""列""主键"的含义
  4. 能将一个简单的现实场景(如班级通讯录)抽象成关系表结构

核心输出物

  • [ ] "班级通讯录"关系表设计图(含字段名、数据类型、主键标注)
  • [ ] 三种数据模型的对比说明
  • [ ] 小组讨论记录

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:① 知识激活型 + ② 技能操作型(画表设计图)

行动维度:资讯→计划→决策→执行→检查→评价

需求维度:目标水平=L1→L2 | 核心K标准:K1/K2/K3

向上穿透:T层"认识数据模型"→C层"数据库概念设计能力"→P层"数据建模基础能力"→G层"抽象思维与结构化思考素养"


# ■ 分组与角色分配

角色分工(本任务建议角色分配,每2个任务轮换一次):

角色 主要职责 本任务重点能力培养
组长 统筹任务进度、组织小组讨论、协调分工 项目管理与沟通协调能力
操作员 在白板/纸上画表结构、使用绘图工具 动手操作与可视化表达能力
记录员 填写工单、记录讨论要点、整理最终设计图 数据记录与文档撰写能力
复核员 检查表结构设计是否合理、字段是否遗漏 质量复核与批判性思维能力

轮换规则:本任务为模块一最后一次,下一模块(模块二任务2-1)轮换角色。


# ■ 知识准备区

1. 什么是数据模型?

数据模型是对现实世界中数据和数据之间联系的抽象描述。简单说,就是"规定数据怎么放、怎么找、怎么关联"的一套规则。

就像图书馆的管理规则:

  • 每本书贴一个编号(规则1)
  • 书按类别放到不同书架(规则2)
  • 借书要登记读者证号和书号(规则3)

数据库的数据模型也类似,它规定了数据的组织结构。

2. 三种数据模型

模型层次 名称 做什么用 像什么
第一层 概念模型 描述"现实世界中有什么" 建筑草图(不纠结用什么材料)
第二层 逻辑模型 描述"数据在数据库里怎么组织" 建筑图纸(确定房间布局)
第三层 物理模型 描述"数据在硬盘上怎么存" 施工方案(水泥、钢筋、管道)

3. 关系模型——数据库中最常用的逻辑模型

关系数据库把所有数据组织成二维表格的形式:

┌─────────┬──────────┬────────┬──────────┐
│  学号   │   姓名   │  性别  │  手机号  │  ← 列(Column/字段/属性)
├─────────┼──────────┼────────┼──────────┤
│ 2024001 │   张三   │   男   │ 138****  │
│ 2024002 │   李四   │   女   │ 139****  │  ← 行(Row/记录/元组)
│ 2024003 │   王五   │   男   │ 137****  │
└─────────┴──────────┴────────┴──────────┘
         ↑
      表(Table/关系)
术语 日常说法 作用
表(Table) 一张表格 存放一类数据,如"学生表""图书表"
行(Row) 一条记录 表示一个具体的事物,如"张三的信息"
列(Column) 一个字段 表示事物的一个属性,如"姓名""手机号"
主键(Primary Key) 唯一编号 标识每一行的唯一性,如"学号"不会重复

4. 为什么要分多张表?——避免数据冗余

错误的写法(所有数据堆在一张表)

学号 姓名 班级 班主任 班主任电话
001 张三 计算机1班 王老师 138001
002 李四 计算机1班 王老师 138001
003 王五 计算机1班 王老师 138001

→ 问题:班主任电话重复了3次,如果王老师换电话,要改3行!

正确的写法(分成两张表)

学生表

学号 姓名 班级编号
001 张三 C01
002 李四 C01
003 王五 C01

班级表

班级编号 班级名称 班主任 班主任电话
C01 计算机1班 王老师 138001

→ 优点:王老师换电话,只需要改1处


# ■ 计划区

子目标分解

子目标 具体内容 预计用时
理解数据模型概念 阅读知识准备区,用自己的话解释三种模型 45分钟
理解关系表结构 学习"表-行-列-主键"概念,能举例子 30分钟
设计班级通讯录 把班级通讯录抽象成关系表结构 60分钟
展示与互评 各组展示设计图,互相找问题 45分钟

行动方案

  1. 阅读知识准备区,小组内互相讲解"三种数据模型"
  2. 教师用PPT展示"一张大表"vs"多张表"的对比案例
  3. 小组讨论:如果要设计一个"班级通讯录"数据库,需要几张表?每张表有哪些字段?
  4. 操作员在白板/纸上画出表结构,记录员填写工单
  5. 各组展示,互相找"哪里可能重复了"(冗余检查)

# ■ 决策区

关键决策点:班级通讯录需要几张表?

假设你要为班级做一个通讯录数据库,包含:学生姓名、学号、性别、手机号、班级名称、班主任姓名、班主任电话。

方案 表的数量 设计方式 优点 缺点
A 1张表 所有信息放在一张"学生表" 简单直观 班主任信息重复
B 2张表 "学生表"+"班级表" 避免班主任信息重复 稍微复杂
C 3张表 "学生表"+"班级表"+"班主任表" 最规范 对本任务过于复杂

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] "班级通讯录"关系表设计图(手绘或电子)
  • [ ] 每张表的字段列表(含字段名、数据类型、是否主键)
  • [ ] 说明"为什么这样分表"(避免哪些重复)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:理解三种数据模型 【执行】

  1. 各组员轮流用自己的话解释三种数据模型:
    • 组长解释:概念模型是______
    • 操作员解释:逻辑模型是______
    • 记录员解释:物理模型是______
    • 复核员补充:三者关系是______
  2. 复核员检查:是否4人都能区分这三种模型?
    • □ 能区分
    • □ 还有疑问:________________________

Step 2:理解关系表结构 【执行】

  1. 教师展示"学生信息表"示例。
  2. 小组抢答:
    • 这张表有几列?______
    • 这张表有几行?______
    • 哪一列适合做主键?为什么?______
    • "手机号"这一列如果允许重复,会有什么问题?______

Step 3:设计"班级通讯录"数据库 【执行】

小组讨论,完成以下设计(操作员画在纸上/白板上,记录员填写):

表1名称:________________

字段名 数据类型(先不严格,写"文字/数字/日期"即可) 是否主键 说明
□是 □否
□是 □否
□是 □否

表2名称(如需要):________________

字段名 数据类型 是否主键 说明
□是 □否
□是 □否

设计说明:我们为什么分______张表?避免了什么信息重复?


Step 4:冗余检查 【检查】

请其他小组检查你们的设计,找出可能的"重复信息":

检查人 发现的重复信息 我们的修改方案

# ■ 成果提交区

交付物清单

  1. [ ] "班级通讯录"关系表设计图(含表名、字段、主键标注)
  2. [ ] 三种数据模型对比说明(每人一句话总结)
  3. [ ] 冗余检查记录(至少接受1组检查)

# ■ 评价反思区

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我的表结构设计图清晰易懂 混乱难懂 基本可读 清晰规范 可作范例
K2 功能性 我能正确区分三种数据模型 完全混淆 基本区分 准确区分 能举例说明
K3 过程导向 我能按步骤完成表结构设计 步骤混乱 基本完成 完整规范 能检查冗余
K6 社会责任 我能积极参与小组讨论 不参与 偶尔发言 积极发言 能引导讨论

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
操作规范性 20 讨论有序、画图规范
成果质量 20 表结构设计合理、避免冗余
展示答辩 20 展示清晰、能回答问题
创新与改进 20 有自己的思考
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
操作规范性 20%
成果质量 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组


五、个人改进计划

  1. 数据模型中最难理解的是:________________________
  2. 分表设计时我最容易忽略的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么关系数据库叫"关系"数据库?】

"关系"(Relation)这个词来自数学中的集合论。在关系数据库的创始人E.F.Codd看来,一张二维表就是一个"关系",表中的每一行是一个"元组"(Tuple),每一列是一个"属性"(Attribute)。表与表之间可以通过相同的属性值(如"班级编号")建立"关系"。

这种基于数学理论的设计,使得关系数据库具有坚实的理论基础,也保证了数据操作(查询、插入、删除、修改)的正确性和一致性。这就是为什么40多年过去了,关系数据库(如MySQL、Oracle、SQL Server)仍然是企业中最主流的数据库类型。



# 模块二:设计数据库


# 【任务2-1】图书馆需要什么——需求调研与分析 【C→T】


# ■ 任务呈现区

情境

学校图书馆有3万多册图书,每天几百名学生来借书、还书。图书管理员李老师每天忙得手忙脚乱:找书慢、登记慢、查询某学生借了哪些书更慢。图书馆馆长找到你说:"同学,能不能帮我们做个电脑系统,让借书还书快一点?"

但是——做系统之前,你得先搞清楚:图书馆到底要管哪些东西?怎么管?这就是"需求分析",就像装修房子前先要知道家里有几口人、需要几个房间一样。

学习目标

  1. 能说出需求分析的3个基本步骤(调研→整理→确认)
  2. 能用表格列出图书馆需要管理的至少3类数据对象
  3. 能画出简化的数据流图(只用方框和箭头,不用复杂符号)
  4. 能写出一份不少于8条的需求清单

核心输出物

  • [ ] 需求调研访谈记录表(至少访谈2名"用户")
  • [ ] 图书馆数据对象清单表
  • [ ] 简化数据流图(手绘拍照)
  • [ ] 需求分析清单(Word文档,不少于8条)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据库系统分析与设计 → 需求分析阶段 行动维度:信息获取与结构化整理(调研→归纳→文档化) 需求维度:面对真实业务场景,识别信息需求并转化为系统功能描述 向上穿透:为后续E-R图设计(任务2-2)提供实体与属性的识别依据;为MySQL建表(任务3-3)提供字段设计来源


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配(1名组织能力强的学生+1名表达能力强的学生+2名执行型学生)

角色 职责 姓名
组长 统筹协调、把控进度、组织讨论、代表小组发言 ______
操作员 负责画图、填表、操作电脑 ______
记录员 记录讨论要点、整理文档、填写工单 ______
复核员 检查输出物完整性、核对清单是否遗漏 ______

轮换规则

  • 任务2-1 → 任务2-2:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、什么是需求分析?

类比 解释
装修房子 先知道家里几口人、要什么风格、预算多少,才能开工
点外卖 先知道想吃什么、几个人吃、有无忌口,才能下单
做数据库系统 先知道要管什么数据、谁用、怎么用,才能开始设计

# 二、需求分析的3个步骤

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  第1步:调研  │ → │  第2步:整理  │ → │  第3步:确认  │
│  (问清楚)    │    │  (理清楚)    │    │  (说清楚)    │
└─────────────┘    └─────────────┘    └─────────────┘
步骤 做什么 常用方法
调研 了解用户需要什么 访谈、问卷、实地观察
整理 把零散需求分类归纳 画流程图、列表格、画数据流图
确认 和用户核对是否正确 开会确认、签字认可

# 三、图书馆里有哪些"东西"要管?

数据对象 通俗解释 例子
图书 图书馆里一本本的书 《数据库原理》、ISBN 978-7-xxx
读者 来借书的人 学生张三、学号2023001
借阅记录 谁借了哪本书、什么时候借的 张三借了《数据库原理》,2024年3月1日借
管理员 负责借书还书的工作人员 李老师、工号T001

# 四、简化数据流图(只用两种符号)

符号 形状 含义 例子
处理/功能 方框 □ 系统要做什么事 "借书登记"、"查询图书"
数据流向 箭头 → 数据从哪里到哪里 读者信息 → 借书登记

💡 注意:本任务不用画标准数据流图(标准有4种符号),只用方框+箭头表示功能和数据走向即可。

示例:借书过程的数据流

读者信息 ──→ [查询图书] ──→ 图书信息
                ↓
            [借书登记] ──→ 借阅记录

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:访谈调研 45分钟 小组内2人扮演管理员/读者,2人访谈;收集图书馆日常业务流程 访谈记录表
子目标2:整理数据对象 45分钟 将访谈结果分类,确定需要管理的数据对象,列出每个对象的信息项 数据对象清单
子目标3:画数据流图 45分钟 用方框和箭头画出"借书""还书""查询"3个核心流程的数据流 手绘数据流图
子目标4:编写需求清单 45分钟 将以上成果整理为规范的需求分析文档,小组内交叉检查 需求分析清单文档

# 行动方案

  1. 准备阶段(10分钟):组长分配角色,明确本次任务目标
  2. 调研阶段(40分钟):小组内模拟访谈,记录员填写访谈记录表
  3. 整理阶段(40分钟):操作员画数据流图,记录员整理数据对象清单
  4. 文档阶段(50分钟):复核员检查输出物,全组共同编写需求分析清单
  5. 展示阶段(40分钟):各组展示需求清单,互相补充完善

# ■ 决策区

# 决策点1:需求调研时,先问"谁"还是先问"做什么"?

方案 做法 优点 缺点
A 先问"谁用系统"(用户) 能明确系统服务对象 容易遗漏功能
B 先问"做什么业务"(功能) 能覆盖主要功能点 可能忽略特殊用户需求
C 同时问"谁"和"做什么" 比较全面 访谈时间较长

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:图书信息需要包含"出版社地址"吗?

方案 做法 适用场景
A 包含 需要给出版社寄信、退货时使用
B 不包含 学校图书馆一般只记录书名、作者等基本信息
C 单独建一张"出版社表" 出版社信息很多,需要详细管理时

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] 访谈记录表(展示问了什么问题、得到什么回答)
  • [ ] 数据对象清单(展示图书/读者/借阅记录各需要哪些信息)
  • [ ] 简化数据流图(展示借书/还书/查询的数据走向)
  • [ ] 需求分析清单(展示不少于8条需求,按优先级排序)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
数据对象是否完整? ___/10 ___/10 ___/10 ___/10
需求清单是否可测量? ___/10 ___/10 ___/10 ___/10
数据流图是否清晰? ___/10 ___/10 ___/10 ___/10
展示表达是否清楚? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:角色分配与任务理解 【执行】

  1. 组长组织全组阅读本工单,确保每个人都理解任务目标
  2. 操作员在电脑上打开Word,新建文档命名为"需求分析_第X组"
  3. 记录员准备好纸笔,用于访谈记录

关键控制点:全员确认理解"需求分析"的含义(装修前量房子)后再开始

# Step 2:模拟访谈调研 【执行】

  1. 小组内分配角色:2人扮演"图书管理员"和"学生读者",2人扮演"调研员"
  2. 调研员提问以下问题(记录员记录回答):
    • 管理员每天主要做什么工作?
    • 借一本书要记录哪些信息?
    • 还书时要做什么?
    • 经常查询什么信息?查询时遇到什么困难?
    • 如果有了电脑系统,最希望它帮什么忙?
  3. 互换角色,再访谈一轮

关键控制点:访谈记录必须包含"具体信息项"(如"书名""借书日期"),不能只有笼统描述

访谈记录表模板

被访谈人角色 问题 回答要点 涉及的数据/信息
图书管理员 每天主要做什么? ______ ______
学生读者 借书时希望知道什么? ______ ______

# Step 3:整理数据对象 【检查】

  1. 全组一起浏览访谈记录,圈出所有"名词"(如图书、学生、日期、书名)
  2. 将名词分类,填入下表:

图书馆数据对象清单表

数据对象 需要记录的信息项(属性) 举例说明
图书 书名、作者、出版社、______、______、______ 《数据库原理》、张三、清华大学出版社
读者 姓名、学号、______、______、______ 李四、2023001、计算机系
借阅记录 借书日期、______、______、______ 2024-03-01、2024-03-15
______ ______ ______

关键控制点:每个数据对象至少有4个信息项;信息项名称要具体(不写"其他信息")

# Step 4:画简化数据流图 【执行】

  1. 操作员拿A4纸,用铅笔手绘
  2. 至少画出以下3个流程:

(1)借书流程

读者信息 ──→ [______] ──→ 图书信息
                ↓
            [______] ──→ ______

(2)还书流程

______ ──→ [______] ──→ ______

(3)查询图书流程

______ ──→ [______] ──→ ______
  1. 画好后拍照,插入Word文档

关键控制点:每个方框内写"动词+名词"(如"查询图书""登记借书"),不能只写名词

# Step 5:编写需求分析清单 【执行】

  1. 全组汇总以上成果,按以下格式编写需求分析清单
  2. 需求清单必须包含8条以上,建议按以下分类:

需求分析清单模板

序号 需求类别 需求描述 优先级(高/中/低) 涉及的数据对象
1 图书管理 系统能记录每本书的______ 图书
2 读者管理 系统能记录每位读者的______ 读者
3 借阅管理 系统能记录每次借书的______ 借阅记录
4 查询功能 管理员能通过______查询图书 图书
5 ______ ______ ______ ______
... ... ... ... ...

关键控制点:每条需求描述必须包含"谁+能做什么+达到什么效果",不能用"系统要好用"这类模糊描述

# Step 6:交叉检查与完善 【检查】

  1. 复核员对照以下检查表逐项检查:
    • [ ] 访谈记录有至少2人次的访谈内容
    • [ ] 数据对象清单有至少3个对象,每个有至少4个属性
    • [ ] 数据流图有至少3个流程,用了方框和箭头
    • [ ] 需求清单有至少8条需求,每条都可测量
    • [ ] 文档有小组名称、日期、成员姓名
  2. 发现遗漏,立即补充

# ■ 成果提交区

# 交付物清单

  • [ ] 访谈记录表(Word或手写拍照,至少2人次)
  • [ ] 数据对象清单表(Word表格,至少3个对象)
  • [ ] 简化数据流图(手绘拍照或电脑画图,至少3个流程)
  • [ ] 需求分析清单(Word文档,至少8条需求,按优先级排序)

# 格式要求

  1. 所有文档文件名格式:任务2-1_第X组_需求分析
  2. 图片清晰,文字可辨认
  3. Word文档页眉注明:小组名称、成员姓名、日期
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能清楚说出需求分析的3个步骤 ___ ______
K2 制定计划 我能按计划完成调研、整理、文档编写 ___ ______
K3 获取信息 我能通过访谈获取有效信息 ___ ______
K5 展示成果 我能清晰展示小组的需求分析成果 ___ ______
K8 反思改进 我能说出本次任务中做得不好的地方 ___ ______

评分标准:1=完全做不到,2=需要较多帮助才能做到,3=基本能独立完成,4=能独立完成还能帮助他人

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度(是否积极参与讨论和调研) 30% ___ ___ ___ ___
角色履行度(是否完成自己角色的职责) 30% ___ ___ ___ ___
协作配合度(是否配合他人、倾听意见) 20% ___ ___ ___ ___
成果贡献度(对最终成果的贡献大小) 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

评分标准:5=非常优秀,4=良好,3=合格,2=有待改进,1=不合格

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
调研完整性(20分) 访谈对象≥2类,问题设计合理,记录详细 访谈对象2类,记录较详细 仅有1类访谈对象,记录简单 无访谈记录或过于简单
数据对象识别(20分) 识别≥3个对象,属性≥4项/对象 识别3个对象,属性3项/对象 识别2个对象,属性不全 对象识别错误或缺失
数据流图(20分) 3个流程完整,符号使用正确,逻辑清晰 3个流程,符号基本正确 流程有遗漏,符号不规范 无法理解或缺失
需求清单质量(20分) ≥8条,每条可测量,按优先级排序 ≥8条,基本可测量 5-7条,部分模糊 少于5条或大量模糊描述
团队协作(20分) 分工明确,全员参与,成果优质 分工较明确,大部分参与 有分工,部分成员参与少 分工混乱或有人未参与

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
调研完整性 ___ 20% ___
数据对象识别 ___ 20% ___
数据流图 ___ 20% ___
需求清单质量 ___ 25% ___
团队协作 ___ 15% ___
最终得分 100% ___

# 五、个人改进计划

  1. 本次任务中,我在 ________________________ 方面做得不够好,下次我会 ________________________

  2. 我发现同伴在 ________________________ 方面做得很好,我可以向他/她学习 ________________________

  3. 如果再做一次需求分析,我会改进的地方是:________________________


# ■ 理论注解 ★(可选阅读)

什么是需求分析?为什么要做?

需求分析是做系统的"第一步",就像你想给朋友做一件衣服,得先量他的身高、肩宽、腰围。如果不量就做,做出来的衣服要么太大要么太小。

做数据库系统也是一样。如果不先搞清楚图书馆要管什么数据、这些数据之间有什么关系,就直接开始建表,很可能建出来的表少了字段、多了冗余,或者根本不符合实际使用需要。

需求分析最常用的方法是"访谈法"——找将来会用这个系统的人聊天,问他们每天做什么、需要什么信息、遇到什么困难。你不需要懂很多技术,只需要会"问问题"和"做记录"。



# 【任务2-2】画一张蓝图——E-R图设计 【C→T】


# ■ 任务呈现区

情境

上一节课,你们小组已经帮图书馆整理出了需求清单:要管图书、读者、借阅记录,还有管理员。馆长看了很满意,但他说:"这些表格我看了,但能不能画一张'图',让我一眼看清楚这些东西之间是什么关系?"

这就像建筑师盖楼前要画设计图一样,我们做数据库也要先画一张"蓝图"——E-R图。E-R图用简单的几何图形就能说清楚:有哪些东西(实体)、这些东西有什么特征(属性)、它们之间怎么联系起来(联系)。

学习目标

  1. 能说出E-R图中三种基本图形的名称和含义(矩形、椭圆、菱形)
  2. 能区分一对一、一对多、多对多三种联系类型
  3. 能独立完成图书馆管理系统的E-R图(手绘)
  4. 能在电脑上使用工具画出规范的E-R图

核心输出物

  • [ ] E-R图概念理解自查表
  • [ ] 手绘E-R图(A4纸,拍照上传)
  • [ ] 电脑绘制的E-R图(使用ProcessOn或Visio等工具,导出图片)
  • [ ] E-R图设计说明文档(解释每个实体、属性、联系的含义)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据库概念设计 → E-R模型建立 行动维度:抽象建模与可视化表达(识别实体→确定属性→建立联系) 需求维度:将业务需求转化为概念层数据模型,为技术人员与非技术人员提供沟通桥梁 向上穿透:基于任务2-1的需求分析结果识别实体与属性;为任务2-3的关系模型转换提供输入;为任务3-3的MySQL建表提供表结构依据


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配

角色 职责 姓名
组长 统筹协调、把控进度、组织讨论、代表小组发言 ______
操作员 负责手绘E-R图、操作电脑画图软件 ______
记录员 记录讨论要点、整理E-R图说明文档 ______
复核员 检查E-R图元素是否完整、联系类型是否正确 ______

轮换规则

  • 任务2-2 → 任务2-3:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、E-R图的三种"图形密码"

E-R图就是"实体-联系图"(Entity-Relationship Diagram),用三种图形表示数据库的设计蓝图:

图形 形状 含义 记忆口诀 例子
实体 矩形 ▭ 要管理的"东西"(名词) "实实在在放东西" 图书、读者、管理员
属性 椭圆 ◯ 实体的"特征"(形容词/名词) "椭圆像鸡蛋,装着属性名" 书名、作者、价格
联系 菱形 ◇ 实体之间的"关系"(动词) "菱形像桥梁,连接两岸" 借阅、管理、属于

# 二、三种联系类型(用数字标注)

联系类型 符号 通俗解释 图书馆例子
一对一(1:1) 1──1 A的一个对应B的一个 一个读者对应一个借书证
一对多(1:n) 1──n A的一个对应B的多个 一个管理员管理多本图书(入库)
多对多(m:n) m──n A的多个对应B的多个 一个读者借多本书,一本书被多个读者借

联系类型判断口诀

先问左边有几个,再问右边有几个
两边都是"一个" → 一对一
一边"一个"一边"多个" → 一对多
两边都是"多个" → 多对多

# 三、图书馆E-R图参考示例(局部)

                    ┌──────────┐
                    │   图书    │
                    │  ───────  │
                    │  书名     │
     ┌──────────┐   │  作者     │   ┌──────────┐
     │   读者    │◯  │  ISBN   │◯  │  管理员   │
     │  ───────  │   │  出版社   │   │  ───────  │
     │  姓名     │   │  价格     │   │  姓名     │
     │  学号     │   └────┬─────┘   │  工号     │
     │  院系     │        │         │  职务     │
     │  电话     │        │         └──────────┘
     └────┬─────┘        │
          │              │
          └──────┬───────┘
                 ◇
               借阅
              (m:n)
                 │
          ┌──────┴──────┐
          │  借书日期    │
          │  应还日期    │
          │  实际还期    │
          └─────────────┘

💡 注意:上面的图是"示意",你的任务是根据需求分析结果画出更完整的E-R图。


# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:理解E-R图概念 45分钟 学习三种图形和三种联系类型,完成概念自查表 自查表
子目标2:识别实体与属性 45分钟 根据任务2-1的需求清单,确定实体、属性,排除非实体项 实体属性清单
子目标3:确定联系类型 45分钟 分析每两个实体之间的联系,判断1:1/1:n/m:n 联系分析表
子目标4:绘制E-R图 45分钟 先手绘,再用电脑软件绘制规范E-R图,编写设计说明 手绘图+电脑图+说明文档

# 行动方案

  1. 学习阶段(20分钟):全组一起学习E-R图三种图形,每人完成自查表
  2. 分析阶段(40分钟):回顾任务2-1的需求清单,确定实体、属性、联系
  3. 手绘阶段(40分钟):操作员手绘E-R图,全组讨论修改
  4. 电脑绘制阶段(50分钟):用ProcessOn/Visio等工具绘制规范E-R图
  5. 文档与展示阶段(30分钟):记录员编写设计说明,准备展示

# ■ 决策区

# 决策点1:"借书证"是一个独立的实体,还是"读者"的属性?

方案 做法 适用场景
A "借书证"是独立实体 借书证本身有很多信息(办证日期、有效期、押金),且和读者是1:1关系
B "借书证"是"读者"的属性 学校图书馆中,借书证信息简单,主要就是证号,可以并入读者
C 先按属性处理,后续如需扩展再独立 需求不明确时的折中方案

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:"出版社"是一个实体,还是图书的属性?

方案 做法 适用场景
A "出版社"是独立实体 需要详细管理出版社信息(地址、电话、联系人),且一本书对应一个出版社,一个出版社出多本书
B "出版社"作为"图书"的属性 只需记录出版社名称,无需额外信息
C "出版社名称"作为属性,同时建简单出版社表 兼顾当前需求和未来扩展

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] E-R图概念自查表(展示对三种图形、三种联系的理解)
  • [ ] 实体属性清单(展示从需求中识别出的所有实体和属性)
  • [ ] 联系分析表(展示每对实体之间的联系类型判断过程)
  • [ ] 手绘E-R图(展示原始设计思路)
  • [ ] 电脑绘制E-R图(展示规范成果)
  • [ ] E-R图设计说明文档(解释设计理由)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
实体识别是否完整? ___/10 ___/10 ___/10 ___/10
属性设计是否合理? ___/10 ___/10 ___/10 ___/10
联系类型判断是否正确? ___/10 ___/10 ___/10 ___/10
E-R图是否清晰规范? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:学习E-R图基础概念 【执行】

  1. 全组一起阅读"知识准备区"的三种图形和联系类型
  2. 每人独立完成以下自查表(组长抽查):

E-R图概念自查表

问题 我的答案 对/错
实体用什么图形表示? ______ ___
属性用什么图形表示? ______ ___
联系用什么图形表示? ______ ___
"一个班级只有一个班长"是什么联系类型? ______ ___
"一个学生选多门课,一门课被多个学生选"是什么联系类型? ______ ___
"一个读者可以借多本书",图书和读者之间是什么联系? ______ ___

关键控制点:全组自查表正确率需达到100%才能进入下一步;有误立即纠正

# Step 2:从需求清单中识别实体 【检查】

  1. 拿出任务2-1的"数据对象清单"
  2. 判断哪些是"实体"(矩形框),填入下表:

图书馆实体识别表

候选对象 是不是实体?(是/否) 理由 如果是实体,起个英文名字
图书 ___ ______ Book
读者 ___ ______ Reader
借阅记录 ___ ______ Borrow
管理员 ___ ______ Admin
书名 ___ ______
学号 ___ ______
借书日期 ___ ______
______ ___ ______ ______

💡 判断技巧:实体一般是"名词",且能独立存在、有多个实例;属性是实体的"特征",不能独立存在。

关键控制点:实体数量建议控制在3-5个,太多会让系统复杂;"书名""学号"是属性不是实体

# Step 3:为每个实体确定属性 【执行】

  1. 为每个实体选择最重要的4-6个属性
  2. 用下划线标出主键属性(能唯一标识这个实体的属性)
实体 属性1(主键) 属性2 属性3 属性4 属性5 属性6
图书 ISBN 书名 作者 出版社 出版日期 价格
读者 _______ 姓名 性别 院系 电话 ______
借阅记录 _______ 借书日期 应还日期 实际还期 ______ ______
管理员 _______ 姓名 职务 ______ ______ ______

关键控制点:每个实体必须有且只有1个主键;主键应该是"不会变"的(如学号比姓名更适合做主键)

# Step 4:分析实体之间的联系 【执行】

  1. 两两组合分析实体之间是否有联系:
实体A 实体B 是否有联系? 联系名称 联系类型(1:1/1:n/m:n) 判断理由
读者 图书 ___ 借阅 ___ 一个读者借多本书,一本书被多个读者借
管理员 图书 ___ ______ ___ ______
读者 管理员 ___ ______ ___ ______
______ ______ ___ ______ ___ ______
  1. 判断方法:画出下表,填写"一个"或"多个"
读者 和 图书 的"借阅"联系:

          读者                      图书
     ┌───────────┐             ┌───────────┐
     │  一个读者   │────────────→│  借___本书  │
     │  能借多少本?│             │            │
     └───────────┘             └───────────┘
                                       ↑
          图书                      读者
     ┌───────────┐             ┌───────────┐
     │  一本书    │────────────→│  被___个读者│
     │  被多少人借?│             │   借过?   │
     └───────────┘             └───────────┘

结果:一边是"多个",另一边也是"多个" → 联系类型 = m:n

关键控制点:每对实体之间最多只有一种主要联系;联系类型判断错误会导致后续表结构设计错误

# Step 5:手绘E-R图 【执行】

  1. 操作员拿A4纸横放,用铅笔先画草图
  2. 按照以下模板绘制:

绘图步骤

  1. 先画矩形框,写上实体名(图书、读者、管理员、借阅记录)

  2. 每个实体旁边画椭圆,写上属性名,用无向线连到实体

  3. 有联系的实体之间画菱形,写上联系名,用无向线连接实体

  4. 在联系线旁标注联系类型(1:1、1:n、m:n)

  5. 检查:每个实体有主键属性(下划线)、每个联系有类型标注

  6. 画好后全组讨论,修改不合理之处

  7. 确认后用黑笔描一遍,拍照保存

关键控制点:手绘图必须包含至少3个实体、每个实体至少4个属性、至少2个联系;字迹清晰可辨认

# Step 6:用电脑软件绘制规范E-R图 【执行】

  1. 打开浏览器,访问 ProcessOn (opens new window)(免费注册)
  2. 点击"新建" → "流程图"
  3. 在左侧图形库中找到:
    • 矩形(实体):在"基本图形"里找矩形
    • 椭圆(属性):在"基本图形"里找椭圆
    • 菱形(联系):在"基本图形"里找菱形
  4. 按照手绘图的布局,在软件中绘制相同内容的E-R图
  5. 设置格式:
    • 实体矩形:蓝色填充、白色文字
    • 属性椭圆:绿色填充、白色文字
    • 联系菱形:橙色填充、白色文字
  6. 点击"文件" → "导出为" → "PNG图片"

关键控制点:电脑图必须与手绘图内容一致;图形排列整齐,连线不交叉;导出图片分辨率不低于1024×768

# Step 7:编写E-R图设计说明 【执行】

  1. 记录员在Word中编写设计说明,包含以下内容:

E-R图设计说明模板

一、实体说明

1. 实体:图书(Book)
   - 含义:图书馆中所有可借阅的图书
   - 主键:ISBN(国际标准书号,每本书唯一)
   - 属性说明:
     * 书名:图书的名称
     * 作者:图书的编写者
     * ______

2. 实体:读者(Reader)
   - 含义:______
   - 主键:______
   - 属性说明:______

3. 实体:______
   - 含义:______
   - 主键:______
   - 属性说明:______

二、联系说明

1. 联系:借阅
   - 参与实体:读者、图书
   - 联系类型:______
   - 含义:______
   - 联系属性:借书日期、应还日期、______

三、设计决策说明
   - 我们选择了"出版社"作为______(实体/属性),理由是______
   - 我们选择了"借书证"作为______(实体/属性),理由是______

关键控制点:设计说明必须解释"为什么这样设计",不能只罗列;至少有2条设计决策说明


# ■ 成果提交区

# 交付物清单

  • [ ] E-R图概念自查表(Word或手写拍照)
  • [ ] 实体属性清单表(Word表格)
  • [ ] 联系分析表(Word表格)
  • [ ] 手绘E-R图(A4纸,拍照上传,清晰可辨认)
  • [ ] 电脑绘制E-R图(PNG图片,分辨率≥1024×768)
  • [ ] E-R图设计说明文档(Word,不少于800字)

# 格式要求

  1. 所有文档文件名格式:任务2-2_第X组_E-R图设计
  2. 手绘图拍照光线充足、无阴影遮挡
  3. 电脑导出图无水印、图形不重叠
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出E-R图的三种图形和三种联系类型 ___ ______
K3 获取信息 我能从需求清单中正确识别实体和属性 ___ ______
K4 分析加工 我能正确判断实体之间的联系类型 ___ ______
K5 展示成果 我能用手绘和电脑两种方式画出E-R图 ___ ______
K8 反思改进 我能说出我的E-R图和别组相比的优缺点 ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
概念理解(20分) 能准确说出三种图形、三种联系,自查表全对 基本准确,自查表错1-2题 部分混淆,自查表错3-4题 概念不清,自查表错5题以上
实体识别(20分) 识别3-5个合适实体,无遗漏无多余 识别3个实体,基本合适 实体识别有遗漏或多余 实体识别混乱
属性设计(20分) 每个实体4-6个属性,主键选择合理 每个实体3-4个属性 属性数量不足或主键不当 属性缺失严重
联系判断(20分) 所有联系类型判断正确 主要联系判断正确 部分联系类型判断错误 大量联系类型错误
图形规范(20分) 手绘+电脑图均规范清晰 手绘或电脑图有一项规范 图形基本可辨认 图形混乱无法辨认

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
概念理解 ___ 15% ___
实体识别 ___ 20% ___
属性设计 ___ 20% ___
联系判断 ___ 25% ___
图形规范 ___ 20% ___
最终得分 100% ___

# 五、个人改进计划

  1. 在判断联系类型时,我经常把 ______ 和 ______ 搞混,改进方法是 ________________

  2. 我的E-R图在 ______ 方面不如其他组,下次我会 ________________________

  3. 通过本次任务,我理解了"抽象"的含义:就是把现实中的______,用______来表示。


# ■ 理论注解 ★(可选阅读)

为什么需要E-R图?

E-R图是数据库设计中最重要的一张"草图"。它的好处是:不用懂数据库技术的人也能看懂

假设你画好了E-R图给图书馆馆长看,他一眼就能明白:"哦,原来我的系统要管图书、读者,还有他们之间的借阅关系。"如果直接给他看数据库表结构,他可能会一脸茫然。

E-R图的本质是"抽象"——把现实世界中的事物和关系,用简单的几何图形表示出来。就像地图把真实的山川河流抽象成线条和颜色一样,E-R图把图书馆的业务抽象成矩形、椭圆和菱形。

记住一个原则:E-R图阶段不要想"怎么在电脑里实现",只需要想"现实世界中有什么、它们之间有什么关系"。 至于怎么建表、怎么写SQL语句,那是后面任务的事情。



# 【任务2-3】从图纸到数据表——关系模型转换与规范化 【C→T】


# ■ 任务呈现区

情境

你们小组的E-R图已经画好了,馆长看了很满意。现在他问:"这张图不错,但电脑又不认识矩形和菱形,怎么把它变成电脑能存的数据呢?"

没错,E-R图是给人看的"设计图",下一步要把它转换成电脑能懂的"数据表"。这个过程就像把建筑图纸变成一砖一瓦的房子。而且,建表不能随便建,要讲究"规矩"——这就是"规范化",让表结构既省空间又不出错。

今天你们要把E-R图变成3张数据库表,并且学会怎么判断表设计得好不好。

学习目标

  1. 能说出E-R图转换成关系表的3个基本规则
  2. 能为一组数据判断是否符合第一、二、三范式(简化版)
  3. 能将图书馆E-R图转换为至少3张规范的关系表(含主键、外键标注)
  4. 能说出范式的核心思想:原子性、消除部分依赖、消除传递依赖

核心输出物

  • [ ] E-R图到关系表转换规则总结表
  • [ ] 图书馆管理系统关系表设计(至少3张表,含字段、类型、主键、外键)
  • [ ] 每张表的范式自查表(检查是否符合1NF/2NF/3NF)
  • [ ] 关系表设计说明文档

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据库逻辑设计 → E-R图向关系模型转换、关系规范化 行动维度:规则应用与逻辑推导(按转换规则建表→按范式原则优化) 需求维度:将概念模型转化为可在DBMS中实现的数据结构,确保数据一致性、减少冗余 向上穿透:基于任务2-2的E-R图进行转换;产出关系表结构直接指导任务3-3的MySQL CREATE TABLE语句编写;为任务3-4的完整性约束设计提供依据


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配

角色 职责 姓名
组长 统筹协调、把控进度、组织讨论、代表小组发言 ______
操作员 负责在电脑上建表、画表结构图 ______
记录员 记录转换规则、整理表结构文档、填写自查表 ______
复核员 检查表结构是否符合范式、主键外键是否正确 ______

轮换规则

  • 任务2-3 → 任务3-1:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、E-R图 → 关系表的转换规则(3句话搞定)

规则 E-R图元素 转换成 例子
规则1 每个实体 → 一张表 "图书"实体 → 图书表
规则2 每个实体的属性 → 表的字段(列) 书名、作者 → 图书表中的列
规则3 实体间的联系 → 外键或独立表 读者和图书的借阅联系 → 借阅记录表(含外键)

# 二、三种联系类型怎么转换?

联系类型 转换方法 结果 例子
一对一(1:1) 在任意一方加外键 两张表,其中一张加外键 读者和借书证:在读者表加"借书证号"
一对多(1:n) 在"多"的一方加外键 两张表,"多"方加外键 出版社和图书:在图书表加"出版社ID"
多对多(m:n) 新建一张独立表 三张表,中间表含两个外键 读者和图书:新建"借阅记录"表

# 三、三范式简化版(不用数学推导)

🔹 第一范式(1NF):原子性——每个格子只装一个东西

❌ 不符合1NF ✅ 符合1NF
电话列:"13800138000, 13900139000" 拆成多条记录,或另建电话表
作者列:"张三, 李四" 只存一个作者,或另建作者表

💡 通俗理解:Excel表格里一个单元格不能只填一个值吗?数据库也一样!

🔹 第二范式(2NF):消除部分依赖——非主键字段要完全依赖主键

❌ 不符合2NF ✅ 符合2NF
表:(学号, 课程号) → 姓名, 成绩 拆成:学生表(学号→姓名) + 选课表(学号,课程号→成绩)

💡 通俗理解:如果主键是两个字段合起来的,那其他字段必须依赖"两个合起来",不能只依赖其中一个。

🔹 第三范式(3NF):消除传递依赖——字段之间不能"传话"

❌ 不符合3NF ✅ 符合3NF
学生表:学号 → 院系 → 系主任 拆成:学生表(学号→院系) + 院系表(院系→系主任)

💡 通俗理解:如果你能通过A找到B,通过B找到C,那C就不要放在A的表里,单独建个B的表。

# 四、三范式速记口诀

一范式:一个格子一个值(原子性)
二范式:非主键全靠主键(消除部分依赖)
三范式:字段之间不"传话"(消除传递依赖)

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:学习转换规则 45分钟 学习E-R图转关系表的3个规则,完成练习题 转换规则练习题
子目标2:学习三范式 45分钟 学习1NF/2NF/3NF的核心思想,判断示例表是否符合范式 范式判断练习
子目标3:转换图书馆E-R图 45分钟 将小组的E-R图转换为关系表,确定字段、主键、外键 初步表结构
子目标4:规范化优化 45分钟 检查每张表是否符合三范式,优化调整,编写设计说明 最终表结构+设计说明

# 行动方案

  1. 规则学习(30分钟):全组学习转换规则和三范式,完成练习题
  2. 转换实践(50分钟):将E-R图转换为关系表,操作员在Excel或Word中画表结构
  3. 范式检查(40分钟):逐表检查是否符合1NF/2NF/3NF,记录员填写自查表
  4. 优化完善(40分钟):对不符合范式的表进行拆分,复核员检查最终结构
  5. 文档编写(40分钟):记录员编写关系表设计说明,准备展示

# ■ 决策区

# 决策点1:读者的"院系"和"专业"应该放在一个表里,还是分开?

方案 做法 优点 缺点
A 放在读者表(一个字段存"院系",一个字段存"专业") 简单直观,查询快 如果同一院系有很多读者,院系信息重复存储
B 拆成"读者表+院系表+专业表" 消除冗余,更新方便 查询时需要关联多张表,稍复杂
C 读者表存"专业ID",另建专业表(专业表再关联院系表) 折中方案,既减少冗余又不太复杂 需要理解外键关系

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:图书的"分类"(如计算机类、文学类)怎么处理?

方案 做法 适用场景
A 图书表直接存"分类名称"(如"计算机") 分类少且不变化
B 图书表存"分类ID",另建分类表 分类多、可能有层次(大类→小类)
C 图书表存分类名称,同时建分类表备用 当前简单但预留扩展

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] E-R图转关系表规则总结(展示3个规则的理解)
  • [ ] 范式判断练习答案(展示对1NF/2NF/3NF的理解)
  • [ ] 图书馆关系表结构(展示至少3张表的字段、主键、外键)
  • [ ] 范式自查表(展示每张表是否符合三范式的判断过程)
  • [ ] 关系表设计说明(展示设计决策和优化过程)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
表结构是否完整? ___/10 ___/10 ___/10 ___/10
主键外键设计是否正确? ___/10 ___/10 ___/10 ___/10
是否符合三范式? ___/10 ___/10 ___/10 ___/10
设计说明是否清晰? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:学习转换规则并练习 【执行】

  1. 全组阅读"知识准备区"的转换规则和三范式内容
  2. 完成以下练习题(全员动笔,组长抽查):

练习题1:E-R图转关系表

已知E-R图中有:学生实体(学号、姓名、性别)、课程实体(课程号、课程名)、选修联系(m:n,属性:成绩)。

问:需要几张表?每张表有哪些字段?

答:需要 ___ 张表。

  • 表1:______(字段:______)
  • 表2:______(字段:______)
  • 表3:______(字段:______)

练习题2:范式判断

判断以下表是否符合1NF/2NF/3NF:

学号 姓名 课程号 课程名 成绩 院系 系主任
001 张三 C01 数据库 85 计算机 王教授
001 张三 C02 网络 90 计算机 王教授
  • 是否符合1NF? ___ ,理由:______
  • 是否符合2NF? ___ ,理由:______
  • 是否符合3NF? ___ ,理由:______

关键控制点:练习题全组讨论后统一答案;有争议的地方问老师确认

# Step 2:将E-R图实体转换为表 【执行】

  1. 拿出任务2-2的E-R图
  2. 按照"一个实体一张表"的规则,先列出所有表:

图书馆管理系统 - 初步表结构

序号 表名(中文) 表名(英文) 对应E-R图实体
1 图书表 books 图书
2 读者表 readers 读者
3 借阅记录表 borrows 借阅(联系转换)
4 ______ ______ ______

关键控制点:m:n联系必须单独建表;1:n联系不用单独建表,在n方加外键

# Step 3:确定每张表的字段 【执行】

  1. 按照E-R图的属性,为每张表确定字段
  2. 用下划线标注主键(PK),用(FK)标注外键

表1:图书表(books)

字段名(英文) 字段名(中文) 是否主键 是否外键 说明
book_id 图书编号 PK 唯一标识每本书
title 书名 ______
author 作者 ______
publisher 出版社 ______
publish_date 出版日期 ______
price 价格 ______
______ ______ ______

表2:读者表(readers)

字段名(英文) 字段名(中文) 是否主键 是否外键 说明
______ ______ PK ______
______ ______ ______
______ ______ ______
______ ______ ______
______ ______ ______

表3:借阅记录表(borrows)

字段名(英文) 字段名(中文) 是否主键 是否外键 说明
borrow_id 借阅编号 PK 唯一标识每次借阅
reader_id 读者编号 FK 关联读者表
book_id 图书编号 FK 关联图书表
borrow_date 借书日期 ______
return_date 应还日期 ______
actual_return 实际归还日期 ______

关键控制点:每张表必须有主键;外键必须关联到另一张表的主键;字段名用英文小写+下划线命名

# Step 4:范式自查与优化 【检查】

  1. 对每张表逐条检查是否符合三范式:

范式自查表 - 图书表

检查项 是否符合 具体说明
1NF:每个字段值是否不可再分? ___ 例如:作者字段只存一个作者名
2NF:非主键字段是否完全依赖主键? ___ 例如:书名是否只由book_id决定?
3NF:字段之间是否存在传递依赖? ___ 例如:是否由A字段能推出B字段?

范式自查表 - 读者表

检查项 是否符合 具体说明
1NF ___ ______
2NF ___ ______
3NF ___ ______

范式自查表 - 借阅记录表

检查项 是否符合 具体说明
1NF ___ ______
2NF ___ ______
3NF ___ ______
  1. 如果发现不符合范式的表,画出优化后的新结构:
优化前:__________________________________________

优化后:__________________________________________

优化理由:________________________________________

关键控制点:本任务中,图书表、读者表、借阅记录表通常已符合3NF;如果发现不符合(如读者表含"院系主任"),需拆表并画出优化后的结构

# Step 5:画表结构关系图 【执行】

  1. 操作员在Word或Excel中画出表之间的关系图
  2. 用以下方式表示关系:
┌─────────────────┐         ┌─────────────────┐
│     读者表       │         │     图书表       │
│   (readers)     │         │    (books)      │
│ ─────────────── │         │ ─────────────── │
│ PK reader_id    │         │ PK book_id      │
│    name         │         │    title        │
│    gender       │         │    author       │
│    dept         │         │    publisher    │
│    phone        │         │    price        │
└────────┬────────┘         └────────┬────────┘
         │                           │
         │    ┌─────────────────┐    │
         └───→│   借阅记录表      │←───┘
            │   (borrows)     │
            │ ─────────────── │
            │ PK borrow_id    │
            │ FK reader_id    │
            │ FK book_id      │
            │    borrow_date  │
            │    return_date  │
            └─────────────────┘
  1. 用箭头标注外键关系,用1和n标注联系类型

关键控制点:关系图必须清晰显示哪张表的外键关联到哪张表的主键;箭头方向从外键指向主键

# Step 6:编写设计说明 【执行】

  1. 记录员编写关系表设计说明文档,包含:

关系表设计说明模板

一、转换规则应用

1. 实体转表:我们将E-R图中的______、______、______实体转换为______张表。
2. 属性转字段:每个实体的属性直接转换为对应表的字段。
3. 联系转外键:读者和图书之间的m:n联系转换为独立的______表,包含______和______两个外键。

二、主键与外键设计

| 表名 | 主键 | 外键 | 外键关联表 |
|:---|:---|:---|:---|
| 图书表 | book_id | 无 | — |
| 读者表 | ______ | 无 | — |
| 借阅记录表 | ______ | reader_id | 读者表 |
| 借阅记录表 | ______ | book_id | 图书表 |

三、规范化检查结论

| 表名 | 1NF | 2NF | 3NF | 说明 |
|:---|:---:|:---:|:---:|:---|
| 图书表 | ✓ | ✓ | ✓ | 所有字段原子性,无部分依赖和传递依赖 |
| 读者表 | ___ | ___ | ___ | ______ |
| 借阅记录表 | ___ | ___ | ___ | ______ |

四、设计决策说明
- 我们选择______作为主键,因为______
- 我们没有将______拆分为独立表,因为______

关键控制点:设计说明必须解释"为什么这样设计主键和外键";必须包含三范式检查结果


# ■ 成果提交区

# 交付物清单

  • [ ] 转换规则与范式练习题(手写或Word)
  • [ ] 图书馆关系表结构(至少3张表,Word表格,含字段、主键、外键)
  • [ ] 范式自查表(Word表格,逐表逐范式检查)
  • [ ] 表结构关系图(Word或手绘,展示表间外键关系)
  • [ ] 关系表设计说明文档(Word,不少于600字)

# 格式要求

  1. 所有文档文件名格式:任务2-3_第X组_关系模型转换
  2. 表结构用Word表格呈现,对齐整齐
  3. 关系图清晰,箭头方向正确
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出E-R图转关系表的3个规则 ___ ______
K3 获取信息 我能从E-R图中正确提取实体、属性、联系 ___ ______
K4 分析加工 我能判断表是否符合三范式 ___ ______
K6 使用工具 我能用Word/Excel画出规范的表结构 ___ ______
K8 反思改进 我能说出范式对数据库设计的重要性 ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
转换规则理解(20分) 能准确应用3个规则,练习题全对 基本正确,练习错1处 规则理解有偏差 无法理解转换规则
表结构设计(20分) 3张以上表,字段完整,主键外键正确 3张表,主键外键基本正确 表结构有遗漏,外键错误 表结构混乱
范式应用(25分) 能正确判断1NF/2NF/3NF,并能优化 能判断三范式,优化基本正确 能判断1NF和2NF 无法判断或判断错误
关系图(20分) 关系图清晰,箭头方向正确,联系类型标注 关系图较清晰 关系图基本可辨认 关系图混乱
团队协作(15分) 分工明确,全员参与,成果优质 分工较明确 有分工,部分参与少 分工混乱

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
转换规则理解 ___ 20% ___
表结构设计 ___ 20% ___
范式应用 ___ 25% ___
关系图 ___ 20% ___
团队协作 ___ 15% ___
最终得分 100% ___

# 五、个人改进计划

  1. 三范式中,我最难理解的是第 ______ 范式,因为 ________________________

  2. 下次遇到m:n联系,我会记得:必须新建一张 ______ 表,包含 ______ 个外键。

  3. 如果让我重新设计读者表,我会改进:________________________


# ■ 理论注解 ★(可选阅读)

为什么要做规范化?一个反面例子

假设你不做规范化,把所有信息塞进一张大表:

学号 姓名 院系 系主任 课程号 课程名 成绩
001 张三 计算机 王教授 C01 数据库 85
001 张三 计算机 王教授 C02 网络 90

发现问题了吗?

  • 数据冗余:张三的姓名、院系、系主任重复了2次。如果有1000名学生,院系信息要重复1000次!
  • 更新异常:如果计算机系换系主任了,要改1000条记录,漏改一条数据就不一致了。
  • 删除异常:如果张三退选了所有课,删除记录时连他的个人信息也一起删掉了!

规范化就是解决这些问题的方法。把大表拆成"学生表+课程表+选课表",信息只存一份,既省空间又不容易出错。

但注意:规范化不是越多越好。本课程只学到第三范式,对于高职应用已经足够。更高层次的范式(BCNF、4NF等)留给继续深造时学习。



# 模块三:MySQL基础操作


# 【任务3-1】搭建工作台——MySQL安装与连接 【C→T】


# ■ 任务呈现区

情境

前面你们已经设计好了图书馆管理系统的表结构,但这些都只是"纸上的设计"。要让电脑真正帮图书馆管书,就得把设计搬到数据库软件里。

MySQL就是世界上最流行的数据库软件之一,免费、好用、资料多。今天你们的任务是:在自己的电脑上"搭一个工作台"——安装MySQL数据库和它的图形化工具MySQL Workbench,然后成功连接上数据库服务器。

这就像学做菜前先要把厨房收拾好、炉灶点着。安装过程可能会有点繁琐,但一步一步跟着做,一定能成功。

学习目标

  1. 能独立完成MySQL Community Server和MySQL Workbench的安装
  2. 能使用MySQL Workbench连接到本地MySQL服务器
  3. 能说出MySQL服务器和MySQL Workbench各自的用途
  4. 能截图保存安装成功的界面作为证明

核心输出物

  • [ ] MySQL安装过程记录(关键步骤截图,至少3张)
  • [ ] MySQL Workbench安装成功截图
  • [ ] MySQL Workbench连接成功界面截图(显示Connected)
  • [ ] 安装问题及解决方法记录表(如有遇到问题)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据库实施环境搭建 → MySQL数据库管理系统安装与配置 行动维度:软件安装与环境配置(按步骤安装→测试连接→记录问题) 需求维度:为后续所有SQL操作任务提供可运行的数据库环境 向上穿透:基于任务2-3设计的关系表结构,为任务3-2创建library数据库、任务3-3创建数据表、任务3-4添加约束提供软件平台


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配;安装过程中可互相帮助,但每人需独立完成自己的安装

角色 职责 姓名
组长 统筹协调、收集全组安装问题、向老师反馈共性问题 ______
操作员 率先完成安装,协助指导其他组员操作 ______
记录员 记录安装步骤、截图整理、填写安装问题表 ______
复核员 检查每人安装是否成功、截图是否完整 ______

轮换规则

  • 任务3-1 → 任务3-2:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、MySQL是什么?

类比 解释
Excel 一个文件管一张表,适合个人用
MySQL 专门存数据的软件,能同时管很多张表,适合多人共用
图书馆 MySQL就像图书馆的"书库管理系统",能存海量数据,查得快、不会丢

# 二、两个软件的区别

软件名称 图标样子 作用 比喻
MySQL Server 后台服务,看不到窗口 真正存数据的地方 图书馆的"书库"
MySQL Workbench 有图形界面 操作数据库的工具 图书馆的"前台查询机"

💡 一句话理解:Server是"仓库",Workbench是"开仓库门的钥匙和操作台"。没有仓库,钥匙没用;没有钥匙,仓库进不去。

# 三、安装前检查清单

检查项 要求 你的情况
操作系统 Windows 10/11,64位 ___
内存 至少4GB(越大越好) ___
硬盘空间 至少2GB可用空间 ___
管理员权限 安装需要管理员权限 ___
网络 安装包由教师提供,无需下载 ___

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:安装MySQL Server 60分钟 运行安装包,选择Server only模式,设置root密码 安装完成界面
子目标2:安装MySQL Workbench 30分钟 运行安装包,选择Complete安装 安装完成界面
子目标3:连接测试 30分钟 打开Workbench,创建连接,输入密码,测试连通性 连接成功截图
子目标4:认识界面 30分钟 熟悉Workbench主界面各区域功能 界面标注说明

# 行动方案

  1. 准备阶段(10分钟):组长检查全组电脑是否符合安装要求
  2. 安装Server(50分钟):每人独立安装MySQL Server,记录员截图记录关键步骤
  3. 安装Workbench(30分钟):每人独立安装MySQL Workbench
  4. 连接测试(30分钟):操作员率先完成,协助其他组员连接测试
  5. 界面熟悉(30分钟):全组一起认识Workbench界面,记录员整理界面说明
  6. 问题汇总(30分钟):组长汇总全组遇到的问题和解决方法

# ■ 决策区

# 决策点1:安装MySQL时,选择哪种安装类型?

方案 安装类型 安装内容 适用情况
A Server only 只安装MySQL服务器 只需要数据库服务,用Workbench单独安装
B Client only 只安装客户端工具 连接远程服务器时使用
C Full 安装所有组件 磁盘空间大,需要全部功能
D Custom 自定义选择组件 知道需要什么组件时使用

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:root密码设置为什么很重要?

方案 密码策略 优点 缺点
A 简单密码(如123456) 好记,不容易忘 安全性差,容易被破解
B 复杂密码(含大小写+数字+符号) 安全性高 容易忘记,需要记下来
C 有意义的组合(如MySQL_2024) 相对好记,有一定复杂度 如果规则被猜到仍有风险

我的选择:我选方案 ___ ,我的密码是:________________________(写在纸上保存好)


# ■ 展示区

# 展示内容清单

  • [ ] MySQL Server安装完成截图(显示Configuration Complete)
  • [ ] MySQL Workbench安装完成截图(显示Setup Complete)
  • [ ] Workbench连接成功截图(显示Connected,能看到数据库列表)
  • [ ] 安装问题及解决方法记录表(全组合计)
  • [ ] Workbench界面功能说明(标注各区域名称)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
安装是否全部成功? ___/10 ___/10 ___/10 ___/10
截图记录是否完整? ___/10 ___/10 ___/10 ___/10
问题记录是否有价值? ___/10 ___/10 ___/10 ___/10
界面说明是否准确? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:检查安装环境 【检查】

  1. 点击"此电脑" → 右键"属性",确认系统是64位Windows 10/11
  2. 打开"此电脑",确认C盘(或安装盘)有至少2GB可用空间
  3. 确认自己有管理员权限(能安装软件)

关键控制点:如不符合条件,立即告知老师,由老师协助解决

# Step 2:安装MySQL Server 【执行】

详细步骤(一步一步跟着做)

  1. 打开教师提供的安装包文件夹,找到 mysql-installer-community-x.x.x.x.msi 文件
  2. 双击运行安装程序
  3. 在"Choosing a Setup Type"页面:
    • 选择 "Server only"
    • 点击 "Next"
  4. 在"Installation"页面:
    • 点击 "Execute" 开始安装
    • 等待安装完成(进度条走到100%)
    • 点击 "Next"
  5. 在"Product Configuration"页面:
    • 点击 "Next" 进入配置
  6. 在"Type and Networking"页面:
    • Config Type 选择 "Development Computer"
    • 其他保持默认
    • 点击 "Next"
  7. 在"Authentication Method"页面:
    • 选择 "Use Strong Password Encryption"
    • 点击 "Next"
  8. 在"Accounts and Roles"页面:
    • 设置root密码:在"MySQL Root Password"框中输入密码
    • 重复密码:在"Repeat Password"框中再输入一次
    • ⚠️ 务必把密码写在纸上,不要遗忘!
    • 点击 "Next"
  9. 在"Windows Service"页面:
    • 保持默认(Configure MySQL Server as a Windows Service)
    • 点击 "Next"
  10. 在"Apply Configuration"页面:
    • 点击 "Execute" 应用配置
    • 等待所有项目显示绿色对勾 ✓
    • 点击 "Finish"
  11. 在"Product Configuration"完成页面:
    • 点击 "Next""Finish"

记录员在此截图:安装完成页面(显示Configuration Complete)

关键控制点:root密码必须设置且要记住;配置执行时必须全部显示绿色对勾;如有红色错误,截图保存并询问老师

# Step 3:安装MySQL Workbench 【执行】

  1. 打开教师提供的安装包文件夹,找到 mysql-workbench-community-x.x.x.x-winx64.msi 文件
  2. 双击运行安装程序
  3. 在欢迎页面点击 "Next"
  4. 在"Setup Type"页面选择 "Complete"
  5. 点击 "Install" 开始安装
  6. 等待安装完成
  7. 点击 "Finish"

记录员在此截图:Workbench安装完成界面

关键控制点:安装路径保持默认即可;如有"是否安装Visual C++运行库"的提示,点击"是/安装"

# Step 4:启动MySQL Workbench并创建连接 【执行】

  1. 点击桌面左下角"开始"按钮,搜索 "MySQL Workbench"
  2. 点击打开MySQL Workbench
  3. 在欢迎界面,点击 "+" 按钮(新建连接),或点击"MySQL Connections"旁边的"+"
  4. 在"Setup New Connection"对话框中:
    • Connection Name:输入 Localhost_Library(或任意名字)
    • Connection Method:保持默认 Standard (TCP/IP)
    • Hostname:保持默认 127.0.0.1
    • Port:保持默认 3306
    • Username:输入 root
  5. 点击 "Test Connection"(测试连接)
  6. 在弹出的密码框中输入Step 2设置的root密码
  7. 如果显示 "Successfully made the MySQL connection",点击"OK"
  8. 点击 "OK" 保存连接

记录员在此截图:显示"Successfully made the MySQL connection"的弹窗

关键控制点:密码输入正确;如显示连接失败,检查MySQL服务是否启动(见Step 5)

# Step 5:(如连接失败)检查MySQL服务 【检查】

  1. 按下 Win + R 键,输入 services.msc,按回车
  2. 在服务列表中找到 "MySQL80"(或类似名称)
  3. 确认"状态"列显示 "正在运行"
  4. 如果没有运行:
    • 右键点击"MySQL80"
    • 选择 "启动"
  5. 返回Workbench重新测试连接

关键控制点:MySQL服务必须处于"正在运行"状态,Workbench才能连接;如果服务启动失败,截图错误信息问老师

# Step 6:认识Workbench界面 【执行】

  1. 双击刚刚创建的连接 Localhost_Library
  2. 输入root密码,进入主界面
  3. 记录员对照下图标注各区域名称:

MySQL Workbench主界面区域说明

┌─────────────────────────────────────────────────────────────┐
│  菜单栏(File / Edit / View...)                              │
├──────────────────┬──────────────────────────────────────────┤
│                  │                                          │
│  导航面板         │         SQL编辑区(写SQL语句的地方)         │
│  (Navigator)     │                                          │
│                  │                                          │
│  ┌───────────┐   │  ┌─────────────────────────────────────┐  │
│  │ SCHEMAS   │   │  │  在此输入SQL命令...                  │  │
│  │ ▼         │   │  │  SELECT * FROM ...;                  │  │
│  │ □ library │   │  │                                      │  │
│  │ □ mysql   │   │  └─────────────────────────────────────┘  │
│  │ □ sys     │   │                                          │
│  └───────────┘   ├──────────────────────────────────────────┤
│                  │         结果区(显示查询结果)              │
│                  │                                          │
│                  │  ┌──────────┬──────────┬──────────┐       │
│                  │  │ 列1      │ 列2      │ 列3      │       │
│                  │  ├──────────┼──────────┼──────────┤       │
│                  │  │ 数据     │ 数据     │ 数据     │       │
│                  │  └──────────┴──────────┴──────────┘       │
│                  │                                          │
└──────────────────┴──────────────────────────────────────────┘
  1. 在界面中找到并填写:
    • SQL编辑区在界面的 ______ 方
    • 数据库列表(SCHEMAS)在界面的 ______ 方
    • 执行SQL的按钮(闪电图标)在 ______ 位置

关键控制点:每人都要能在界面上指出SQL编辑区和结果区;这是后续所有任务的操作基础


# ■ 成果提交区

# 交付物清单

  • [ ] MySQL Server安装关键步骤截图(至少3张:选安装类型页、设密码页、配置完成页)
  • [ ] MySQL Workbench安装完成截图
  • [ ] Workbench连接成功截图(显示"Successfully made the MySQL connection")
  • [ ] Workbench主界面截图(已连接状态,能看到左侧SCHEMAS列表)
  • [ ] 安装问题及解决方法记录表(全组合计,没有写"无")

# 格式要求

  1. 所有截图放入一个Word文档,文件名:任务3-1_第X组_MySQL安装
  2. 每张截图下方用文字说明这是哪一步的截图
  3. 截图清晰,关键信息可见(如密码处可打码,但其他信息要清楚)
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出MySQL Server和Workbench的区别 ___ ______
K2 制定计划 我能按步骤完成安装,不跳过步骤 ___ ______
K6 使用工具 我能独立安装软件并成功连接数据库 ___ ______
K7 排除故障 遇到连接失败时,我能检查服务状态 ___ ______
K8 反思改进 我能记录安装问题及解决方法 ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
Server安装(20分) 按步骤完成,配置全部绿色通过 基本按步骤完成,有小问题但解决 安装完成但配置有警告 安装失败或未安装
Workbench安装(20分) 成功安装,能正常启动 安装成功 安装成功但启动异常 安装失败
连接测试(25分) 一次成功连接,截图完整 尝试多次后成功 在帮助下成功连接 无法连接
界面认识(20分) 能准确说出各区域名称和功能 基本能指出主要区域 能指出SQL编辑区 不熟悉界面
问题记录(15分) 详细记录问题及解决方法 记录了主要问题 有简单记录 无记录

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
Server安装 ___ 20% ___
Workbench安装 ___ 20% ___
连接测试 ___ 25% ___
界面认识 ___ 20% ___
问题记录 ___ 15% ___
最终得分 100% ___

# 五、个人改进计划

  1. 安装过程中我遇到的最大的问题是:________________________,解决方法是:________________________

  2. 我设置的root密码保存在:________________________,我觉得保管密码的最好方法是:________________________

  3. 如果下次帮别人安装MySQL,我会特别注意提醒他/她:________________________


# ■ 理论注解 ★(可选阅读)

为什么数据库要装"服务器"?

你可能觉得奇怪:我只是想在电脑上存点数据,为什么要装一个"服务器"?

其实MySQL Server就像一个"24小时营业的数据仓库管理员"。即使你没有打开Workbench,它也在后台运行,随时准备接收你的指令。它的好处是:

  • 多用户共享:多个同学可以同时连接同一个MySQL服务器,共用数据
  • 数据安全:它有专门的机制保证数据不丢失、不冲突
  • 远程访问:如果你的MySQL装在学校服务器上,你在家里也能连上去操作

而MySQL Workbench只是一个"操作界面",类似于Word和打印机的关系——Word是你打字的界面,打印机才是真正出纸的设备。你可以换用其他工具(比如Navicat、DataGrip)来操作MySQL,但MySQL Server是核心,不能换。



# 【任务3-2】创建数据库——认识存储引擎 【C→T】


# ■ 任务呈现区

情境

MySQL安装好了,Workbench也能连上了。现在你面前是一个"空的数据库服务器"——就像一个刚盖好的空仓库,里面什么都没有。

要做图书馆管理系统,第一步是在这个空仓库里"隔出一个区域"专门放图书馆的数据。这个区域就叫"数据库"(Database)。今天你们要创建一个名叫 library 的数据库,还要了解MySQL存数据的两种"引擎"——InnoDB和MyISAM。

存储引擎就像仓库里的"货架系统",不同的货架适合放不同的东西。了解它们的特点,以后才能做出正确的选择。

学习目标

  1. 能使用 CREATE DATABASE 语句创建数据库
  2. 能使用 SHOW DATABASESUSE 命令查看和切换数据库
  3. 能说出InnoDB和MyISAM两种存储引擎的主要区别(至少2点)
  4. 能截图证明成功创建了library数据库

核心输出物

  • [ ] SQL命令执行截图(CREATE DATABASE、SHOW DATABASES、USE)
  • [ ] 存储引擎对比表格(填写InnoDB vs MyISAM的区别)
  • [ ] 查看默认存储引擎的截图
  • [ ] "我的数据库"自查清单(确认library数据库存在且可用)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据库创建与管理 → DDL基础操作(CREATE/DROP/SHOW/USE) 行动维度:SQL命令执行与验证(输入命令→执行→观察结果→截图记录) 需求维度:为图书馆管理系统建立独立的数据存储空间,理解底层存储机制 向上穿透:基于任务3-1成功安装的MySQL环境;创建的library数据库为任务3-3创建数据表、任务3-4添加约束提供操作对象;存储引擎知识为后续选择表引擎提供依据


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配;SQL操作每人需在电脑上独立完成

角色 职责 姓名
组长 统筹协调、组织讨论存储引擎特点、代表小组发言 ______
操作员 在电脑上执行SQL命令,截屏记录结果 ______
记录员 记录SQL命令和输出结果、整理存储引擎对比表 ______
复核员 检查SQL语法是否正确、截图是否完整 ______

轮换规则

  • 任务3-2 → 任务3-3:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、什么是数据库(Database)?

类比 解释
文件夹 Windows里的文件夹用来分类存放文件
数据库 MySQL里的"文件夹",用来分类存放数据表
学校 一个学校有多个院系(数据库),每个院系有多个班级(数据表)

💡 一句话:数据库是"表的集合",创建数据库就是"新建一个文件夹来放表"。

# 二、本任务要用到的4条SQL命令

命令 作用 示例
CREATE DATABASE 创建新数据库 CREATE DATABASE library;
SHOW DATABASES 查看所有数据库 SHOW DATABASES;
USE 切换到某个数据库 USE library;
DROP DATABASE 删除数据库(⚠️慎用!) DROP DATABASE test;

# 三、存储引擎是什么?

存储引擎是MySQL存数据的"底层技术"。就像同样是保存文件,你可以存到机械硬盘、固态硬盘或U盘,特点不同。

特性 InnoDB MyISAM
是否支持事务 ✅ 支持(数据操作可以"反悔") ❌ 不支持
是否支持外键 ✅ 支持(表之间可以建立关联) ❌ 不支持
崩溃恢复 ✅ 好(宕机后数据不易丢失) ❌ 差
读速度 ⚡ 更快
写速度 ⚡ 更快
锁的粒度 行锁(只锁一行,其他人可操作其他行) 表锁(锁整张表)
适用场景 需要事务、外键的业务系统(推荐!) 只读或读多写少的场景

💡 高职简化版记忆口诀

  • InnoDB = "新版的、功能全的、最常用"(MySQL 5.5之后的默认引擎)
  • MyISAM = "老版的、读快写慢、很少用"
  • 结论:做图书馆系统,选 InnoDB

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:学习基础SQL命令 30分钟 学习CREATE/SHOW/USE/DROP,在纸上默写一遍 SQL命令默写
子目标2:创建library数据库 30分钟 在Workbench中执行CREATE DATABASE,截图验证 创建成功截图
子目标3:学习存储引擎 30分钟 对比InnoDB和MyISAM,填写对比表 存储引擎对比表
子目标4:查看默认引擎 30分钟 执行SHOW ENGINES,确认默认引擎是InnoDB 引擎列表截图

# 行动方案

  1. 命令学习(20分钟):全组学习4条SQL命令,每人默写一遍
  2. 创建数据库(30分钟):操作员在Workbench中执行,记录员截图
  3. 引擎学习(30分钟):全组讨论InnoDB和MyISAM的区别,填写对比表
  4. 验证练习(40分钟):每人独立执行SHOW/USE命令,熟悉数据库切换
  5. 展示交流(40分钟):各组展示存储引擎对比表,讨论为什么选InnoDB

# ■ 决策区

# 决策点:图书馆管理系统应该选择哪种存储引擎?

方案 引擎 理由 是否适合图书馆系统?
A InnoDB 支持事务(借书还书操作需要保证数据一致)、支持外键(图书和借阅记录需要关联) ___
B MyISAM 读速度快,查询图书信息快 ___
C 图书表用MyISAM,借阅记录表用InnoDB 各取所长 ___

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] SQL命令默写(展示对CREATE/SHOW/USE的掌握)
  • [ ] library数据库创建成功截图(SHOW DATABASES结果中包含library)
  • [ ] 存储引擎对比表(展示InnoDB和MyISAM至少5个方面的区别)
  • [ ] 默认引擎查看截图(SHOW ENGINES结果)
  • [ ] 小组选择引擎的理由说明

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
SQL命令是否正确? ___/10 ___/10 ___/10 ___/10
截图是否完整清晰? ___/10 ___/10 ___/10 ___/10
引擎对比是否全面? ___/10 ___/10 ___/10 ___/10
选择理由是否充分? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:学习SQL命令并默写 【执行】

  1. 全组一起朗读以下SQL命令模板,理解每个词的意思:
-- 创建数据库
CREATE DATABASE library;

-- 查看所有数据库
SHOW DATABASES;

-- 使用(切换)到某个数据库
USE library;

-- 删除数据库(⚠️ 删除后数据就没了!本任务不需要执行这条)
DROP DATABASE library;
  1. 每人独立在纸上填写默写:
中文意思 英文SQL命令
创建数据库,名字叫library _________________________________
查看当前有哪些数据库 _________________________________
切换到library数据库 _________________________________
删除library数据库 _________________________________
  1. 组长检查全组默写正确率,必须100%正确

关键控制点:SQL命令必须以分号 ; 结尾;数据库名不区分大小写但建议小写

# Step 2:打开Workbench并连接 【执行】

  1. 打开MySQL Workbench
  2. 双击任务3-1创建的连接(如 Localhost_Library
  3. 输入root密码,进入主界面
  4. 确认左侧导航面板能看到 SCHEMAS 区域

关键控制点:如无法连接,先检查MySQL服务是否运行(任务3-1 Step 5的方法)

# Step 3:创建library数据库 【执行】

  1. 在SQL编辑区(中间的大白框)中输入以下命令:
CREATE DATABASE library;
  1. 点击工具栏上的 闪电图标(或按 Ctrl + Enter)执行SQL
  2. 观察下方结果区:
    • 如果显示 Query OK, 1 row affected,表示创建成功 ✅
    • 如果显示红色错误信息,截图保存
  3. 记录员截图:SQL编辑区+结果区,显示Query OK

关键控制点:命令末尾必须有分号;如果提示"database already exists",说明已存在,可以先用DROP DATABASE library;删除再重建,或用CREATE DATABASE IF NOT EXISTS library;

# Step 4:查看数据库列表 【执行】

  1. 在SQL编辑区输入:
SHOW DATABASES;
  1. 点击闪电图标执行

  2. 观察结果区,确认列表中包含:

    • information_schema
    • library ← 你刚创建的!
    • mysql
    • performance_schema
    • sys
  3. 记录员截图:结果区显示包含library的列表

关键控制点:系统自带的数据库(mysql、sys等)不要删除;只操作自己创建的library数据库

# Step 5:切换到library数据库 【执行】

  1. 在SQL编辑区输入:
USE library;
  1. 点击闪电图标执行

  2. 观察结果区,显示 Database changed

  3. 注意Workbench界面的变化:

    • 标题栏或状态栏可能显示当前数据库是 library
    • 左侧SCHEMAS下,library 可能会展开或高亮
  4. 记录员截图:显示 Database changed 的结果区

关键控制点:执行建表语句前,务必先执行 USE library; 切换到正确数据库;否则表可能建到别的数据库里

# Step 6:学习并查看存储引擎 【执行】

  1. 全组阅读"知识准备区"的存储引擎对比表
  2. 在SQL编辑区输入以下命令查看MySQL支持的所有引擎:
SHOW ENGINES;
  1. 点击执行,观察结果区的表格

  2. 找到 InnoDB 行,确认 Support 列显示 DEFAULTYES

  3. 记录员截图:SHOW ENGINES结果,圈出InnoDB行

关键控制点:InnoDB必须是可用状态;MySQL 8.0默认引擎就是InnoDB,一般无需修改

# Step 7:填写存储引擎对比表 【执行】

  1. 记录员在Word中填写以下对比表:

InnoDB vs MyISAM 对比表(根据执行结果和知识准备填写)

对比项 InnoDB MyISAM 对图书馆系统重要吗?
事务支持 ______ ______ ___
外键支持 ______ ______ ___
默认引擎(MySQL 8.0) ______ ______ ___
崩溃恢复能力 ______ ______ ___
锁的粒度 ______ ______ ___
适用场景 ______ ______
  1. 全组讨论并确定:图书馆系统选哪种引擎?

我们的选择:________________________

选择理由:________________________

关键控制点:图书馆系统涉及借书还书(需要事务保证数据一致)和表间关联(需要外键),必须选择InnoDB


# ■ 成果提交区

# 交付物清单

  • [ ] SQL命令默写表(手写或Word)
  • [ ] CREATE DATABASE执行成功截图(显示Query OK)
  • [ ] SHOW DATABASES结果截图(列表中包含library)
  • [ ] USE library执行成功截图(显示Database changed)
  • [ ] SHOW ENGINES结果截图(圈出InnoDB行)
  • [ ] 存储引擎对比表(Word表格,已填写完整)
  • [ ] 引擎选择说明(Word,不少于100字)

# 格式要求

  1. 所有截图放入一个Word文档,文件名:任务3-2_第X组_创建数据库
  2. 每张截图下方标注执行的SQL命令
  3. 截图包含SQL编辑区和结果区,能看清命令和输出
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出数据库、数据表、存储引擎的关系 ___ ______
K3 获取信息 我能通过SHOW命令获取数据库和引擎信息 ___ ______
K4 分析加工 我能对比InnoDB和MyISAM并做出选择 ___ ______
K6 使用工具 我能熟练使用Workbench执行SQL命令 ___ ______
K8 反思改进 我能说出为什么图书馆系统选InnoDB ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
SQL命令掌握(20分) 默写全对,能解释每个命令含义 默写基本正确 有1-2处错误 多处错误或不理解
数据库创建(20分) 成功创建,截图完整 成功创建 创建成功但截图不全 创建失败
命令执行(20分) SHOW/USE命令执行正确,结果理解 基本正确 在帮助下完成 无法执行
引擎对比(25分) 对比项≥5个,分析深入 对比项4-5个 对比项2-3个 对比混乱
团队协作(15分) 分工明确,全员参与 分工较明确 有分工,部分参与少 分工混乱

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
SQL命令掌握 ___ 20% ___
数据库创建 ___ 20% ___
命令执行 ___ 20% ___
引擎对比 ___ 25% ___
团队协作 ___ 15% ___
最终得分 100% ___

# 五、个人改进计划

  1. SQL命令中,我最容易忘记的是 ______ ,改进方法是 ________________________

  2. 关于存储引擎,我之前不知道的常识是:________________________

  3. 下次执行SQL前,我会先确认:当前是否在 ______ 数据库中,方法是执行 ______ 命令。


# ■ 理论注解 ★(可选阅读)

什么是事务?为什么InnoDB更重要?

想象这样一个场景:张三借了一本书,系统需要同时做两件事:

  1. 在借阅记录表添加一条记录
  2. 把图书表里的"是否可借"状态改成"已借出"

如果这两件事只做了一半(添加了借阅记录,但图书状态没改),就会出现"书记录借出去了但实际书还在架上"的混乱。

事务就是保证"要么两件事都做成功,要么都不做"的机制。InnoDB支持事务,MyISAM不支持。这就是为什么做业务系统(如图书馆系统)必须选InnoDB。

MySQL 5.5之前默认引擎是MyISAM,之后改成了InnoDB。现在你去查MySQL官方文档,他们会直接告诉你:InnoDB是通用首选引擎。除非你有特殊需求(比如只读的数据仓库),否则不用考虑MyISAM。



# 【任务3-3】创建数据表——字段类型与表结构 【C→T】


# ■ 任务呈现区

情境

上一节课,你们已经在MySQL里创建了 library 数据库。现在仓库的"区域"隔好了,接下来要在这个区域里"搭货架"——也就是创建数据表。

设计表就像设计Excel表格:每列叫什么名、存什么类型的数据、能不能为空、有没有默认值……这些都要定好规矩。如果设计不好,以后存数据就会出问题(比如把日期存成了文字,把价格存成了整数)。

今天你们的任务是先学习MySQL的常用数据类型,然后创建第一张表——图书表(books)。

学习目标

  1. 能说出至少5种MySQL常用数据类型的名称和用途
  2. 能解释字段属性 NULL/NOT NULL、DEFAULT、AUTO_INCREMENT、COMMENT 的含义
  3. 能使用 CREATE TABLE 语句创建数据表(使用模板填空)
  4. 能为图书表设计合理的字段类型和属性

核心输出物

  • [ ] 数据类型学习笔记(常用类型对照表)
  • [ ] 图书表(books)的字段设计表(含字段名、类型、属性说明)
  • [ ] CREATE TABLE执行成功截图(显示Query OK)
  • [ ] DESCRIBE books结果截图(展示表结构)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据表创建 → DDL操作(CREATE TABLE)与数据类型选择 行动维度:表结构设计(确定字段→选择类型→设置属性→执行建表) 需求维度:根据业务需求(图书信息)为library数据库建立物理存储结构 向上穿透:基于任务2-3设计的关系表结构确定字段;基于任务3-2创建的library数据库;为任务3-4添加完整性约束提供表对象;为后续INSERT/SELECT操作提供数据容器


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配

角色 职责 姓名
组长 统筹协调、组织字段设计讨论、代表小组发言 ______
操作员 在Workbench中执行CREATE TABLE语句、截图 ______
记录员 记录字段设计决策、整理数据类型对照表 ______
复核员 检查字段类型是否合理、SQL语法是否正确 ______

轮换规则

  • 任务3-3 → 任务3-4:组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、MySQL常用数据类型速查表

数据类型 写法 存什么 例子 注意
整数 INT 整数(没有小数) 100、-5、0 价格不要用INT,会丢失小数
小数 DECIMAL(10,2) 带小数点的数 99.50、15.00 10是总位数,2是小数位
字符串 VARCHAR(50) 文字(长度可变) "数据库原理" 括号里是最大长度
日期 DATE 年月日 '2024-03-01' 格式:YYYY-MM-DD
日期时间 DATETIME 年月日时分秒 '2024-03-01 14:30:00' 格式:YYYY-MM-DD HH:MM:SS
文本 TEXT 长文字(文章、备注) 图书简介 长度不限

# 二、字段属性(给字段加"规矩")

属性 写法 含义 例子
非空 NOT NULL 这个字段必须有值,不能空着 书名不能空
可空 NULL(或不写) 这个字段可以没有值 图书简介可以空
默认值 DEFAULT '值' 不填时自动填这个值 状态默认'可借'
自增 AUTO_INCREMENT 自动编号,每次+1 图书编号自动增长
注释 COMMENT '说明' 给字段加中文说明 方便以后看懂

# 三、CREATE TABLE语句结构(模板)

CREATE TABLE 表名 (
    字段名1  数据类型  [属性],
    字段名2  数据类型  [属性],
    字段名3  数据类型  [属性],
    ...
);

一个完整的例子

CREATE TABLE students (
    student_id   INT           AUTO_INCREMENT  COMMENT '学号',
    name         VARCHAR(50)   NOT NULL        COMMENT '姓名',
    gender       VARCHAR(10)   DEFAULT '男'    COMMENT '性别',
    birth_date   DATE          NULL            COMMENT '出生日期',
    PRIMARY KEY (student_id)
);

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:学习数据类型 30分钟 学习6种常用数据类型,完成匹配练习 数据类型练习
子目标2:学习字段属性 30分钟 学习5种字段属性,能说出何时使用 字段属性笔记
子目标3:设计图书表字段 30分钟 根据需求确定books表的字段、类型、属性 字段设计表
子目标4:创建图书表 30分钟 在Workbench中执行CREATE TABLE,验证成功 建表成功截图
子目标5:查看表结构 30分钟 使用DESCRIBE查看表结构,确认无误 表结构截图

# 行动方案

  1. 类型学习(25分钟):全组学习数据类型,完成"什么数据用什么类型"匹配练习
  2. 属性学习(25分钟):讨论每个属性什么时候用,记录员整理笔记
  3. 字段设计(30分钟):全组讨论确定图书表字段,操作员起草SQL
  4. 建表执行(30分钟):在Workbench中执行,解决语法错误
  5. 验证完善(30分钟):DESCRIBE查看结构,如有问题修改重建
  6. 展示交流(20分钟):各组展示字段设计,讨论优缺点

# ■ 决策区

# 决策点1:图书编号用INT还是VARCHAR?

方案 类型 优点 缺点
A INT + AUTO_INCREMENT 自动编号,不会重复,省空间 编号是纯数字,如1, 2, 3
B VARCHAR(20) 可以包含字母和数字,如BK001、BK002 需要手动编号或写程序生成,容易重复
C INT(不用自增) 手动输入纯数字编号 容易出错,可能重复

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:图书价格用什么类型?

方案 类型 优点 缺点
A INT 简单 不能存小数,59.5元变成59或60
B DECIMAL(10,2) 精确存小数,适合金额 稍微复杂一点
C FLOAT 能存小数 有精度误差,金额计算可能差一分钱

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] 数据类型匹配练习答案(展示对6种类型的理解)
  • [ ] 图书表字段设计表(展示每个字段的类型选择理由)
  • [ ] CREATE TABLE语句(展示完整SQL)
  • [ ] 建表成功截图(Query OK)
  • [ ] DESCRIBE结果截图(验证表结构)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
字段设计是否合理? ___/10 ___/10 ___/10 ___/10
数据类型选择是否正确? ___/10 ___/10 ___/10 ___/10
SQL语句是否正确? ___/10 ___/10 ___/10 ___/10
截图是否完整? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:数据类型匹配练习 【执行】

  1. 全组讨论,将左侧的数据与右侧的类型连线:
数据示例 应该用什么类型?
图书价格 59.80元 ______
学生学号 2023001 ______
出生日期 2005-08-15 ______
图书书名 "数据库原理" ______
图书简介(500字) ______
借书时间 2024-03-01 14:30:00 ______
  1. 组长检查,讨论有争议的选择

关键控制点:价格必须用DECIMAL,不能用INT或FLOAT;大段文字用TEXT,不用VARCHAR

# Step 2:学习字段属性 【执行】

  1. 全组阅读"知识准备区"的字段属性表
  2. 讨论以下场景应该用什么属性:
场景 应该用什么属性? 为什么?
图书编号,系统自动生成 ______ ______
书名,必须填写 ______ ______
图书简介,可以不写 ______ ______
图书状态,默认是"可借" ______ ______

关键控制点:NOT NULL和DEFAULT可以同时使用;AUTO_INCREMENT只能用于整数类型且通常是主键

# Step 3:设计图书表(books)字段 【执行】

  1. 全组回顾任务2-3中设计的图书表结构
  2. 为每个字段选择合适的数据类型和属性,填入下表:

图书表(books)字段设计表

序号 字段名(英文) 字段名(中文) 数据类型 长度/精度 是否可空 默认值 是否自增 注释
1 book_id 图书编号 INT NO YES 主键,自动编号
2 title 书名 VARCHAR (____) NO NO 图书名称
3 author 作者 VARCHAR (____) ___ ___ NO 作者姓名
4 publisher 出版社 VARCHAR (____) ___ ___ NO ______
5 publish_date 出版日期 DATE ___ ___ NO ______
6 price 价格 DECIMAL (____) ___ ___ NO 单位:元
7 isbn ISBN号 VARCHAR (____) ___ ___ NO 国际标准书号
8 category 分类 VARCHAR (____) ___ ___ NO 如:计算机、文学
9 status 状态 VARCHAR (____) ___ '____' NO 可借/已借出
10 ______ ______ ______ ______ ___ ___ ___ ______
  1. 复核员检查:
    • [ ] 每个字段都有中文注释
    • [ ] 主键已确定且为自增
    • [ ] 价格使用DECIMAL类型
    • [ ] 必填字段标记为NOT NULL

关键控制点:字段名用英文小写+下划线;ISBN号用VARCHAR(因为ISBN含横杠);price用DECIMAL(10,2)

# Step 4:编写CREATE TABLE语句(填空模板) 【执行】

  1. 操作员根据字段设计表,在Word中填写以下SQL模板:
USE library;

CREATE TABLE books (
    book_id       INT           AUTO_INCREMENT COMMENT '图书编号',
    title         VARCHAR(___)  NOT NULL       COMMENT '书名',
    author        VARCHAR(___)  ______         COMMENT '作者',
    publisher     VARCHAR(___)  ______         COMMENT '出版社',
    publish_date  DATE          ______         COMMENT '出版日期',
    price         DECIMAL(___,___) ______      COMMENT '价格',
    isbn          VARCHAR(___)  ______         COMMENT 'ISBN号',
    category      VARCHAR(___)  ______         COMMENT '分类',
    status        VARCHAR(___)  DEFAULT '___'  COMMENT '状态',
    
    PRIMARY KEY (__________)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COMMENT = '图书信息表';
  1. 将填空完成后的完整SQL复制到Workbench的SQL编辑区

关键控制点:ENGINE必须写InnoDB;CHARSET写utf8mb4(支持中文);每行末尾有逗号,最后一行没有逗号

# Step 5:执行建表语句 【执行】

  1. 确认SQL编辑区中的命令正确
  2. 点击 闪电图标 执行
  3. 观察结果区:
    • 如果显示 Query OK, 0 rows affected,表示建表成功 ✅
    • 如果显示红色错误,根据错误提示修改SQL

常见错误及解决方法

错误提示 原因 解决方法
ERROR 1046: No database selected 没执行USE library 先执行 USE library;
ERROR 1050: Table already exists 表已存在 先执行 DROP TABLE books; 或换表名
ERROR 1064: Syntax error SQL语法错误 检查逗号、括号、引号是否成对
  1. 记录员截图:SQL编辑区+显示Query OK的结果区

关键控制点:执行前务必确认当前数据库是library;如表已存在,可用DROP TABLE IF EXISTS books;先删除再重建

# Step 6:查看表结构 【执行】

  1. 在SQL编辑区输入以下命令查看表结构:
DESCRIBE books;
-- 或者简写:
DESC books;
  1. 点击执行,观察结果区显示的表格:

    • Field列:字段名
    • Type列:数据类型
    • Null列:是否可为空(YES/NO)
    • Key列:是否是主键(PRI)
    • Default列:默认值
    • Extra列:额外信息(如auto_increment)
  2. 核对检查表

    • [ ] book_id 的 Key 列显示 PRI
    • [ ] book_id 的 Extra 列显示 auto_increment
    • [ ] title 的 Null 列显示 NO
    • [ ] status 的 Default 列显示 '可借'
    • [ ] price 的 Type 列显示 decimal(10,2)
  3. 记录员截图:DESCRIBE结果

关键控制点:DESCRIBE结果是验证表结构是否正确的唯一标准;如有不符,用DROP TABLE删除重建

# Step 7:(拓展)尝试插入一条测试数据 【执行】

  1. 执行以下INSERT语句,验证表是否可用:
INSERT INTO books (title, author, publisher, publish_date, price, isbn, category, status)
VALUES ('数据库原理与应用', '李明', '清华大学出版社', '2023-06-01', 59.80, '978-7-302-12345-6', '计算机', '可借');
  1. 执行后如显示 Query OK, 1 row affected,表示插入成功
  2. 查询验证:
SELECT * FROM books;
  1. 记录员截图:SELECT查询结果,能看到刚才插入的数据

关键控制点:INSERT时不需要给book_id赋值(它会自增);字符串值用单引号包裹;日期格式是'YYYY-MM-DD'


# ■ 成果提交区

# 交付物清单

  • [ ] 数据类型匹配练习(连线或表格,已填写)
  • [ ] 图书表字段设计表(Word表格,含类型、属性决策)
  • [ ] CREATE TABLE完整SQL语句(Word文档)
  • [ ] 建表成功截图(显示Query OK, 0 rows affected)
  • [ ] DESCRIBE books结果截图(验证字段结构)
  • [ ] 测试数据插入及查询截图(展示SELECT结果)

# 格式要求

  1. 所有文档文件名格式:任务3-3_第X组_创建数据表
  2. SQL语句放入Word时用等宽字体(Courier New或Consolas)
  3. 截图包含SQL编辑区和结果区
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出CREATE TABLE语句的基本结构 ___ ______
K3 获取信息 我能根据业务需求选择合适的数据类型 ___ ______
K4 分析加工 我能为每个字段确定合适的属性(NULL/NOT NULL等) ___ ______
K6 使用工具 我能用Workbench成功创建数据表并验证 ___ ______
K8 反思改进 我能说出如果类型选错会导致什么问题 ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
数据类型理解(20分) 练习全对,能解释选择理由 练习基本正确 有1-2处错误 多处错误
字段设计(20分) 字段完整,类型选择合理,属性恰当 字段较完整 字段有遗漏或类型不当 设计混乱
SQL语句(20分) 语法正确,成功执行,格式规范 有小错误但能执行 在帮助下执行成功 无法执行
表结构验证(20分) DESCRIBE结果与设计完全一致 基本一致 有小偏差 偏差大
团队协作(20分) 分工明确,全员参与 分工较明确 有分工,部分参与少 分工混乱

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
数据类型理解 ___ 20% ___
字段设计 ___ 20% ___
SQL语句 ___ 20% ___
表结构验证 ___ 20% ___
团队协作 ___ 20% ___
最终得分 100% ___

# 五、个人改进计划

  1. 设计字段时,我之前没考虑到 ______ 字段,下次我会先 ______ 再开始设计。

  2. 如果price用INT类型,会导致的问题是:________________________

  3. AUTO_INCREMENT适合用在 ______ 类型的字段上,并且通常是 ______ 键。


# ■ 理论注解 ★(可选阅读)

为什么价格不能用FLOAT?

计算机存储小数时,有些数字无法精确表示。比如0.1在计算机内部其实是0.10000000000000000555...这样的近似值。

如果你用FLOAT存价格,59.80元+20.20元,结果可能不是正好80.00元,而是79.9999999元。这在财务系统中是绝对不允许的。

DECIMAL类型的设计就是为了解决这个问题。它用"字符串"的方式存储数字,确保每一位都是精确的。所以凡是涉及金额、价格、工资等,都请用DECIMAL,不要用FLOAT或DOUBLE。

另外,utf8mb4是MySQL推荐的中文编码。早期用utf8,但utf8不支持Emoji等特殊字符。utf8mb4是真正的UTF-8完整实现,所以建议新建表时都加上 DEFAULT CHARSET = utf8mb4



# 【任务3-4】给表定规矩——完整性约束 【C→T】


# ■ 任务呈现区

情境

上一节课,你们已经成功创建了图书表(books)。但是——如果有人在录入图书信息时,把价格填成了负数怎么办?如果两本书的ISBN号一模一样怎么办?如果借书记录里填了一个不存在的读者编号怎么办?

这些问题,要靠数据库的"规矩"来解决——这就是完整性约束。约束就像学校的校规:不能迟到、不能作弊、不能旷课。数据库的约束就是:不能填负数价格、不能有重复的ISBN、不能引用不存在的读者。

今天你们要为图书馆管理系统的3张表(图书表、读者表、借阅记录表)添加完整的约束,让数据从"随便填"变成"规范填"。

学习目标

  1. 能说出至少5种完整性约束的名称和作用
  2. 能解释外键约束的"父子关系"类比
  3. 能为图书表、读者表、借阅记录表添加完整的约束(使用SQL模板填空)
  4. 能测试约束是否生效(如尝试插入违规数据,观察报错)

核心输出物

  • [ ] 5种约束概念理解表(用通俗语言解释)
  • [ ] 3张表的完整CREATE TABLE语句(含所有约束)
  • [ ] 约束生效测试截图(插入违规数据时的报错信息)
  • [ ] 外键关系图(展示3张表之间的父子关系)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注 内容维度:数据完整性控制 → 实体完整性、参照完整性、用户定义完整性 行动维度:约束设计与实施(理解约束类型→确定约束规则→编写带约束的SQL→测试验证) 需求维度:保证图书馆数据的正确性、一致性和关联有效性 向上穿透:基于任务3-3创建的books表添加更多约束;基于任务2-3设计的3张表结构;为后续INSERT/UPDATE/DELETE操作提供数据质量保障


# ■ 分组与角色分配

分组原则:4人/组,按座位就近组合,异质搭配

角色 职责 姓名
组长 统筹协调、组织约束设计讨论、代表小组发言 ______
操作员 在Workbench中执行带约束的CREATE TABLE语句 ______
记录员 记录约束设计决策、整理5种约束说明、截图 ______
复核员 检查约束是否完整、外键关系是否正确、测试是否通过 ______

轮换规则

  • 任务3-4 → (模块四):组长→复核员,操作员→组长,记录员→操作员,复核员→记录员
  • 每次任务完成后,角色顺时针轮换1位

小组公约





# ■ 知识准备区

# 一、5种完整性约束速查表

约束名 英文 作用(通俗解释) 图书馆例子
主键约束 PRIMARY KEY 每行数据的"身份证号",唯一且不能空 图书编号不能重复,也不能空
外键约束 FOREIGN KEY "不能随便引用不存在的东西" 借阅记录里的读者编号,必须是读者表里有的
非空约束 NOT NULL "这个格子必须填,不能空着" 书名不能为空
唯一约束 UNIQUE "可以空,但填了就不能和别人一样" ISBN号不能重复(但还没录入时可以空着)
默认值 DEFAULT "不填就自动填这个" 图书状态不填就自动是"可借"
检查约束 CHECK "必须符合这个条件才能填进去" 价格必须大于0

# 二、外键的"父子关系"类比

外键是约束中最难理解的,用"父子关系"来理解:

┌─────────────────┐         ┌─────────────────┐
│    父表:读者表   │         │    父表:图书表   │
│   (readers)     │         │    (books)      │
│ ─────────────── │         │ ─────────────── │
│ PK reader_id    │         │ PK book_id      │
│    name         │         │    title        │
│    ...          │         │    ...          │
└────────┬────────┘         └────────┬────────┘
         │                           │
         │      "先有父母,后有孩子"    │
         │      (先建父表,再建子表)    │
         │      "孩子的爸妈必须真实存在"  │
         │      (外键值必须在父表存在)  │
         ↓                           ↓
      ┌─────────────────────────────────┐
      │         子表:借阅记录表          │
      │          (borrows)              │
      │  ─────────────────────────────  │
      │  PK borrow_id                   │
      │  FK reader_id → readers.reader_id│
      │  FK book_id → books.book_id     │
      │  borrow_date                    │
      └─────────────────────────────────┘

💡 父子关系口诀

  • 先创建父表(reader_id和book_id所在的表),再创建子表(含外键的表)
  • 子表里的外键值,必须是父表里已经存在的值
  • 如果要删除父表的某条记录,必须先删除子表里引用它的记录

# 三、带约束的CREATE TABLE模板

CREATE TABLE 表名 (
    字段名  类型  属性,
    
    -- 主键约束
    PRIMARY KEY (字段名),
    
    -- 外键约束
    FOREIGN KEY (本表字段) REFERENCES 父表(父表主键),
    
    -- 唯一约束
    UNIQUE (字段名),
    
    -- 检查约束(MySQL 8.0+)
    CHECK (条件表达式)
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

# ■ 计划区

# 子目标分解

子目标 时间 具体任务 交付物
子目标1:理解5种约束 30分钟 学习约束概念,用通俗语言解释,完成匹配练习 约束概念表
子目标2:理解外键父子关系 30分钟 通过类比和图示理解外键,确定3张表的父子关系 外键关系图
子目标3:创建带约束的3张表 60分钟 先建父表(读者表、图书表),再建子表(借阅记录表) 3张建表SQL+执行截图
子目标4:测试约束生效 30分钟 尝试插入违规数据,观察报错,确认约束有效 测试截图+报错记录

# 行动方案

  1. 约束学习(25分钟):全组学习5种约束,每人用自己的话解释一遍
  2. 外键理解(25分钟):画父子关系图,明确哪张是父表、哪张是子表
  3. 编写SQL(40分钟):先写读者表和图书表(父表),再写借阅记录表(子表)
  4. 执行建表(30分钟):在Workbench中执行,注意顺序:先父后子
  5. 约束测试(30分钟):尝试违反约束的操作,记录报错信息
  6. 展示交流(20分钟):展示外键关系图,分享测试中的发现

# ■ 决策区

# 决策点1:借阅记录表的联合主键怎么设计?

方案 主键设计 优点 缺点
A 单独borrow_id做主键 简单直观,每条记录有唯一编号 同一个人借同一本书会产生多条记录,需要额外逻辑处理
B (reader_id, book_id, borrow_date)联合主键 一个人同一天不能重复借同一本书 联合主键较长,借阅日期时间精度要考虑
C borrow_id做主键,另加UNIQUE(reader_id, book_id, borrow_date) 兼顾两者 稍复杂

我的选择:我选方案 ___ ,因为:______________________________

# 决策点2:如果读者表里有读者借书未还,能删除这个读者吗?

方案 做法 结果
A 直接删除 数据库报错,因为有外键约束,子表还有记录
B 先删除借阅记录,再删除读者 可以删除,但借书记录就没了
C 外键加ON DELETE CASCADE 删除读者时自动删除其所有借阅记录
D 不允许删除,只做标记(如status='已注销') 保留历史记录,推荐做法

我的选择:我选方案 ___ ,因为:______________________________


# ■ 展示区

# 展示内容清单

  • [ ] 5种约束概念理解表(用自己的话解释)
  • [ ] 3张表的父子关系图(展示外键关联)
  • [ ] 完整的3张CREATE TABLE语句(带约束)
  • [ ] 建表成功截图(3张Query OK)
  • [ ] 约束测试截图(至少2种违规操作的报错)

# 同伴互评记录表

评价项目 第1组 第2组 第3组 第4组
约束设计是否完整? ___/10 ___/10 ___/10 ___/10
外键关系是否正确? ___/10 ___/10 ___/10 ___/10
建表顺序是否正确? ___/10 ___/10 ___/10 ___/10
约束测试是否有效? ___/10 ___/10 ___/10 ___/10

我最欣赏第 ___ 组的地方:________________________________________


# ■ 执行区

# Step 1:学习约束概念并用自己的话解释 【执行】

  1. 全组阅读"知识准备区"的约束速查表
  2. 每人独立完成下表(不能抄书,用自己的大白话):
约束名 用大白话解释(给一个生活中的例子)
主键约束 就像______,因为______
外键约束 就像______,因为______
非空约束 就像______,因为______
唯一约束 就像______,因为______
检查约束 就像______,因为______
  1. 组长抽查,确保每人真正理解

关键控制点:必须能用生活例子解释外键(如"学生选课必须先有学生");不能只是背诵定义

# Step 2:确定3张表的父子关系 【执行】

  1. 全组讨论:借阅记录表引用了谁?

    • 借阅记录表里的reader_id → 必须来自 ______ 表的 ______ 字段
    • 借阅记录表里的book_id → 必须来自 ______ 表的 ______ 字段
  2. 得出结论:

    • 父表(被引用的表):______ 表、______ 表
    • 子表(含外键的表):______ 表
  3. 画出父子关系图(手绘或电脑画):

┌───────────────┐     ┌───────────────┐
│   读者表       │     │    图书表      │
│  (readers)    │     │   (books)     │
│ ───────────── │     │ ───────────── │
│ PK reader_id  │     │ PK book_id    │
└───────┬───────┘     └───────┬───────┘
        │                     │
        │    引用(外键)        │
        └──────────┬──────────┘
                   ↓
           ┌───────────────┐
           │   借阅记录表    │
           │  (borrows)    │
           │ ───────────── │
           │ PK borrow_id  │
           │ FK reader_id ─┼──→ 读者表.reader_id
           │ FK book_id ───┼──→ 图书表.book_id
           └───────────────┘

关键控制点:必须明确"先建父表,再建子表";外键字段类型必须与父表主键类型一致

# Step 3:创建读者表(readers)——父表1 【执行】

  1. 确保当前在library数据库中:
USE library;
  1. 执行以下SQL(填空模板):
CREATE TABLE readers (
    reader_id    INT          AUTO_INCREMENT COMMENT '读者编号',
    name         VARCHAR(50)  NOT NULL       COMMENT '姓名',
    gender       VARCHAR(10)  DEFAULT '男'   COMMENT '性别',
    dept         VARCHAR(50)  NOT NULL       COMMENT '院系',
    phone        VARCHAR(20)  ______         COMMENT '电话',
    email        VARCHAR(100) ______         COMMENT '邮箱',
    
    PRIMARY KEY (__________)
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='读者信息表';
  1. 点击执行,确认显示 Query OK
  2. 记录员截图:建表成功结果

关键控制点:reader_id设为自增主键;phone和email可空(不是每个人都有);先建父表再建子表

# Step 4:创建图书表(books)——父表2 【执行】

  1. 执行以下SQL(在任务3-3基础上增加约束):
CREATE TABLE books (
    book_id      INT            AUTO_INCREMENT COMMENT '图书编号',
    title        VARCHAR(100)   NOT NULL       COMMENT '书名',
    author       VARCHAR(50)    NOT NULL       COMMENT '作者',
    publisher    VARCHAR(100)   NOT NULL       COMMENT '出版社',
    publish_date DATE           NULL           COMMENT '出版日期',
    price        DECIMAL(10,2)  NOT NULL       COMMENT '价格',
    isbn         VARCHAR(20)    NOT NULL       COMMENT 'ISBN号',
    category     VARCHAR(50)    DEFAULT '其他'  COMMENT '分类',
    status       VARCHAR(20)    DEFAULT '可借'  COMMENT '状态',
    
    PRIMARY KEY (__________),
    UNIQUE (__________),        -- ISBN不能重复
    CHECK (__________ > 0)      -- 价格必须大于0
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书信息表';
  1. 如果任务3-3已经创建了books表,先删除再重建:
DROP TABLE IF EXISTS books;
  1. 点击执行,确认显示 Query OK
  2. 记录员截图:建表成功结果

关键控制点:UNIQUE约束确保ISBN唯一;CHECK约束确保价格>0;MySQL 8.0.16+才支持CHECK约束,如果版本低可能不报错但也不生效,可用ENUM或程序校验替代

# Step 5:创建借阅记录表(borrows)——子表 【执行】

  1. 执行以下SQL:
CREATE TABLE borrows (
    borrow_id    INT          AUTO_INCREMENT COMMENT '借阅编号',
    reader_id    INT          NOT NULL       COMMENT '读者编号',
    book_id      INT          NOT NULL       COMMENT '图书编号',
    borrow_date  DATE         NOT NULL       COMMENT '借书日期',
    return_date  DATE         NULL           COMMENT '应还日期',
    actual_return DATE        NULL           COMMENT '实际归还日期',
    
    PRIMARY KEY (__________),
    
    FOREIGN KEY (__________) REFERENCES readers(__________),
    FOREIGN KEY (__________) REFERENCES books(__________)
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='借阅记录表';
  1. 点击执行,确认显示 Query OK
  2. 记录员截图:建表成功结果

关键控制点:外键字段类型必须与父表主键类型一致(都是INT);FOREIGN KEY语法格式要正确;如有错误提示父表不存在,说明父表没建好或表名写错

# Step 6:验证3张表的结构 【检查】

  1. 分别执行:
DESCRIBE readers;
DESCRIBE books;
DESCRIBE borrows;
  1. 检查重点:

readers表检查

  • [ ] reader_id 的 Key = PRI,Extra = auto_increment
  • [ ] name 的 Null = NO

books表检查

  • [ ] book_id 的 Key = PRI
  • [ ] isbn 的 Key = UNI(唯一约束)

borrows表检查

  • [ ] borrow_id 的 Key = PRI
  • [ ] reader_id 和 book_id 是否有外键标识(DESCRIBE不直接显示,可用以下命令查看)
  1. 查看外键是否建立成功:
SHOW CREATE TABLE borrows;
  1. 在结果中找到 CONSTRAINT 关键字,确认外键存在

  2. 记录员截图:SHOW CREATE TABLE结果

关键控制点:外键约束在DESCRIBE中不直接显示,必须用SHOW CREATE TABLE确认;如发现无外键,检查SQL语法

# Step 7:插入合法测试数据 【执行】

  1. 先给父表插入数据(必须先有父母,才能有孩子):
-- 插入读者
INSERT INTO readers (name, gender, dept, phone) 
VALUES ('张三', '男', '计算机系', '13800138000');

INSERT INTO readers (name, gender, dept, phone) 
VALUES ('李四', '女', '电子系', '13900139000');

-- 插入图书
INSERT INTO books (title, author, publisher, price, isbn, category) 
VALUES ('数据库原理', '王强', '清华出版社', 59.00, '978-7-111-11111-1', '计算机');

INSERT INTO books (title, author, publisher, price, isbn, category) 
VALUES ('Python编程', '赵敏', '人民邮电出版社', 89.00, '978-7-222-22222-2', '计算机');
  1. 再给子表插入数据:
-- 插入借阅记录(张三借了《数据库原理》)
INSERT INTO borrows (reader_id, book_id, borrow_date, return_date) 
VALUES (1, 1, '2024-03-01', '2024-03-15');
  1. 确认都显示 Query OK

关键控制点:必须先给父表插入数据;子表的外键值必须是父表中已存在的;可用SELECT * FROM readers;查看reader_id的值

# Step 8:测试约束是否生效(故意犯错) 【执行】

  1. 测试外键约束:尝试给一个不存在的读者编号插入借阅记录
INSERT INTO borrows (reader_id, book_id, borrow_date, return_date) 
VALUES (999, 1, '2024-03-01', '2024-03-15');

预期结果:报错,提示外键约束失败 记录员截图:报错信息

  1. 测试唯一约束:尝试插入重复ISBN
INSERT INTO books (title, author, publisher, price, isbn, category) 
VALUES ('测试书', '测试作者', '测试出版社', 30.00, '978-7-111-11111-1', '测试');

预期结果:报错,提示唯一约束冲突(Duplicate entry) 记录员截图:报错信息

  1. 测试CHECK约束(如MySQL版本支持):尝试插入负数价格
INSERT INTO books (title, author, publisher, price, isbn) 
VALUES ('测试书', '测试', '测试', -10.00, '978-7-333-33333-3');

预期结果:报错或警告(取决于MySQL版本和配置) 记录员截图:结果

  1. 在记录表中填写:
测试项目 SQL语句 预期结果 实际结果 约束是否生效?
外键约束 ______ 报错 ______ ___
唯一约束 ______ 报错 ______ ___
CHECK约束 ______ 报错/警告 ______ ___

关键控制点:测试约束时必须故意输入错误数据;如果约束没有生效,检查MySQL版本或SQL语法


# ■ 成果提交区

# 交付物清单

  • [ ] 5种约束概念理解表(用自己的话解释,Word)
  • [ ] 3张表的父子关系图(手绘拍照或电脑绘制)
  • [ ] 读者表(readers)CREATE TABLE语句及执行截图
  • [ ] 图书表(books)CREATE TABLE语句及执行截图
  • [ ] 借阅记录表(borrows)CREATE TABLE语句及执行截图
  • [ ] SHOW CREATE TABLE borrows结果截图(证明外键存在)
  • [ ] 测试数据插入截图(Query OK)
  • [ ] 约束测试截图(至少2种违规操作的报错信息)
  • [ ] 约束测试记录表(Word表格)

# 格式要求

  1. 所有文档文件名格式:任务3-4_第X组_完整性约束
  2. SQL语句放入Word时用等宽字体
  3. 报错截图要清晰可见错误提示文字
  4. 提交方式:上传至课程平台指定文件夹

# ■ 评价反思区

# 一、COMET K1-K8自评表格

K标准 评价指标 得分(1-4分) 证据/举例
K1 明确任务 我能说出5种约束的名称和作用 ___ ______
K3 获取信息 我能通过SHOW CREATE TABLE查看约束定义 ___ ______
K4 分析加工 我能正确设计3张表的主键和外键关系 ___ ______
K6 使用工具 我能用Workbench创建带约束的表并测试 ___ ______
K7 排除故障 遇到外键报错时,我能判断是父表还是子表的问题 ___ ______
K8 反思改进 我能说出约束对数据质量的重要性 ___ ______

# 二、同伴互评表格

评价维度 权重 组员A 组员B 组员C 组员D(本人)
任务参与度 30% ___ ___ ___ ___
角色履行度 30% ___ ___ ___ ___
协作配合度 20% ___ ___ ___ ___
成果贡献度 20% ___ ___ ___ ___
加权平均分(满分5分) ___ ___ ___ ___

协作系数计算

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

成员 加权平均分 协作系数计算 协作系数
组员A ___ 0.5 + 0.5 × (___/5) = ___
组员B ___ 0.5 + 0.5 × (___/5) = ___
组员C ___ 0.5 + 0.5 × (___/5) = ___
本人 ___ 0.5 + 0.5 × (___/5) = ___

# 三、教师评分Rubric

评分维度 优秀(16-20分) 良好(12-15分) 合格(8-11分) 不合格(0-7分)
约束理解(15分) 能用生活例子解释5种约束 能解释5种约束 能解释3-4种 解释混乱
表结构设计(20分) 3张表字段完整,主键外键设计正确 基本正确 有小错误 设计错误
建表执行(20分) 按正确顺序执行,全部成功 有小错误但解决 在帮助下完成 建表失败
外键设计(20分) 外键关系正确,父子关系清晰 基本正确 外键类型不匹配或指向错误 无外键或外键错误
约束测试(15分) 测试≥2种约束,记录完整 测试2种 测试1种 未测试
团队协作(10分) 分工明确,全员参与 分工较明确 有分工,部分参与少 分工混乱

# 四、小组评分汇总表

评分维度 原始得分 权重 加权得分
约束理解 ___ 15% ___
表结构设计 ___ 20% ___
建表执行 ___ 20% ___
外键设计 ___ 20% ___
约束测试 ___ 15% ___
团队协作 ___ 10% ___
最终得分 100% ___

# 五、个人改进计划

  1. 外键约束中,最容易犯的错误是:________________________,避免方法是:________________________

  2. 如果要在借阅记录表里记录"逾期天数",应该用 ______ 类型,并且它的值应该是 ______(固定值/计算得出),所以 ______(需要/不需要)单独存这个字段。

  3. 通过本次任务,我理解了数据库和Excel最大的区别之一是:数据库有 ______ 来保证数据的正确性,而Excel没有。


# ■ 理论注解 ★(可选阅读)

为什么外键约束这么重要?一个反面教材

假设你的图书馆系统没有外键约束,看看会发生什么:

  1. 张三(reader_id=1)借了一本书
  2. 管理员在读者表里把张三删除了
  3. 但借阅记录里还有一条 "reader_id=1 借了某本书" 的记录
  4. 现在问题来了:reader_id=1 是谁?这个人已经不存在了,但系统里还有他的借书记录!

这种情况叫做"孤儿记录"——子表里的外键指向了一个不存在的父表记录。

外键约束就是为了防止这种情况。它告诉数据库:"如果有人要删除父表记录,先检查子表里还有没有引用它的记录。如果有,要么不许删,要么一起删。"

这就是为什么真实的数据库系统(尤其是企业级应用)都必须加外键约束。没有外键约束的数据库,就像没有交通信号灯的路口——迟早会出事故。

另外,MySQL的CHECK约束在8.0.16版本之前虽然语法不报错,但实际上不生效。如果你的MySQL版本较老,CHECK约束可能"形同虚设"。这种情况下,价格大于0的校验需要在应用程序层面做,或者改用ENUM、触发器等替代方案。



# 模块四 数据管理

模块导语:数据库建好了,表也创建完毕,接下来要学的是如何往数据库里添加数据、修改数据、删除数据,以及如何从数据库中查找需要的信息。就像图书馆的书架搭好了,现在要把书一本本放上去,并且学会快速找到想要的书。本模块是SQL语言的核心,也是日常使用数据库最频繁的操作。



# 【任务4-1】往表里加数据——INSERT语句 【C→T】


# ■ 任务呈现区

情境

学校图书馆的数据库和表已经建好了,但表里空空如也,就像新开的图书馆没有书。现在图书馆王老师给了你一批图书信息和读者信息,要求你把这些数据"录入"到数据库中。如果手动一条条录入太麻烦了,好在MySQL提供了INSERT语句,可以像"填表格"一样批量往表里加数据。

学习目标

  1. 理解INSERT语句的作用:往数据表中添加新记录
  2. 掌握INSERT INTO ... VALUES ... 的基本语法格式
  3. 能使用INSERT语句插入单行数据、多行数据和指定字段的数据
  4. 能在MySQL Workbench中正确执行INSERT语句并验证结果

核心输出物

  • [ ] 向图书表(books)成功插入10条图书数据
  • [ ] 向读者表(readers)成功插入5条读者数据
  • [ ] INSERT语句执行截图(含成功提示)
  • [ ] 数据验证截图(SELECT * FROM 表名)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:SQL数据操作语言(DML)——INSERT插入语句 行动维度:执行型任务(按模板填写SQL并执行) 需求维度:能完成图书馆图书和读者基础数据的批量录入 向上穿透:为后续查询、借阅等业务提供数据基础(支撑任务4-2至6-7)


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 分配每人负责录入哪几张表,检查数据完整性
操作员 实际操作 在MySQL Workbench中输入并执行INSERT语句
记录员 文档记录 填写工单、记录成功/失败的SQL语句
复核员 检查验证 用SELECT语句检查数据是否真的插入了

轮换规则:下次任务(任务4-2)操作员与记录员互换,组长与复核员互换

小组公约





# ■ 知识准备区

# 一、INSERT语句是做什么的?

类比 解释
Excel表格 在Excel里,你在空白行填写数据
数据库 在MySQL里,你用INSERT命令告诉数据库"我要加一行数据"
图书馆场景 新书到了,你把书名、作者、价格等信息登记到图书记录本里

# 二、INSERT语句的三种"写法"

写法 语法模板 什么时候用
写法1:插入所有字段 INSERT INTO 表名 VALUES (值1, 值2, 值3); 你知道所有字段的顺序,且每个字段都有值
写法2:插入指定字段 INSERT INTO 表名 (字段A, 字段B) VALUES (值A, 值B); 只需要填部分字段,其他字段自动为空或用默认值
写法3:一次插入多行 INSERT INTO 表名 VALUES (行1), (行2), (行3); 批量录入,提高效率

# 三、注意事项(常见错误)

注意点 说明 例子
字符串要加引号 文字类的值用单引号 ' ' 包住 '数据库原理'
数字不用加引号 数字直接写 59.80
日期格式固定 日期写成 '2025-09-01' '2026-06-08'
字段数量和值数量要一致 不能多也不能少 3个字段对应3个值
字段顺序和值顺序要对齐 第一个值对应第一个字段 (title, author) VALUES ('书名', '作者')

# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 确认books表和readers表的字段结构 20分钟 组长 能说出每个表的字段名和顺序
② 用INSERT向books表插入10条数据 40分钟 操作员 SELECT能看到10条记录
③ 用INSERT向readers表插入5条数据 30分钟 操作员 SELECT能看到5条记录
④ 验证所有数据并截图 30分钟 复核员 截图保存到工单

# 行动方案

  1. 先打开MySQL Workbench,连接数据库
  2. DESC books;DESC readers; 查看表结构(确认字段顺序)
  3. 按模板编写INSERT语句,先做单行,熟练后再做多行
  4. 每执行一条INSERT,立刻用SELECT验证

# ■ 决策区

关键决策点:books表有book_id、title、author、price、publish_date、category、stock共7个字段,如果只知道书名、作者、价格,其他不知道,该怎么插入?

方案 做法 优点 缺点
A 所有字段都写NULL或0,INSERT INTO books VALUES (NULL, '书名', '作者', 50, NULL, NULL, 0); 简单,一条语句搞定 字段多的时候容易写错顺序
B 只写知道的字段,INSERT INTO books (title, author, price) VALUES ('书名', '作者', 50); 不用管其他字段,不容易错 需要知道字段名
C 先在纸上把7个字段都填好,再一次性插入 数据完整 准备时间长

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] books表10条数据的SELECT查询结果截图
  • [ ] readers表5条数据的SELECT查询结果截图
  • [ ] 至少一条INSERT语句的代码(展示用了哪种写法)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:查看表结构 【执行】

  1. 打开MySQL Workbench,连接到数据库
  2. 新建一个Query Tab(点击菜单栏 File → New Query Tab,或直接按 Ctrl+T
  3. 输入以下命令查看books表结构:
DESC books;
  1. 点击工具栏的闪电按钮(Execute)或按 Ctrl+Enter
  2. 记录books表的字段顺序:
顺序 字段名 数据类型 是否必填
1
2
3
4
5
6
7
  1. 同样执行 DESC readers;,记录readers表结构:
顺序 字段名 数据类型 是否必填
1
2
3
4
5

关键控制点:确认字段顺序!INSERT INTO ... VALUES ... 时,值的顺序必须和字段顺序完全一致!

Step 2:插入第一条数据(单行插入) 【执行】

仿照下面的模板,替换下划线部分,插入第一条图书数据:

INSERT INTO books (title, author, price, publish_date, category, stock) 
VALUES ('________', '________', ____, '________', '________', ____);

示例(可复制修改):

INSERT INTO books (title, author, price, publish_date, category, stock) 
VALUES ('MySQL数据库入门', '张三', 59.80, '2025-03-15', '计算机', 10);
  1. 操作员在Query中输入修改后的SQL
  2. 点击闪电按钮执行
  3. 如果看到 1 row(s) affected,表示成功!
  4. 如果看到红色报错,把报错信息复制给组长,一起分析原因

Step 3:批量插入图书数据(多行插入) 【执行】

用"写法3"一次性插入多条数据(推荐,效率更高):

INSERT INTO books (title, author, price, publish_date, category, stock) VALUES
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____),
('________', '________', ____, '________', '________', ____);

注意

  • 每行数据用括号包住
  • 行与行之间用逗号 , 分隔
  • 最后一行后面用分号 ;

关键控制点:执行前组长检查——括号是否成对?逗号有没有写成中文逗号?字符串有没有加引号?

Step 4:插入读者数据 【执行】

用同样的方法,向readers表插入5条读者数据:

INSERT INTO readers (reader_name, gender, phone, email, register_date) VALUES
('________', '____', '________', '________', '________'),
('________', '____', '________', '________', '________'),
('________', '____', '________', '________', '________'),
('________', '____', '________', '________', '________'),
('________', '____', '________', '________', '________');

示例

INSERT INTO readers (reader_name, gender, phone, email, register_date) VALUES
('李明', '男', '13800138001', 'liming@example.com', '2026-01-10'),
('王芳', '女', '13900139002', 'wangfang@example.com', '2026-02-15'),
('赵强', '男', '13700137003', 'zhaoqiang@example.com', '2026-03-01'),
('刘洋', '女', '13600136004', 'liuyang@example.com', '2026-03-20'),
('陈静', '女', '13500135005', 'chenjing@example.com', '2026-04-05');

Step 5:验证数据(SELECT检查) 【检查】

每插入一批数据,都要验证是否真的进去了:

-- 查看图书表所有数据
SELECT * FROM books;

-- 查看读者表所有数据
SELECT * FROM readers;

检查清单:

  • [ ] books表有______条记录(目标:10条)
  • [ ] readers表有______条记录(目标:5条)
  • [ ] 数据内容和我们输入的是否一致?□是 □否
  • [ ] 有没有乱码或奇怪的内容?□没有 □有,说明:______

# ■ 成果提交区

交付物清单

  1. [ ] books表数据截图:执行 SELECT * FROM books; 的结果截图,能看到10条数据
  2. [ ] readers表数据截图:执行 SELECT * FROM readers; 的结果截图,能看到5条数据
  3. [ ] 至少一条多行INSERT语句代码(用于展示)
  4. [ ] 本工单所有区域的填写内容

格式要求

  • 截图保存为PNG或JPG,文件名格式:4-1-组号-截图类型.jpg
  • SQL代码可直接复制到工单中,或单独保存为 .sql 文件

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能看懂INSERT语句的结构 完全不懂 大概知道 能区分三种写法 能教别人
K2 功能性 我能正确插入数据到表中 总是报错 有时成功 基本能插入 熟练无误
K3 过程导向 我按步骤执行并验证结果 跳过步骤 基本按步骤 规范执行 能发现并修正错误
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
SQL语句正确性 20 INSERT语法是否正确,有无常见错误
数据完整性 20 books表10条、readers表5条是否齐全
操作规范性 20 是否按步骤执行、是否验证
团队协作 20 角色分工是否明确,是否互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
SQL语句正确性 20%
数据完整性 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 我最容易犯的INSERT错误是:________________________
  2. 下次插入数据时,我会先:________________________
  3. 我觉得批量插入比单行插入的优势是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么INSERT语句是DML而不是DDL?】

SQL语言分为几大类:DDL(数据定义语言,如CREATE、DROP,负责"建房子")、DML(数据操作语言,如INSERT、UPDATE、DELETE,负责"搬家具")、DQL(数据查询语言,如SELECT,负责"看家具")、DCL(数据控制语言,负责"给钥匙")。

INSERT属于DML,因为它只改变表中的"数据内容",不改变表本身的"结构"。就像你在图书馆登记本上写新书信息,登记本本身没有变,只是里面的内容变多了。



# 【任务4-2】查数据——简单SELECT查询 【C→T】


# ■ 任务呈现区

情境

上节课我们已经往图书馆数据库里添加了图书和读者数据。现在王老师想查看这些数据,她问了你几个问题:"现在库里有多少本书?""都有哪些作者?""给我看看前5条记录。"这些问题在数据库里统称为"查询",MySQL用SELECT语句来回答。SELECT就像"提问",数据库会把你想要的答案"返回"给你。

学习目标

  1. 理解SELECT语句的作用:从数据表中提取(查询)数据
  2. 掌握 SELECT * FROM 表名 查询所有数据
  3. 掌握 SELECT 字段1, 字段2 FROM 表名 查询指定字段
  4. 掌握 DISTINCT 去重、LIMIT 限制结果数量、AS 设置别名
  5. 能在MySQL Workbench中根据需求写出对应的SELECT语句

核心输出物

  • [ ] 查询所有图书(SELECT * FROM books)结果截图
  • [ ] 查询图书名称和作者(去重)结果截图
  • [ ] 查询前5条图书记录结果截图
  • [ ] "查询需求→SQL语句"对照练习表(5个需求)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:SQL数据查询语言(DQL)——SELECT基本查询 行动维度:应用型任务(根据需求写出对应SQL) 需求维度:能按不同要求从图书馆数据库中提取所需信息 向上穿透:为条件查询(任务4-3)、多表联查(任务4-4)和视图创建(任务5-2)奠定基础


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 分配每人负责的查询需求,组织对照练习
操作员 实际操作 在MySQL Workbench中输入并执行SELECT语句
记录员 文档记录 填写"需求→SQL对照表",记录查询结果
复核员 检查验证 检查SQL语法是否正确,核对查询结果是否符合需求

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、SELECT语句是"提问",数据库是"回答"

生活场景 对应SQL
"把登记本给我看看" SELECT * FROM books;
"我只看书名和作者" SELECT title, author FROM books;
"作者有哪些?不要重复" SELECT DISTINCT author FROM books;
"给我看前5条" SELECT * FROM books LIMIT 5;

# 二、SELECT基本语法格式

SELECT 字段1, 字段2, ...      -- 你想看哪些列
FROM 表名                     -- 从哪张表查
[其他可选子句];               -- WHERE、ORDER BY等(本任务暂不学)

# 三、本任务要学的4个"小技能"

技能 语法 作用 例子
查所有 SELECT * FROM 表名 查看表中所有字段的所有数据 SELECT * FROM books;
查指定字段 SELECT 字段A, 字段B FROM 表名 只看关心的列 SELECT title, price FROM books;
去重 SELECT DISTINCT 字段 FROM 表名 重复的值只显示一次 SELECT DISTINCT category FROM books;
限制条数 SELECT * FROM 表名 LIMIT N 只看前N条 SELECT * FROM books LIMIT 5;
起别名 SELECT 字段 AS 别名 FROM 表名 让结果更易读 SELECT title AS 书名 FROM books;

# 四、注意事项

注意点 说明
* 是通配符 表示"所有字段",就像"全部"的意思
DISTINCT 放在字段前面 SELECT DISTINCT author FROM books; ✓,不能写成 SELECT author DISTINCT
LIMIT 放在最后 只能限制"显示多少条",不能挑选特定内容
别名用 AS 也可以省略AS直接写空格,如 SELECT title 书名 FROM books;

# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解SELECT基本语法和4个小技能 30分钟 组长 能说出SELECT * 和 SELECT 字段的区别
② 完成"需求→SQL对照练习"(5个需求) 40分钟 操作员+记录员 5个SQL全部正确
③ 在MySQL中执行所有SQL并截图 40分钟 操作员 有5张查询结果截图
④ 验证并互评 30分钟 复核员 检查SQL和结果是否对应

# 行动方案

  1. 组长带领全组快速过一遍知识准备区的表格
  2. 每人轮流"说需求",操作员写出SQL,全组讨论对错
  3. 操作员在Workbench中逐一执行,记录员截图
  4. 复核员对照需求检查:查出来的结果真的是我们想要的吗?

# ■ 决策区

关键决策点:王老师想看"图书的分类有哪些",假设category字段有重复值(多本书都是"计算机"类),应该用什么SQL?

方案 SQL写法 结果 适用情况
A SELECT category FROM books; 显示所有分类,含重复 想看每本书的分类
B SELECT DISTINCT category FROM books; 只显示不重复的分类 想看有哪些分类
C SELECT * FROM books; 显示所有信息 信息太多,不聚焦

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] "需求→SQL对照练习"表格(5个需求全部填写)
  • [ ] 2张查询结果截图(选择最有代表性的)
  • [ ] 本组在查询过程中遇到的1个错误或疑问,以及解决方法

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:打开Query Tab,连接数据库 【执行】

  1. 打开MySQL Workbench,确保已连接到图书馆数据库
  2. 新建Query Tab(Ctrl+T
  3. 确认books表和readers表中有数据(执行 SELECT * FROM books; 看看)

关键控制点:如果表中没有数据,先回去完成任务4-1的INSERT操作!

*Step 2:查询所有图书(SELECT 【执行】

-- 模板:SELECT * FROM 表名;
SELECT * FROM books;

执行后观察结果:

  • 一共显示了多少条记录?______条
  • 一共有多少列?______列
  • 列名分别是什么?________________________

Step 3:查询指定字段 【执行】

仿照模板,替换下划线部分:

-- 模板:SELECT 字段1, 字段2 FROM 表名;
SELECT title, author FROM books;

-- 练习:只查书名和价格
SELECT ______, ______ FROM books;

-- 练习:只查读者姓名和电话
SELECT ______, ______ FROM readers;

Step 4:去重查询(DISTINCT) 【执行】

-- 模板:SELECT DISTINCT 字段 FROM 表名;
SELECT DISTINCT author FROM books;

-- 练习:图书有哪些分类?(对category去重)
SELECT DISTINCT ______ FROM books;

-- 练习:读者有哪些性别?(对gender去重)
SELECT DISTINCT ______ FROM readers;

执行后记录:

  • books表中有______位不同的作者
  • books表中有______种不同的分类
  • readers表中有______种性别

Step 5:限制结果数量(LIMIT) 【执行】

-- 模板:SELECT * FROM 表名 LIMIT 数字;
SELECT * FROM books LIMIT 5;

-- 练习:只看前3条读者记录
SELECT * FROM readers LIMIT ____;

-- 练习:只看前2条图书记录,但只看title和price
SELECT title, price FROM books LIMIT ____;

Step 6:给字段起别名(AS) 【执行】

-- 模板:SELECT 字段 AS 别名 FROM 表名;
SELECT title AS 书名, author AS 作者, price AS 价格 FROM books;

-- 练习:查询读者信息,用中文别名
SELECT reader_name AS ______, phone AS ______ FROM readers;

关键控制点:别名只是"显示的时候换个名字",不会改变数据库里真正的字段名!

Step 7:综合练习——"需求→SQL对照表" 【执行+检查】

全组合作,根据以下需求写出SQL语句,操作员执行,记录员填写结果:

序号 需求描述 我写出的SQL 执行结果(成功/失败) 查到几条
1 查询所有读者的全部信息 SELECT * FROM readers;
2 查询所有图书的书名和价格 SELECT ______ FROM ______;
3 查询图书有哪些分类(不要重复) SELECT ______ ______ FROM ______;
4 查询前3条图书记录 SELECT ______ FROM ______ ______ 3;
5 查询读者姓名和电话,显示为"姓名"和"联系方式" SELECT ______ AS ______, ______ AS ______ FROM ______;

组长检查:5个SQL是否全部正确?□是 □否,第______个需要修改


# ■ 成果提交区

交付物清单

  1. [ ] "需求→SQL对照表"(填写完整的表格)
  2. [ ] 至少2张查询结果截图(一张SELECT *,一张带LIMIT或DISTINCT)
  3. [ ] 本工单所有区域的填写内容

格式要求

  • 截图清晰显示SQL代码和执行结果
  • SQL代码可直接复制到工单中

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解SELECT语句的结构 看不懂 大概知道 能独立写出 能灵活运用
K2 功能性 我能根据需求写出正确的SELECT 总是写错 需要提示 基本正确 完全正确
K3 过程导向 我按需求→SQL→执行→验证的流程操作 直接写 偶尔验证 规范执行 能检查错误
K4 解释与反思 我能解释DISTINCT和LIMIT的作用 说不清 大致了解 能解释清楚 能举例说明
K6 社会责任 我积极参与小组讨论 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
SQL语句正确性 20 SELECT语法是否正确
需求理解 20 能否根据需求写出对应SQL
操作规范性 20 是否执行并验证
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
SQL语句正确性 20%
需求理解 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 写SELECT时我最容易忘记的是:________________________
  2. DISTINCT和LIMIT的区别是:________________________
  3. 下次查询前,我会先想清楚:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么SELECT语句不会改变数据库里的数据?】

SELECT是DQL(数据查询语言),它只"看"数据,不"改"数据。就像你在图书馆目录柜里查书——你翻看了目录卡片,但卡片本身没有变,书架上的书也没有动。

正因为SELECT不改变数据,你可以放心大胆地执行各种查询,即使查错了也不会破坏数据。这是学习SQL最好的起点:先学会"安全地看",再学"谨慎地改"。



# 【任务4-3】条件查询与排序——WHERE和ORDER BY 【C→T】


# ■ 任务呈现区

情境

图书馆的图书越来越多,王老师不再满足于"看看所有书",她提出了更具体的要求:"给我看看价格超过50元的书""我想找书名里带'数据库'三个字的书""把书按价格从贵到便宜排个序"。这些需求有一个共同点:不是"全看",而是"按条件挑"。MySQL用WHERE来"筛选",用ORDER BY来"排序"。本任务就像给SELECT装上了"过滤器"和"排序器"。

学习目标

  1. 理解WHERE子句的作用:按条件筛选数据
  2. 掌握比较运算符(=、<>、>、<、>=、<=)、BETWEEN、LIKE、IN、IS NULL的用法
  3. 掌握逻辑运算符AND、OR、NOT的组合使用
  4. 掌握ORDER BY排序(ASC升序/DESC降序)
  5. 能根据查询需求写出带有WHERE和ORDER BY的SELECT语句

核心输出物

  • [ ] "查询需求→SQL对照表"(含8个带WHERE的查询需求)
  • [ ] 价格大于50元的图书查询结果截图
  • [ ] 书名包含"数据库"的图书查询结果截图
  • [ ] 按价格从高到低排序的查询结果截图
  • [ ] 组合条件查询(如"计算机类且价格大于40元")结果截图

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:SQL数据查询语言(DQL)——条件筛选(WHERE)与排序(ORDER BY) 行动维度:应用型任务(根据复杂需求组合使用多个子句) 需求维度:能按指定条件从图书馆数据库中精准提取并排序信息 向上穿透:为多表联查(任务4-4)中的条件过滤、视图筛选(任务5-2)和存储过程查询(任务5-3/5-4)奠定基础


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 讲解WHERE和ORDER BY的关系,分配查询需求
操作员 实际操作 在MySQL Workbench中编写并执行带WHERE/ORDER BY的SQL
记录员 文档记录 填写"查询需求→SQL对照表",记录每个查询的结果条数
复核员 检查验证 检查SQL条件是否写对,核对查询结果是否符合需求

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、WHERE是"筛选器",ORDER BY是"排序器"

生活场景 对应SQL
"把价格超过50元的书挑出来" WHERE price > 50
"找找书名里有'数据库'的书" WHERE title LIKE '%数据库%'
"按价格从低到高排" ORDER BY price ASC
"先看计算机类的,再按价格从高到低排" WHERE category='计算机' ORDER BY price DESC

# 二、WHERE里的"筛选条件"怎么写?

(1)比较运算符——比大小

运算符 含义 例子 说明
= 等于 WHERE category = '计算机' 字符串要加引号
<>!= 不等于 WHERE category <> '计算机' 两种写法都行
> 大于 WHERE price > 50 数字不用引号
< 小于 WHERE price < 30
>= 大于等于 WHERE stock >= 5
<= 小于等于 WHERE stock <= 2

(2)特殊条件——更灵活的筛选

写法 含义 例子 说明
BETWEEN ... AND ... 在……之间(包含边界) WHERE price BETWEEN 30 AND 60 30和60都算
LIKE + 通配符 模糊匹配 WHERE title LIKE '%数据库%' %表示任意字符
IN (...) 在列表中 WHERE category IN ('计算机', '电子') 等于其中任意一个
IS NULL 为空 WHERE email IS NULL 不是 = NULL
IS NOT NULL 不为空 WHERE email IS NOT NULL

LIKE通配符详解

通配符 含义 例子
% 任意多个字符(包括0个) '数据库%' → 以"数据库"开头
_ 任意一个字符 '数据库_' → "数据库"后面只有1个字

# 三、逻辑运算符——把多个条件连起来

运算符 含义 例子 结果
AND 并且(两个条件都要满足) WHERE price>50 AND stock>0 又贵又有库存的书
OR 或者(满足一个就行) WHERE category='计算机' OR category='电子' 计算机类或电子类
NOT 不是(取反) WHERE NOT category='计算机' 不是计算机类的书

# 四、ORDER BY排序

写法 含义 例子
ORDER BY 字段 ASC 升序(从小到大,默认) ORDER BY price ASC
ORDER BY 字段 DESC 降序(从大到小) ORDER BY price DESC
ORDER BY 字段1, 字段2 先按字段1排,相同再按字段2排 ORDER BY category, price DESC

# 五、完整SELECT语句的"顺序口诀"

SELECT   字段      -- 第三步:决定看什么
FROM     表名      -- 第一步:先定表
WHERE    条件      -- 第二步:再筛选
ORDER BY 字段;     -- 第四步:最后排序

口诀:先FROM,再WHERE,然后SELECT,最后ORDER BY


# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解WHERE条件和ORDER BY的语法 25分钟 组长 能说出5种比较运算符
② 完成基础条件查询练习(4个需求) 35分钟 操作员 SQL全部执行成功
③ 完成组合条件查询练习(4个需求) 35分钟 操作员 结果条数符合预期
④ 验证并互评 35分钟 复核员 对照表全部正确

# 行动方案

  1. 组长带全组过知识准备区,每人轮流说一个运算符的用法
  2. 操作员按"基础→组合"的顺序执行SQL
  3. 记录员每执行完一个查询,立刻记录"查到几条"
  4. 复核员负责"挑刺":这个查询结果真的是王老师想要的吗?

# ■ 决策区

关键决策点:王老师想要"价格在30到60元之间,并且是计算机类的图书",以下哪种写法正确?

方案 SQL写法 是否正确
A WHERE price BETWEEN 30 AND 60 AND category = '计算机'
B WHERE price BETWEEN 30 AND 60 OR category = '计算机'
C WHERE price > 30 AND price < 60 AND category = '计算机'

分析

  • 方案A:价格在30-60之间 并且 是计算机类 → ______(是/不是)王老师想要的
  • 方案B:价格在30-60之间 或者 是计算机类 → ______(是/不是)王老师想要的
  • 方案C:价格大于30且小于60(注意:不包含30和60)并且 是计算机类 → ______(是/不是)王老师想要的

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] "查询需求→SQL对照表"(8个需求全部填写完整)
  • [ ] 2张最有代表性的查询结果截图(推荐:组合条件查询、排序查询)
  • [ ] 本组在执行过程中遇到的1个"坑"和爬出来的方法

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:基础条件查询练习 【执行】

仿照模板,完成以下4个查询。每完成一个,记录员填写"查到几条"。

查询1:价格大于50元的图书

-- 模板
SELECT * FROM books WHERE price > 50;

-- 执行后记录:查到 ______ 条

查询2:书名包含"数据库"的图书(模糊查询)

-- 模板:%表示任意字符,'数据库%'表示以"数据库"开头
SELECT * FROM books WHERE title LIKE '%数据库%';

-- 变式练习:书名包含"应用"两个字
SELECT * FROM books WHERE title LIKE '______';

-- 执行后记录:查到 ______ 条

查询3:分类是"计算机"或"电子"的图书

-- 模板(用IN)
SELECT * FROM books WHERE category IN ('计算机', '电子');

-- 变式练习(用OR写同样的条件)
SELECT * FROM books WHERE category = '______' OR category = '______';

-- 执行后记录:查到 ______ 条

查询4:库存大于等于5本的图书,按价格从低到高排序

-- 模板
SELECT * FROM books WHERE stock >= 5 ORDER BY price ASC;

-- 执行后记录:查到 ______ 条

Step 2:组合条件查询练习 【执行】

查询5:计算机类且价格大于40元的图书

-- 模板:AND连接两个条件
SELECT * FROM books WHERE category = '______' AND price > ______;

-- 执行后记录:查到 ______ 条

查询6:价格不在30到50元之间的图书(用NOT BETWEEN)

-- 模板
SELECT * FROM books WHERE price NOT BETWEEN 30 AND 50;

-- 执行后记录:查到 ______ 条

查询7:书名不含"基础"两个字,且价格小于60元,按价格从高到低排

-- 模板
SELECT title, author, price FROM books 
WHERE title NOT LIKE '%基础%' AND price < 60 
ORDER BY price DESC;

-- 执行后记录:查到 ______ 条

查询8:查询没有留下邮箱的读者(IS NULL)

-- 模板:注意!NULL要用IS NULL判断,不能写 = NULL
SELECT * FROM readers WHERE email IS NULL;

-- 变式练习:查询有邮箱的读者
SELECT * FROM readers WHERE email IS ______ NULL;

-- 执行后记录:查到 ______ 条

关键控制点:组长抽查——=IS NULL有什么区别?LIKE=有什么区别?

Step 3:综合对照表 【执行+检查】

记录员填写完整表格:

序号 需求描述 我写出的SQL 执行结果 查到几条
1 查询价格大于50元的图书
2 查询书名包含"数据库"的图书
3 查询分类是计算机或电子的图书
4 查询2025年及以后出版的图书 WHERE publish_date >= '2025-01-01'
5 查询价格在20到50元之间的图书
6 查询计算机类且价格大于40元的图书
7 查询所有图书,按价格从高到低排
8 查询没有邮箱的读者

复核员检查:每个查询的结果是否符合需求?□全部符合 □第______个有问题


# ■ 成果提交区

交付物清单

  1. [ ] "查询需求→SQL对照表"(8个需求全部填写)
  2. [ ] 至少3张查询结果截图(含条件查询、组合条件、排序)
  3. [ ] 本工单所有区域的填写内容

格式要求

  • 截图中SQL语句和执行结果都要清晰可见
  • 对照表手写或电子版均可,但SQL代码要可辨认

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解WHERE和ORDER BY的作用 完全不懂 大概知道 能独立使用 能组合使用
K2 功能性 我能根据需求写出正确的条件查询SQL 总是写错 需要提示 基本正确 完全正确
K3 过程导向 我能按"需求→SQL→执行→验证"的流程操作 跳过步骤 基本按步骤 规范执行 能检查并修正
K4 解释与反思 我能解释AND和OR的区别 说不清 大致了解 能解释清楚 能举例说明
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
SQL语句正确性 20 WHERE条件和ORDER BY语法是否正确
需求理解 20 能否根据需求写出对应SQL
操作规范性 20 是否执行并验证,是否记录结果条数
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
SQL语句正确性 20%
需求理解 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 写WHERE条件时,我最容易写错的是:________________________
  2. LIKE '%数据库%'= '数据库' 的区别是:________________________
  3. 下次遇到复杂查询,我会先:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么NULL要用IS NULL而不是= NULL?】

在SQL中,NULL表示"不知道"或"没有值",它不是一个具体的值。如果你写 WHERE email = NULL,MySQL会理解为"email等于一个叫NULL的值",但NULL不是值,所以永远为假。

IS NULL 是专门用来判断"是不是空"的语法,它检查的是"该字段有没有值",而不是"该字段的值等不等于某个东西"。这就像问"你钱包里有没有钱"和"你钱包里的钱等不等于零"——如果你根本没有钱包,这两个问题是不一样的。



# 【任务4-4】多表联查——JOIN连接查询 【C→T】


# ■ 任务呈现区

情境

图书馆的图书数据和读者数据分别存在两张表里。有一天,王老师问了一个问题:"我想知道李明借了哪些书?"这时候你会发现:读者姓名在readers表里,借了什么书在borrow_records表里,书的名字又在books表里——一张表查不出来!

生活中也有类似的场景:你在快递柜取快递,快递单号在快递员系统里,取件码在柜机系统里,只有你手机号把两边"连"了起来。数据库里的JOIN就是干这个的——把多张表通过共同的字段"连"起来查

学习目标

  1. 理解为什么需要多表查询(单表查不到完整信息)
  2. 掌握INNER JOIN(内连接)的语法和作用
  3. 掌握LEFT JOIN(左连接)的语法和作用
  4. 了解RIGHT JOIN(右连接)的概念
  5. 掌握三表连接的方法(读者表JOIN借阅记录表JOIN图书表)
  6. 能写出"谁借了哪本书"等多表联合查询SQL

核心输出物

  • [ ] "连连看"连线图(手绘):哪张表和哪张表通过哪个字段连
  • [ ] 查询"谁借了哪本书"的SQL及结果截图(3表连接)
  • [ ] 查询"未归还的借阅记录"的SQL及结果截图(LEFT JOIN)
  • [ ] 多表查询对照练习表(3个需求)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:SQL数据查询语言(DQL)——多表连接查询(JOIN) 行动维度:综合型任务(理解表关系+组合多表+编写复杂SQL) 需求维度:能从图书馆多个相关表中提取关联信息,回答"谁借了哪本书"等复合问题 向上穿透:为视图创建(任务5-2)、存储过程中的多表查询(任务5-3/5-4)以及综合项目(模块六)提供核心技能


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 带领全组画"表关系图",确认连接字段
操作员 实际操作 在MySQL Workbench中执行JOIN语句
记录员 文档记录 记录每张表的连接条件,填写对照练习
复核员 检查验证 检查ON后面的条件是否写对,核对结果是否符合逻辑

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、为什么需要JOIN?——一个问号引发的多表查询

王老师的提问 涉及哪些表 每张表提供什么信息
"李明借了哪些书?" readers(读者表) 李明是谁
borrow_records(借阅记录表) 李明借了哪本书(book_id)
books(图书表) 这本书叫什么名字(title)

单表查不了的问题

  • 只看readers表 → 知道有李明这个人,但不知道他借了啥
  • 只看borrow_records表 → 知道有人借了book_id=3的书,但不知道是谁、书名是什么
  • JOIN就是把三张表"拼"成一张大表来看

# 二、JOIN的"连连看"原理

想象三张表是三个班级,每个同学有一个"学号":

  • A班(readers) 有:学号(reader_id)、姓名(reader_name)
  • B班(borrow_records) 有:学号(reader_id)、书号(book_id)、借出日期
  • C班(books) 有:书号(book_id)、书名(title)

怎么连?

  • A班和B班用学号(reader_id)
  • B班和C班用书号(book_id)
 readers                    borrow_records                    books
┌──────────┬──────────┐   ┌──────────┬─────────┬──────────┐   ┌─────────┬──────────┐
│reader_id │reader_name│   │reader_id │ book_id │borrow_date│   │ book_id │  title   │
├──────────┼──────────┤   ├──────────┼─────────┼──────────┤   ├─────────┼──────────┤
│    1     │   李明    │◄──│    1     │    3    │2026-05-01 │──►│    3    │数据库原理│
│    2     │   王芳    │   │    2     │    1    │2026-05-03 │   │    1    │MySQL入门 │
└──────────┴──────────┘   └──────────┴─────────┴──────────┘   └─────────┴──────────┘
         ▲                                                        ▲
         └────────────────────── reader_id ──────────────────────┘
                                    │
                                    └──────────────── book_id ────────────────┘

# 三、三种JOIN的区别(用集合图理解)

JOIN类型 中文名 查出来什么 生活类比
INNER JOIN 内连接 两边都有的记录 两个班级都有的学生
LEFT JOIN 左连接 左边表全部 + 右边表匹配上的 A班所有人,B班有的显示,没的留空
RIGHT JOIN 右连接 右边表全部 + 左边表匹配上的 和LEFT JOIN反过来

# 四、JOIN语法模板

两表连接

SELECT A表字段, B表字段
FROM A表名
[INNER / LEFT / RIGHT] JOIN B表名
ON A表.连接字段 = B表.连接字段;

三表连接

SELECT A表字段, B表字段, C表字段
FROM A表名
JOIN B表名 ON A表.连接字段 = B表.连接字段
JOIN C表名 ON B表.连接字段 = C表.连接字段;

重要:ON后面写的是"两张表怎么连",WHERE后面写的是"连完之后怎么筛"。


# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 画"表关系连线图",确认连接字段 20分钟 组长 能说出哪两张表通过哪个字段连
② 掌握两表INNER JOIN并执行 30分钟 操作员 SQL执行成功,结果合理
③ 掌握两表LEFT JOIN并执行 25分钟 操作员 能看到NULL值
④ 完成三表连接查询 35分钟 操作员 能查出"谁借了哪本书"
⑤ 验证并填写对照练习 30分钟 复核员+记录员 3个需求全部正确

# 行动方案

  1. 先用纸笔画出三张表的关系图(哪张表连哪张表)
  2. 从最简单的两表JOIN开始,熟练后再加第三张表
  3. 每执行一个JOIN,立刻检查:结果条数合理吗?NULL值出现在哪里?
  4. 全组一起分析"为什么这条记录出现了/没出现"

# ■ 决策区

关键决策点:王老师想看"所有读者,以及他们借了哪些书(如果有的话)",应该用哪种JOIN?

方案 JOIN类型 结果 适用场景
A readers INNER JOIN borrow_records 只显示有借阅记录的读者 只想看"借过书的人"
B readers LEFT JOIN borrow_records 显示所有读者,没借书的显示NULL 想看"所有人,包括没借书的"
C readers RIGHT JOIN borrow_records 显示所有借阅记录,没对应读者的显示NULL 想看"所有记录,包括读者信息缺失的"

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 手绘或电子的"三张表关系连线图"
  • [ ] "谁借了哪本书"三表连接的结果截图
  • [ ] "未归还借阅记录"LEFT JOIN的结果截图
  • [ ] 多表查询对照练习表

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:确认三张表的连接字段 【执行】

  1. 打开MySQL Workbench,新建Query Tab
  2. 分别执行以下命令,查看表结构:
DESC readers;
DESC borrow_records;
DESC books;
  1. 填写连接关系表:
表A 表B 用什么字段连? A表的字段 B表的字段
readers borrow_records reader_id readers.reader_id borrow_records.reader_id
borrow_records books ______ borrow_records.______ books.______
  1. 在纸上画出三张表的连线图,标上连接字段

关键控制点:连接字段必须"值一样"!reader_id里的1,和borrow_records里的1,代表的是同一个人。

Step 2:两表INNER JOIN——"读者+他们的借阅记录" 【执行】

-- 模板:查询读者姓名和他们借的书号
-- 注意:表名可以起别名(r代表readers,b代表borrow_records),让SQL更短

SELECT 
    r.reader_name,       -- 读者姓名
    b.book_id,           -- 借的书号
    b.borrow_date        -- 借出日期
FROM readers r
INNER JOIN borrow_records b
ON r.reader_id = b.reader_id;   -- 连接条件:reader_id相同

执行后记录:

  • 一共查到______条记录
  • 这些记录里的读者,是不是都是有借阅记录的?□是 □否
  • 有没有读者"没出现"?□有,是______ □没有

Step 3:两表LEFT JOIN——"所有读者+他们的借阅记录(没借的显示NULL)" 【执行】

-- 模板:把INNER改成LEFT,其他不变
SELECT 
    r.reader_name,
    b.book_id,
    b.borrow_date
FROM readers r
LEFT JOIN borrow_records b
ON r.reader_id = b.reader_id;

执行后记录:

  • 一共查到______条记录
  • 比INNER JOIN多了______条
  • 多出来的记录,book_id和borrow_date显示什么?______
  • 这些NULL代表什么意思?________________________

关键控制点:LEFT JOIN会保留左边表(readers)的所有记录,右边没匹配上的用NULL填充。这就是"没借书的人也出现在结果里"的原因。

Step 4:三表连接——"谁借了哪本书(含书名)" 【执行】

这是本任务最重要的SQL!直接提供完整模板,你只需要理解结构:

-- 模板:查询读者姓名、书名、借阅日期、归还日期
SELECT 
    r.reader_name AS 读者姓名,           -- 来自readers表
    b.title AS 图书名称,                 -- 来自books表
    br.borrow_date AS 借阅日期,          -- 来自borrow_records表
    br.return_date AS 归还日期           -- 来自borrow_records表
FROM readers r
INNER JOIN borrow_records br
ON r.reader_id = br.reader_id           -- 第一步:readers连borrow_records
INNER JOIN books b
ON br.book_id = b.book_id;              -- 第二步:borrow_records连books

执行后记录:

  • 一共查到______条借阅记录
  • 每位读者各借了几本书?
    • 李明:______本
    • 王芳:______本
    • 其他人:______

Step 5:查询"未归还的借阅记录"(WHERE + LEFT JOIN组合) 【执行】

-- 模板:归还日期为NULL,表示"还没还"
SELECT 
    r.reader_name AS 读者姓名,
    b.title AS 图书名称,
    br.borrow_date AS 借阅日期
FROM readers r
JOIN borrow_records br ON r.reader_id = br.reader_id
JOIN books b ON br.book_id = b.book_id
WHERE br.return_date IS NULL;   -- 筛选条件:还没归还

执行后记录:

  • 未归还的记录有______条
  • 涉及______位读者
  • 这些书逾期了吗?(对比今天的日期)________________________

Step 6:多表查询对照练习 【执行+检查】

序号 需求描述 我写出的SQL 执行结果 查到几条
1 查询所有借阅记录,显示读者姓名和书名
2 查询"李明"借的所有书(含书名) WHERE r.reader_name = '李明'
3 查询所有读者(包括没借过书的),显示借的书名 (提示:用LEFT JOIN)

复核员检查:

  • [ ] 每个JOIN都有ON条件吗?
  • [ ] ON条件里的字段名写对了吗?
  • [ ] 三表连接时,中间表(borrow_records)被用了两次吗?(一次连readers,一次连books)

# ■ 成果提交区

交付物清单

  1. [ ] 三张表关系连线图(手绘拍照或电子绘图)
  2. [ ] 三表连接SQL及结果截图("谁借了哪本书")
  3. [ ] 未归还记录查询截图(含WHERE br.return_date IS NULL)
  4. [ ] 多表查询对照练习表(3个需求)
  5. [ ] 本工单所有区域的填写内容

格式要求

  • 截图清晰显示完整SQL代码和执行结果
  • 连线图需标注:表名、连接字段、连接类型

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解JOIN的作用 完全不懂 大概知道 能完成两表JOIN 能完成三表JOIN
K2 功能性 我能写出正确的多表连接SQL 总是报错 需要模板 能修改模板完成 能独立写出
K3 过程导向 我能先画关系图再写SQL 直接写 偶尔画图 先画图再写 图和SQL对应准确
K4 解释与反思 我能解释INNER JOIN和LEFT JOIN的区别 说不清 大致了解 能解释清楚 能举例说明
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
表关系理解 20 连线图是否正确,连接字段是否找对
SQL语句正确性 20 JOIN语法、ON条件、WHERE组合是否正确
查询结果分析 20 能否解释结果中的NULL、条数差异
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
表关系理解 20%
SQL语句正确性 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 写JOIN时我最容易漏掉的是:________________________
  2. INNER JOIN和LEFT JOIN的区别,我的理解是:________________________
  3. 三表连接时,我觉得最难的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么叫JOIN(连接)而不是MERGE(合并)?】

JOIN的意思是把多张表通过共同的字段"关联"起来,而不是简单地把表上下或左右拼接。想象你手里有两张便签纸:一张写着学生姓名和学号,另一张写着学号和成绩。JOIN就是根据"学号"这个共同信息,把两张便签纸上的内容对应着看——而不是把两张纸粘成一张大纸。

在实际的数据库设计中,一张大表通常会被拆分成多张相关的小表(这叫"规范化")。JOIN让我们在查询时又能把这些分散的信息"拼回"完整的画面。这就是为什么JOIN是关系数据库最核心的操作之一。



# 模块五 进阶功能

模块导语:当你已经能熟练地进行增删改查操作后,你可能会发现:查询越来越慢怎么办?有些复杂查询每次都要写一大段SQL,能不能简化?有些重复操作能不能自动化?本模块将带你学习索引、视图、存储过程三个进阶功能,它们就像数据库的"加速器""快捷方式"和"自动机器人",让你的数据库操作更高效、更智能。



# 【任务5-1】给数据建目录——索引的创建与使用 【C→T】


# ■ 任务呈现区

情境

学校图书馆有上万本书。如果没有目录柜,找一本书要一本一本翻,可能要翻几千本才能找到。但有了目录柜,按照书名或作者拼音排序,很快就能定位到书的存放位置。

数据库也是一样。当books表里有几万条记录时,SELECT * FROM books WHERE title = '数据库原理' 这条语句可能会很慢,因为数据库要一条一条比对。而索引就是数据库的"目录柜"——给title字段建索引后,数据库就能"跳"到目标位置,查询速度大幅提升。

学习目标

  1. 理解索引的概念和作用(用"目录柜"类比)
  2. 掌握CREATE INDEX创建索引的方法
  3. 掌握SHOW INDEX查看索引的方法
  4. 了解主键索引、普通索引、唯一索引的区别
  5. 能使用EXPLAIN命令查看查询是否使用了索引
  6. 能对比创建索引前后的查询效率差异

核心输出物

  • [ ] 为books表的title字段创建的索引截图(SHOW INDEX)
  • [ ] EXPLAIN对比截图(创建索引前 vs 创建索引后)
  • [ ] "索引知识对照表"填写完整
  • [ ] 索引优缺点分析(小组讨论结论)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:MySQL数据库对象——索引(Index)的创建与管理 行动维度:操作型任务(创建索引、对比验证、分析优缺点) 需求维度:能为图书馆数据库的常用查询字段建立索引,提升查询效率 向上穿透:为综合项目(模块六)中的数据库性能优化环节提供基础


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 讲解索引原理,组织对比实验
操作员 实际操作 执行CREATE INDEX、SHOW INDEX、EXPLAIN
记录员 文档记录 记录EXPLAIN结果对比,填写对照表
复核员 检查验证 检查索引是否创建成功,EXPLAIN结果是否正确

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、索引是什么?——"目录柜"类比

图书馆场景 数据库场景
图书馆有10万本书 books表有10万条记录
找《数据库原理》要一本一本翻 WHERE title = '数据库原理' 要一条一条比对
有了目录柜,按书名排序快速定位 有了索引,数据库能快速"跳"到目标位置
目录柜占用一些空间 索引也占用一些存储空间
新书入库时要更新目录柜 插入/修改数据时要更新索引

# 二、三种常见的索引类型

索引类型 创建方式 特点 适用场景
主键索引 建表时 PRIMARY KEY 自动创建 唯一、非空、每张表只能有一个 表的主键字段
普通索引 CREATE INDEX 索引名 ON 表(字段) 不唯一、可重复 经常用于查询条件的字段
唯一索引 CREATE UNIQUE INDEX ... 值不能重复 如身份证号、学号、邮箱等

# 三、索引的命令速查表

操作 命令模板 例子
创建普通索引 CREATE INDEX 索引名 ON 表名(字段名); CREATE INDEX idx_title ON books(title);
创建唯一索引 CREATE UNIQUE INDEX 索引名 ON 表名(字段名); CREATE UNIQUE INDEX idx_phone ON readers(phone);
查看表的索引 SHOW INDEX FROM 表名; SHOW INDEX FROM books;
删除索引 DROP INDEX 索引名 ON 表名; DROP INDEX idx_title ON books;

# 四、EXPLAIN命令——看查询"走没走索引"

EXPLAIN SELECT * FROM books WHERE title = '数据库原理';

执行后关注两个字段:

字段 含义 好坏判断
type 查询类型 ALL = 全表扫描(慢),ref/range = 用了索引(快)
key 实际使用的索引 NULL = 没用索引,有名字 = 用了这个索引

简化记忆:EXPLAIN结果中,如果 type = ALL,说明没走索引;如果 key 有值,说明走了索引。

# 五、索引的优缺点

✅ 优点 ❌ 缺点
查询速度大大提升 占用额外的存储空间
排序(ORDER BY)更快 插入、更新、删除时变慢(要维护索引)
唯一索引可防止数据重复 索引太多反而影响性能

# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解索引原理和三种类型 20分钟 组长 能说出索引和目录柜的类比
② 查看books表现有索引 15分钟 操作员 知道主键索引已经存在
③ 为title字段创建索引,并验证 30分钟 操作员 SHOW INDEX能看到新索引
④ 用EXPLAIN对比创建索引前后 40分钟 操作员+记录员 截图对比type和key字段
⑤ 讨论索引优缺点 35分钟 全组 每组说出2个优点2个缺点

# 行动方案

  1. 先确认books表有数据(至少几十条,数据越多效果越明显)
  2. 创建索引前,先用EXPLAIN记录"没索引"的状态
  3. 创建索引后,再用EXPLAIN记录"有索引"的状态
  4. 对比两次结果,体会索引的作用

# ■ 决策区

关键决策点:图书馆系统经常按书名查询图书,偶尔按作者查询,很少按出版社查询。以下哪些字段应该建索引?

字段 查询频率 是否建索引 理由
title(书名) 很高 □是 □否
author(作者) 偶尔 □是 □否
price(价格) 很少 □是 □否
stock(库存) 很少 □是 □否

我的选择及理由:________________________________________

提示:索引不是越多越好!只在"经常用于查询条件"的字段上建索引。


# ■ 展示区

展示内容清单

  • [ ] EXPLAIN对比截图(创建索引前 type=ALL vs 创建索引后 type=ref)
  • [ ] SHOW INDEX FROM books 的结果截图
  • [ ] 小组讨论:索引的2个优点和2个缺点

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:确认books表有数据并查看现有索引 【执行】

-- 1. 查看books表有多少条数据(数据越多,索引效果越明显)
SELECT COUNT(*) FROM books;

-- 记录:books表共有 ______ 条数据

-- 2. 查看books表已有的索引
SHOW INDEX FROM books;

-- 记录:目前已有的索引有 ______ 个,分别是 ________________________
-- 注意:主键(PRIMARY KEY)会自动创建主键索引

Step 2:创建索引前,先用EXPLAIN记录查询计划 【执行】

-- 执行一条按title查询的SQL,并用EXPLAIN看看数据库怎么执行的
EXPLAIN SELECT * FROM books WHERE title = '________';

-- 记录EXPLAIN结果:
-- type = ______ (如果是ALL,表示全表扫描)
-- key = ______ (如果是NULL,表示没用索引)
-- rows = ______ (扫描了多少行)

关键控制点:记录员截图保存!这是"创建索引前"的证据。

Step 3:为title字段创建普通索引 【执行】

-- 模板:CREATE INDEX 索引名 ON 表名(字段名);
-- 索引名习惯以 idx_ 开头
CREATE INDEX idx_title ON books(title);

执行后:

  • [ ] 看到 Query OK 提示了吗?□是 □否
  • [ ] 如果报错,错误信息是:________________________

Step 4:验证索引是否创建成功 【检查】

SHOW INDEX FROM books;

检查清单:

  • [ ] 列表中出现了 idx_title 吗?□是 □否
  • [ ] Key_name列里有idx_title吗?□是 □否
  • [ ] Column_name列对应的是title吗?□是 □否

Step 5:创建索引后,再次用EXPLAIN对比 【执行】

-- 用同样的查询条件,再次EXPLAIN
EXPLAIN SELECT * FROM books WHERE title = '________';

-- 记录EXPLAIN结果:
-- type = ______ (期待变成ref或range)
-- key = ______ (期待变成idx_title)
-- rows = ______ (期待变少)

对比表格(记录员填写):

对比项 创建索引前 创建索引后 变化说明
type
key
rows
结论

关键控制点:如果key还是NULL,检查:① 查询条件是不是title字段?② 索引真的创建成功了吗?③ 表的数据量是不是太少(数据太少时MySQL可能认为全表扫描更快)?

Step 6:尝试为phone字段创建唯一索引 【执行】

-- 模板:CREATE UNIQUE INDEX 索引名 ON 表名(字段名);
CREATE UNIQUE INDEX idx_phone ON readers(phone);

执行后思考:

  • 如果readers表里有重复的手机号,会报错吗?□会 □不会
  • 唯一索引的作用是什么?________________________

Step 7:删除索引(练习) 【执行】

-- 模板:DROP INDEX 索引名 ON 表名;
DROP INDEX idx_title ON books;

-- 删除后再SHOW INDEX确认
SHOW INDEX FROM books;

注意:为了后续任务正常使用,删除后请重新创建:CREATE INDEX idx_title ON books(title);


# ■ 成果提交区

交付物清单

  1. [ ] EXPLAIN对比截图(创建索引前 vs 创建索引后,拼在一张图里或两张图)
  2. [ ] SHOW INDEX FROM books 结果截图
  3. [ ] "索引知识对照表"(填写完整)
  4. [ ] 小组讨论结论:索引的2个优点、2个缺点、1个使用建议
  5. [ ] 本工单所有区域的填写内容

格式要求

  • 截图需清晰显示EXPLAIN的type、key、rows字段
  • 对比图建议标注"创建前"和"创建后"

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解索引像"目录柜" 完全不懂 大概知道 能类比解释 能举一反三
K2 功能性 我能正确创建和查看索引 总是报错 需要模板 能独立完成 能为多个字段建索引
K3 过程导向 我能用EXPLAIN验证索引效果 不会用 会执行 会对比分析 能判断索引是否生效
K4 解释与反思 我能分析索引的优缺点 说不出 能说1-2点 能全面分析 能结合实际场景判断
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
索引创建操作 20 CREATE INDEX语法是否正确
EXPLAIN分析 20 能否正确解读type和key字段
对比验证 20 是否有创建前后的对比证据
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
索引创建操作 20%
EXPLAIN分析 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 索引和主键的区别是:________________________
  2. EXPLAIN结果中,我看到type=ALL时应该:________________________
  3. 下次我决定是否为字段建索引时,会先问:________________________

# ■ 理论注解 ★(可选阅读)

【P1 索引是怎么让查询变快的?】

想象你要在一本没有页码、没有目录的1000页书里找到"索引"这个词。你只能从第一页开始,一页一页翻——最坏情况下要翻1000页。

现在给书加上"索引"(按字母排序的目录)。目录告诉你:"索引"这个词在书中出现在第384页、第512页和第891页。你直接翻到这几页就行了——只需3次"跳转"。

数据库的索引通常使用一种叫B+树的数据结构。简单来说,它把数据按顺序组织成一棵"树",每次查询都能"砍掉"一半的数据。比如100万条记录,不用索引要查100万次,用了索引最多只要查20次左右(因为2的20次方已经超过100万了)。这就是为什么索引能让查询快几十倍甚至上千倍。



# 【任务5-2】透过窗户看数据——视图的创建与应用 【C→T】


# ■ 任务呈现区

情境

学校图书馆的数据库里有好几张表,王老师经常想看"谁借了哪本书"这个信息。每次她都要写一大串JOIN语句,很麻烦。而且王老师不懂SQL,她只想像看Excel表一样直接看到结果。

这时候,视图就派上用场了。视图就像房间的窗户——你不用进房间,透过窗户就能看到里面的情况。在数据库里,视图就是一扇"虚拟的窗户":它本身不存储数据,但每次你"看"它的时候,它都会自动执行背后的SQL,把最新的结果展示给你。

学习目标

  1. 理解视图的概念和作用(用"窗户"类比)
  2. 掌握CREATE VIEW创建视图的方法
  3. 掌握从视图中查询数据的方法(和查表一样)
  4. 了解视图的更新限制(什么时候能改,什么时候不能改)
  5. 掌握DROP VIEW删除视图的方法
  6. 能创建"借阅详情视图"和"逾期未还视图"

核心输出物

  • [ ] "借阅详情视图"创建成功截图(SHOW CREATE VIEW)
  • [ ] "借阅详情视图"查询结果截图(SELECT * FROM view_borrow_detail)
  • [ ] "逾期未还视图"创建成功及查询截图
  • [ ] 视图vs真表对比分析

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:MySQL数据库对象——视图(View)的创建与管理 行动维度:操作型任务(创建视图、查询视图、分析优缺点) 需求维度:能为图书馆常用复杂查询创建视图,简化日常数据查看 向上穿透:为综合项目(模块六)中的"常用查询封装"和报表展示提供基础


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 讲解视图原理,组织"窗户"类比讨论
操作员 实际操作 执行CREATE VIEW、SELECT FROM VIEW、DROP VIEW
记录员 文档记录 记录视图定义SQL,截图查询结果
复核员 检查验证 检查视图是否创建成功,查询结果是否正确

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、视图是什么?——"窗户"类比

现实生活 数据库中的视图
房间里有家具(真表有数据) 数据库里有books、readers等真实表
窗户不存放家具,只是让你看到房间里面 视图不存放数据,只是让你看到查询结果
房间里的家具换了,透过窗户看到的内容也变了 真实表的数据变了,视图查出来的结果也自动变
你可以给窗户贴磨砂膜(限制看到的内容) 视图可以隐藏某些字段(如密码、价格),只展示部分信息

# 二、视图vs真表

对比项 真表(Table) 视图(View)
存储数据 ✅ 真的存数据 ❌ 不存数据,只存SQL定义
占用空间 占用较多 占用很少(只存SQL语句)
查询方式 SELECT * FROM books SELECT * FROM 视图名(完全一样)
数据更新 直接INSERT/UPDATE/DELETE 有些视图可以更新,有些不行(有限制)
创建方式 CREATE TABLE CREATE VIEW

# 三、视图的基本命令

操作 命令模板 例子
创建视图 CREATE VIEW 视图名 AS SELECT ...; CREATE VIEW v_books AS SELECT title, author FROM books;
查询视图 SELECT * FROM 视图名; SELECT * FROM v_books;
查看视图定义 SHOW CREATE VIEW 视图名; SHOW CREATE VIEW v_books;
删除视图 DROP VIEW 视图名; DROP VIEW v_books;

# 四、什么时候用视图?

场景 为什么用视图
经常要写很长的JOIN查询 把JOIN写成视图,以后直接 SELECT * FROM 视图
只想让用户看到部分字段 视图里只SELECT几个字段,隐藏敏感信息
经常要看某种统计结果 把统计SQL写成视图,随时查看最新结果

# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解视图原理 20分钟 组长 能用"窗户"类比解释视图
② 创建"借阅详情视图" 35分钟 操作员 CREATE VIEW执行成功
③ 从视图中查询并验证 25分钟 操作员 SELECT结果和多表JOIN一致
④ 创建"逾期未还视图" 30分钟 操作员 包含WHERE return_date IS NULL
⑤ 分析视图优缺点 30分钟 全组 讨论视图的适用场景

# 行动方案

  1. 先回顾任务4-4的多表JOIN SQL(视图就是把这个SQL"保存"起来)
  2. 用CREATE VIEW把JOIN语句"封装"成视图
  3. 像查表一样查视图,体会"简化"的效果
  4. 创建带WHERE条件的视图(逾期未还)

# ■ 决策区

关键决策点:图书馆系统有一个readers表,里面存了读者的手机号。王老师想给前台值班同学开放查询权限,但不想让他们看到手机号。以下哪种方案最好?

方案 做法 优点 缺点
A 直接给readers表权限,但告诉值班同学"不要查手机号" 简单 靠自觉,不安全
B 创建一个视图,只包含reader_name和register_date,给值班同学查视图 安全,只能看到允许的字段 需要额外创建视图
C 把readers表复制一份,删除手机号字段 也能达到目的 数据不同步,浪费空间

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] "借阅详情视图"的SHOW CREATE VIEW截图
  • [ ] SELECT * FROM view_borrow_detail 结果截图
  • [ ] "逾期未还视图"查询结果截图
  • [ ] 小组讨论:视图在图书馆系统中的3个应用场景

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:回顾多表JOIN查询(为创建视图做准备) 【执行】

-- 先执行这条我们学过的三表JOIN,确认结果正确
SELECT 
    r.reader_name,
    b.title,
    br.borrow_date,
    br.return_date
FROM readers r
JOIN borrow_records br ON r.reader_id = br.reader_id
JOIN books b ON br.book_id = b.book_id;

-- 记录:这条SQL查到了 ______ 条记录

关键控制点:创建视图前,一定要确保背后的SQL是正确的!视图只是"保存"SQL,不会帮你修正错误。

Step 2:创建"借阅详情视图"(view_borrow_detail) 【执行】

-- 模板:把上面正确的SELECT语句装进CREATE VIEW里
CREATE VIEW view_borrow_detail AS
SELECT 
    r.reader_name AS 读者姓名,
    b.title AS 图书名称,
    br.borrow_date AS 借阅日期,
    br.return_date AS 归还日期
FROM readers r
JOIN borrow_records br ON r.reader_id = br.reader_id
JOIN books b ON br.book_id = b.book_id;

执行后:

  • [ ] 看到 Query OK 了吗?□是 □否
  • [ ] 如果报错,错误信息是:________________________

Step 3:验证视图创建成功 【检查】

-- 方法1:查看视图的定义
SHOW CREATE VIEW view_borrow_detail;

-- 方法2:像查表一样查视图
SELECT * FROM view_borrow_detail;

-- 对比:查视图的结果条数和Step 1的JOIN结果条数一样吗?
-- Step 1查到 ______ 条,视图查到 ______ 条
-- □一致 □不一致

关键控制点:查视图和查表的语法完全一样!这就是视图的价值——把复杂的JOIN藏到背后。

Step 4:从视图中做条件查询 【执行】

-- 视图可以像表一样加WHERE条件!
-- 查询:李明借了哪些书?
SELECT * FROM view_borrow_detail WHERE 读者姓名 = '李明';

-- 查询:某本书被谁借了?
SELECT * FROM view_borrow_detail WHERE 图书名称 LIKE '%______%';

-- 查询:按借阅日期排序
SELECT * FROM view_borrow_detail ORDER BY 借阅日期 DESC;

Step 5:创建"逾期未还视图"(view_overdue) 【执行】

-- 模板:在视图定义里加上WHERE条件
CREATE VIEW view_overdue AS
SELECT 
    r.reader_name AS 读者姓名,
    b.title AS 图书名称,
    br.borrow_date AS 借阅日期
FROM readers r
JOIN borrow_records br ON r.reader_id = br.reader_id
JOIN books b ON br.book_id = b.book_id
WHERE br.return_date IS NULL;   -- 只包含未归还的记录

执行后验证:

SELECT * FROM view_overdue;
  • 这个视图里有______条记录
  • 这些记录有什么共同点?________________________

Step 6:验证"数据变化,视图结果自动变化" 【执行】

-- 假设某条借阅记录今天归还了,更新return_date
UPDATE borrow_records 
SET return_date = '2026-06-08' 
WHERE reader_id = 1 AND book_id = 3;

-- 再次查询逾期未还视图
SELECT * FROM view_overdue;

-- 记录:刚才归还的那条记录,还在视图里吗?□在 □不在了
-- 结论:视图的数据是______(实时/延迟)更新的

注意:UPDATE语句是修改真实表的数据,不是修改视图。执行后请和组长确认这条UPDATE是否合理,并在课后恢复数据(如果需要)。

Step 7:删除视图(练习) 【执行】

-- 模板:DROP VIEW 视图名;
DROP VIEW view_overdue;

-- 验证:删除后再SELECT会报错
SELECT * FROM view_overdue;
-- 报错信息:________________________

-- 为了后续任务,请重新创建view_overdue

# ■ 成果提交区

交付物清单

  1. [ ] "借阅详情视图"SHOW CREATE VIEW截图
  2. [ ] SELECT * FROM view_borrow_detail 结果截图
  3. [ ] "逾期未还视图"创建及查询截图
  4. [ ] 视图vs真表对比分析(至少3个对比点)
  5. [ ] 本工单所有区域的填写内容

格式要求

  • 截图清晰显示CREATE VIEW语句和查询结果
  • 视图查询结果需显示字段中文别名

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解视图像"窗户" 完全不懂 大概知道 能类比解释 能举一反三
K2 功能性 我能正确创建和查询视图 总是报错 需要模板 能独立完成 能创建带条件的视图
K3 过程导向 我先确认SQL正确再创建视图 直接创建 偶尔检查 规范执行 能验证数据同步
K4 解释与反思 我能解释视图和真表的区别 说不清 能说1-2点 能全面分析 能判断适用场景
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
视图创建操作 20 CREATE VIEW语法是否正确,JOIN是否完整
视图查询验证 20 是否能从视图中正确查询,是否验证数据同步
视图应用分析 20 能否说出视图的适用场景和限制
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
视图创建操作 20%
视图查询验证 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 创建视图前,我先要确认的是:________________________
  2. 视图和真表最大的区别是:________________________
  3. 我觉得视图在图书馆系统中最有用的场景是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 视图为什么不存储数据还能"自动更新"?】

你可以把视图理解为数据库里的一个"快捷方式"或"书签"。当你在电脑上创建一个网页快捷方式时,快捷方式本身不保存网页内容,但双击它就能打开最新的网页。如果网页内容变了,你再次打开快捷方式看到的就是新内容。

视图的工作原理完全一样。当你 SELECT * FROM 视图名 时,数据库实际上执行的是视图定义里的那条SELECT语句——它去查真实的表,然后把结果返回给你。所以真实表的数据一变,视图"看到"的内容自然也跟着变了。

正因为视图不存储数据,它占用的空间极小(只保存SQL语句文本),但也正因为不存储数据,视图不能提高查询速度——如果你背后的SQL很慢,视图也不会变快。



# 【任务5-3】自动化处理——存储过程基础 【C→T】


# ■ 任务呈现区

情境

王老师每天上班第一件事,就是看看"今天库里有多少本书"。以前她每次都要打开MySQL,写一条 SELECT COUNT(*) FROM books;,很繁琐。她问你:"能不能像按按钮一样,点一下就直接出结果?"

当然可以!数据库里有一种叫存储过程的东西,它可以把多条SQL语句"打包"成一个命令。你只需要执行这个命令名,数据库就会自动执行里面包好的所有SQL。就像微波炉的"一键加热"按钮——你不需要知道微波炉里面怎么工作,按一下按钮就搞定。

学习目标

  1. 理解存储过程的概念和作用(用"打包的SQL命令"类比)
  2. 掌握DELIMITER修改结束符的方法(解决分号冲突问题)
  3. 掌握CREATE PROCEDURE创建存储过程的语法
  4. 掌握CALL调用存储过程的方法
  5. 能创建无参数的存储过程(查询所有图书、统计图书总数)
  6. 能在MySQL Workbench中创建、调用和删除存储过程

核心输出物

  • [ ] 存储过程proc_show_all_books创建成功截图
  • [ ] CALL proc_show_all_books() 执行结果截图
  • [ ] 存储过程proc_count_books创建及执行截图
  • [ ] "存储过程创建步骤"流程图(手绘)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:MySQL编程对象——存储过程(Stored Procedure)基础 行动维度:编程型任务(编写、创建、调用、删除存储过程) 需求维度:能将常用SQL查询封装为存储过程,实现"一键执行" 向上穿透:为带参数的存储过程(任务5-4)和综合项目中的业务逻辑封装提供基础


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 讲解存储过程原理,带领全组逐行理解代码
操作员 实际操作 在MySQL Workbench中创建和调用存储过程
记录员 文档记录 记录存储过程代码、执行结果、错误信息
复核员 检查验证 检查存储过程语法,验证调用结果是否正确

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、存储过程是什么?——"打包的SQL命令"

生活场景 数据库中的存储过程
手机上的"快捷指令" 把多个操作打包成一个命令
微波炉的"一键加热" 按一下按钮,自动执行一系列操作
游戏中的"宏命令" 按一个键,自动释放一套技能
存储过程 给一个SQL集合起个名字,以后叫名字就执行整套SQL

# 二、为什么要用存储过程?

优点 说明
省事儿 复杂SQL只需写一次,以后直接CALL
复用 多个人、多个地方可以用同一个存储过程
预编译 数据库会提前"准备"好执行计划,执行更快
安全 可以限制用户只能调用存储过程,不能直接操作表

# 三、存储过程的基本语法结构

-- 第1步:修改结束符(把分号改成其他符号,比如 //)
DELIMITER //

-- 第2步:创建存储过程
CREATE PROCEDURE 存储过程名()
BEGIN
    -- 这里面写你要打包的SQL语句
    SQL语句1;
    SQL语句2;
END //

-- 第3步:改回分号
DELIMITER ;

-- 第4步:调用存储过程
CALL 存储过程名();

# 四、为什么需要DELIMITER?

问题 解释
正常情况下 你输入一个分号 ;,MySQL就以为这条命令结束了,立刻执行
存储过程的问题 存储过程里面有很多SQL,每个SQL后面都有分号。如果在第一个分号就执行,后面的SQL就丢了
DELIMITER的作用 把"结束符号"临时改成别的(比如 //),这样存储过程里的分号就不会提前结束命令
创建完再改回来 恢复成正常的分号,方便后续使用

# 五、存储过程常用命令速查

操作 命令模板 例子
创建 DELIMITER // CREATE PROCEDURE 名字() BEGIN ... END // DELIMITER ; 见上方
调用 CALL 存储过程名(); CALL proc_show_all_books();
查看定义 SHOW CREATE PROCEDURE 存储过程名; SHOW CREATE PROCEDURE proc_show_all_books;
删除 DROP PROCEDURE 存储过程名; DROP PROCEDURE proc_show_all_books;

# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解存储过程原理和DELIMITER 25分钟 组长 能解释为什么要改结束符
② 创建proc_show_all_books并调用 35分钟 操作员 CALL成功,显示所有图书
③ 创建proc_count_books并调用 30分钟 操作员 CALL成功,显示图书总数
④ 验证、查看定义、删除再重建 30分钟 复核员 掌握完整生命周期

# 行动方案

  1. 全组逐行"读"懂存储过程代码的每个部分
  2. 操作员在Workbench中完整输入(注意DELIMITER的使用)
  3. 每创建一个存储过程,立刻CALL验证
  4. 复核员检查:执行结果和直接执行SQL的结果一致吗?

# ■ 决策区

关键决策点:王老师每天要看三件事:①有多少本书 ②有多少读者 ③今天有多少本逾期未还。以下哪种方案最好?

方案 做法 优点 缺点
A 每天写三条SQL执行 灵活 麻烦,容易写错
B 创建一个存储过程,把三条SQL打包进去,每天CALL一次 一键完成 需要提前创建
C 创建一个视图 也能查 视图里不能放多条独立的SELECT

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 存储过程proc_show_all_books的完整代码(展示在屏幕上或工单中)
  • [ ] CALL proc_show_all_books() 的执行结果截图
  • [ ] 存储过程proc_count_books的执行结果截图
  • [ ] 手绘"创建→调用→删除"流程图

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:理解存储过程的结构(全组一起读) 【执行】

-- ============================================
-- 示例:创建一个"查询所有图书"的存储过程
-- ============================================

-- 第1步:把结束符改成 //(防止分号提前结束)
DELIMITER //

-- 第2步:创建存储过程
CREATE PROCEDURE proc_show_all_books()   -- proc_开头是命名习惯
BEGIN
    SELECT * FROM books;                 -- 要打包的SQL语句
END //

-- 第3步:把结束符改回分号
DELIMITER ;

全组讨论:

  • DELIMITER // 是什么意思?________________________
  • BEGINEND 中间放什么?________________________
  • 存储过程的名字可以随便取吗?□可以 □建议有规律(如proc_开头)

Step 2:创建第一个存储过程(查询所有图书) 【执行】

-- 请在MySQL Workbench中完整输入以下代码(包括DELIMITER)
DELIMITER //
CREATE PROCEDURE proc_show_all_books()
BEGIN
    SELECT book_id, title, author, price, category, stock 
    FROM books;
END //
DELIMITER ;

操作提示:在MySQL Workbench中,可以把上述代码一次性粘贴到Query Tab中,然后选中所有代码,点击闪电按钮执行。

执行后检查:

  • [ ] 看到 Query OK 了吗?□是 □否
  • [ ] 如果报错,记录错误信息:________________________

Step 3:调用存储过程 【执行】

-- 调用存储过程(就像调用函数一样)
CALL proc_show_all_books();

执行后对比:

  • 直接执行 SELECT book_id, title, author, price, category, stock FROM books; 的结果
  • CALL存储过程的结果
  • 两个结果□一致 □不一致

关键控制点:存储过程只是把SQL"打包"了,执行的结果和直接执行SQL完全一样

Step 4:创建第二个存储过程(统计图书总数) 【执行】

-- 模板:创建"统计图书总数"的存储过程
DELIMITER //
CREATE PROCEDURE proc_count_books()
BEGIN
    SELECT COUNT(*) AS 图书总数 FROM books;
END //
DELIMITER ;

执行后:

CALL proc_count_books();

记录结果:图书总数 = ______ 本

Step 5:创建第三个存储过程(多条SQL打包) 【执行】

-- 模板:把"查询图书总数"和"查询读者总数"打包在一起
DELIMITER //
CREATE PROCEDURE proc_show_counts()
BEGIN
    SELECT COUNT(*) AS 图书总数 FROM books;
    SELECT COUNT(*) AS 读者总数 FROM readers;
    SELECT COUNT(*) AS 借阅记录数 FROM borrow_records;
END //
DELIMITER ;

调用:

CALL proc_show_counts();

记录结果:

  • 图书总数 = ______
  • 读者总数 = ______
  • 借阅记录数 = ______

关键控制点:一个存储过程里可以有多条SQL,CALL一次会依次执行所有SQL,结果会分多个表格显示。

Step 6:查看存储过程定义 【检查】

SHOW CREATE PROCEDURE proc_show_all_books;

观察结果:能看到我们写的SQL代码吗?□能 □不能

Step 7:删除存储过程(练习) 【执行】

-- 模板:DROP PROCEDURE 存储过程名;
DROP PROCEDURE proc_show_counts;

-- 验证:删除后再CALL会报错
CALL proc_show_counts();
-- 报错信息:________________________

# ■ 成果提交区

交付物清单

  1. [ ] proc_show_all_books的创建和调用截图
  2. [ ] proc_count_books的创建和调用截图
  3. [ ] proc_show_counts的调用结果截图(显示3个统计数字)
  4. [ ] 手绘"创建→调用→删除"流程图
  5. [ ] 本工单所有区域的填写内容

格式要求

  • 截图需包含完整的存储过程代码和执行结果
  • 流程图需标注DELIMITER、CREATE PROCEDURE、CALL、DROP四个关键步骤

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解存储过程是"打包的SQL" 完全不懂 大概知道 能类比解释 能举一反三
K2 功能性 我能正确创建和调用存储过程 总是报错 需要模板 能独立完成 能创建多SQL存储过程
K3 过程导向 我能正确使用DELIMITER 总是忘 偶尔出错 规范使用 能解释原理
K4 解释与反思 我能说出存储过程和视图的区别 说不清 能说1点 能区分清楚 能判断使用场景
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
存储过程创建 20 CREATE PROCEDURE语法是否正确,DELIMITER是否使用正确
存储过程调用 20 CALL是否能正确执行,结果是否正确
多SQL打包 20 是否能创建包含多条SQL的存储过程
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
存储过程创建 20%
存储过程调用 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. 写存储过程时,我最容易忘记的是:________________________
  2. DELIMITER的作用是:________________________
  3. 我觉得存储过程比直接写SQL方便的地方有:________________________

# ■ 理论注解 ★(可选阅读)

【P1 存储过程的"预编译"是什么意思?】

当你第一次执行一条SQL时,数据库要做很多事:检查语法对不对、分析你要查哪张表、选择最快的查询方法(这叫"执行计划")、然后才真正去取数据。这个过程要花一些时间。

存储过程在创建的时候就会完成语法检查和执行计划分析。以后每次CALL它,数据库就直接按照已经准备好的计划执行,跳过了前面的准备步骤。就像食堂的套餐——厨师提前把菜配好了,你一点餐马上就能端上来,而不是每次都从买菜开始。

对于需要频繁执行的复杂SQL,这种"预编译"特性能让执行速度快很多。



# 【任务5-4】带判断的业务逻辑——存储过程进阶 【C→T】


# ■ 任务呈现区

情境

上节课我们学会了把SQL"打包"成存储过程,但那些存储过程只是"按顺序执行SQL",还没有"脑子"——不会判断、不会做决定。现实生活中,图书馆借书是有规矩的:借书前要看这本书还有没有库存;还书时要确认这本书确实是这个人借的。

这节课我们要给存储过程加上"脑子":

  • 参数:让存储过程能接收"输入"(比如读者ID、图书ID)
  • 变量:在存储过程内部临时存一个数
  • IF判断:根据条件做不同的事(如果库存大于0,才能借;否则提示"没书了")
  • 循环:重复做某件事

这是本课程最难的任务之一,但我们一步一步来,你一定能学会!

学习目标

  1. 理解存储过程参数(IN、OUT、INOUT)的概念和用法
  2. 掌握变量声明(DECLARE)和赋值的方法
  3. 掌握IF...THEN...ELSE...END IF条件判断语句
  4. 了解WHILE...DO...END WHILE循环语句
  5. 能创建带参数的借书存储过程(判断库存是否大于0)
  6. 能创建带参数的还书存储过程

核心输出物

  • [ ] 借书存储过程(proc_borrow_book)创建及测试截图
  • [ ] 还书存储过程(proc_return_book)创建及测试截图
  • [ ] 带OUT参数的存储过程测试截图
  • [ ] 小组"存储过程执行流程图"(手绘,标注IF分支)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:MySQL编程对象——存储过程进阶(参数、变量、条件判断、循环) 行动维度:编程型任务(编写带业务逻辑的存储过程) 需求维度:能用存储过程实现图书馆借书、还书等业务规则判断 向上穿透:为综合项目(模块六)中的核心业务逻辑封装(借书、还书、逾期判断)提供关键技能


# ■ 分组与角色分配

分组原则:4人/组,同模块内保持固定分组

角色 职责 本任务具体工作
组长 统筹协调 逐行讲解存储过程代码,带领全组画流程图
操作员 实际操作 在MySQL Workbench中创建和执行存储过程
记录员 文档记录 记录每次CALL的参数和结果,画流程图
复核员 检查验证 验证借书/还书后数据是否正确变化

轮换规则:本次操作员下次做记录员,记录员下次做操作员,组长和复核员互换

小组公约





# ■ 知识准备区

# 一、给存储过程加"参数"——让它更灵活

参数类型 含义 生活类比 例子
IN 输入参数,调用时传入值 告诉微波炉"加热2分钟" IN p_reader_id INT
OUT 输出参数,存储过程传回值 微波炉"叮"完告诉你"已完成" OUT p_result VARCHAR(50)
INOUT 既能输入又能输出 你给一个数,它改完还给你 (本任务暂不学)

# 二、变量——存储过程内部的"临时记事本"

DECLARE v_stock INT DEFAULT 0;   -- 声明一个整数变量,初始值为0
SET v_stock = 5;                 -- 给变量赋值
操作 语法 说明
声明变量 DECLARE 变量名 数据类型 [DEFAULT 默认值]; 必须放在BEGIN之后的最前面
赋值 SET 变量名 = 值; 把右边的值存到变量里
查询赋值 SELECT 字段 INTO 变量名 FROM ...; 把查到的结果存到变量里

# 三、IF判断——让存储过程有"脑子"

IF 条件 THEN
    -- 如果条件成立,执行这里
ELSE
    -- 如果条件不成立,执行这里
END IF;

生活类比

如果 冰箱里有鸡蛋 那么
    煎鸡蛋
否则
    去买鸡蛋
结束判断

# 四、WHILE循环——重复做一件事

WHILE 条件 DO
    -- 只要条件成立,就反复执行这里
END WHILE;

本任务重点掌握:IN参数、OUT参数、DECLARE变量、IF判断。WHILE循环了解即可。


# ■ 计划区

# 子目标分解

子目标 预计时间 负责人 完成标记
① 理解参数、变量、IF判断的概念 25分钟 组长 能说出IN和OUT的区别
② 创建并测试带IN/OUT参数的存储过程 30分钟 操作员 CALL成功,得到输出
③ 创建借书存储过程(判断库存) 35分钟 操作员 能借书成功,也能提示"无库存"
④ 创建还书存储过程 30分钟 操作员 还书后return_date有值

# 行动方案

  1. 先学一个简单的"带参数"存储过程,理解IN和OUT
  2. 再学借书存储过程,逐行理解IF判断
  3. 每创建一个存储过程,用不同的参数CALL多次,验证各种情况
  4. 复核员重点检查:借书后stock减少了1吗?还书后return_date有值吗?

# ■ 决策区

关键决策点:借书时,如果库存为0,以下哪种处理方式最合适?

方案 处理方式 优点 缺点
A 直接报错,终止执行 简单 用户体验差
B 用IF判断,库存为0时输出提示信息"该书暂无库存",不执行借书 友好 需要写IF判断
C 自动把库存改成-1(允许超借) 不会借失败 数据不合理

我的选择:□A □B □C

选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 借书存储过程完整代码(展示在屏幕或工单上)
  • [ ] 借书成功和借书失败(库存不足)的两次CALL结果截图
  • [ ] 还书存储过程完整代码及CALL结果截图
  • [ ] 手绘"借书存储过程执行流程图"(标注IF的两个分支)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:创建带IN和OUT参数的存储过程(入门练习) 【执行】

-- ============================================
-- 练习:创建一个"查询某本书库存"的存储过程
-- 输入:图书ID(IN参数)
-- 输出:库存数量和书名(OUT参数)
-- ============================================

DELIMITER //
CREATE PROCEDURE proc_get_book_stock(
    IN p_book_id INT,           -- 输入参数:要查哪本书
    OUT p_stock INT,            -- 输出参数:库存数量
    OUT p_title VARCHAR(100)    -- 输出参数:书名
)
BEGIN
    -- 把查到的stock和title存到输出参数里
    SELECT stock, title 
    INTO p_stock, p_title 
    FROM books 
    WHERE book_id = p_book_id;
END //
DELIMITER ;

调用方法(注意:OUT参数需要用变量接收):

-- 定义变量来接收OUT参数
SET @v_stock = 0;
SET @v_title = '';

-- 调用存储过程,传入book_id=1
CALL proc_get_book_stock(1, @v_stock, @v_title);

-- 查看返回的结果
SELECT @v_stock AS 库存数量, @v_title AS 书名;

执行后记录:

  • book_id=1的书名是:________________
  • 库存数量是:________________

Step 2:创建借书存储过程(核心业务逻辑) 【执行】

-- ============================================
-- 借书存储过程
-- 功能:输入读者ID和图书ID,判断能否借书
-- 规则:如果库存>0,允许借书(库存减1,添加借阅记录);否则提示无库存
-- ============================================

DELIMITER //
CREATE PROCEDURE proc_borrow_book(
    IN p_reader_id INT,     -- 输入:谁借书
    IN p_book_id INT        -- 输入:借哪本书
)
BEGIN
    -- 第1步:声明变量(临时记事本)
    DECLARE v_stock INT DEFAULT 0;      -- 记录这本书的库存
    DECLARE v_title VARCHAR(100);       -- 记录这本书的书名
    
    -- 第2步:查询这本书的库存和书名
    SELECT stock, title 
    INTO v_stock, v_title 
    FROM books 
    WHERE book_id = p_book_id;
    
    -- 第3步:判断库存是否足够(IF判断是核心!)
    IF v_stock > 0 THEN
        -- 分支A:库存足够,可以借书
        
        -- A1:库存减1
        UPDATE books 
        SET stock = stock - 1 
        WHERE book_id = p_book_id;
        
        -- A2:添加借阅记录
        INSERT INTO borrow_records (reader_id, book_id, borrow_date, return_date) 
        VALUES (p_reader_id, p_book_id, CURDATE(), NULL);
        
        -- A3:输出成功信息
        SELECT CONCAT('借书成功!《', v_title, '》已借出,当前库存:', v_stock - 1) AS 结果;
        
    ELSE
        -- 分支B:库存不足,不能借书
        SELECT CONCAT('借书失败!《', v_title, '》暂无库存。') AS 结果;
        
    END IF;
    
END //
DELIMITER ;

逐行理解提示

  • DECLARE:在"小本本"上记下来,我要用v_stock和v_title这两个变量
  • SELECT ... INTO ...:去books表里查,把查到的stock和title填到小本本上
  • IF v_stock > 0 THEN:看看小本本上的库存,如果大于0就执行A分支
  • UPDATE ... SET stock = stock - 1:把库存减1(书被借走一本)
  • INSERT INTO borrow_records ...:在借阅记录表里加一条新记录
  • ELSE:如果库存不大于0(就是0或负数),执行B分支
  • END IF:IF判断结束

Step 3:测试借书存储过程(多种情况) 【执行+检查】

测试情况1:正常借书(库存足够)

-- 先查看某本书当前的库存(假设book_id=1)
SELECT book_id, title, stock FROM books WHERE book_id = 1;
-- 记录:book_id=1的库存是 ______

-- 执行借书(假设reader_id=1借book_id=1)
CALL proc_borrow_book(1, 1);

-- 借书后再次查看库存
SELECT book_id, title, stock FROM books WHERE book_id = 1;
-- 记录:借书后库存变为 ______(应该比原来少1)

-- 查看借阅记录表,是否有新记录
SELECT * FROM borrow_records WHERE reader_id = 1 AND book_id = 1 ORDER BY borrow_date DESC;
-- 记录:最新的借阅记录return_date是 ______(应该是NULL,表示未归还)

复核员检查:

  • [ ] 库存真的减少了1吗?
  • [ ] borrow_records表里新增了一条记录吗?
  • [ ] 新增记录的return_date是NULL吗?

测试情况2:库存不足(借书失败)

-- 找一个stock=0的书,或者连续借同一本书直到库存为0
-- 然后再次调用:
CALL proc_borrow_book(2, ____);  -- 填一个库存为0的book_id

-- 记录:输出信息是 ________________________
-- 检查:库存为0的书,borrow_records表里没有新增记录?□是 □否

关键控制点:IF判断是本任务的核心!一定要测试"成功"和"失败"两种情况,确保两个分支都正确。

Step 4:创建还书存储过程 【执行】

-- ============================================
-- 还书存储过程
-- 功能:输入读者ID和图书ID,办理还书
-- 规则:把借阅记录里的return_date改为今天,库存加1
-- ============================================

DELIMITER //
CREATE PROCEDURE proc_return_book(
    IN p_reader_id INT,     -- 输入:谁还书
    IN p_book_id INT        -- 输入:还哪本书
)
BEGIN
    -- 第1步:更新借阅记录,把return_date从NULL改成今天
    UPDATE borrow_records 
    SET return_date = CURDATE() 
    WHERE reader_id = p_reader_id 
      AND book_id = p_book_id 
      AND return_date IS NULL;   -- 只更新未归还的记录
    
    -- 第2步:库存加1(书还回来了)
    UPDATE books 
    SET stock = stock + 1 
    WHERE book_id = p_book_id;
    
    -- 第3步:输出成功信息
    SELECT '还书成功!' AS 结果;
    
END //
DELIMITER ;

调用测试:

-- 先查看当前库存
SELECT book_id, title, stock FROM books WHERE book_id = 1;

-- 调用还书(reader_id=1还book_id=1)
CALL proc_return_book(1, 1);

-- 查看还书后的库存(应该加1)
SELECT book_id, title, stock FROM books WHERE book_id = 1;

-- 查看借阅记录(return_date应该有值了)
SELECT * FROM borrow_records WHERE reader_id = 1 AND book_id = 1 ORDER BY borrow_date DESC;

Step 5:创建带循环的存储过程(了解即可) 【执行】

-- ============================================
-- 练习:创建一个循环,输出1到5的数字
-- ============================================

DELIMITER //
CREATE PROCEDURE proc_loop_demo()
BEGIN
    DECLARE v_num INT DEFAULT 1;
    
    WHILE v_num <= 5 DO
        SELECT v_num AS 当前数字;
        SET v_num = v_num + 1;
    END WHILE;
    
END //
DELIMITER ;

调用:

CALL proc_loop_demo();

注意:循环在图书馆系统中的典型应用是"批量处理",如"给所有逾期未还的读者发送提醒"。本任务了解语法即可,综合项目中可能会用到。

Step 6:画"借书存储过程流程图" 【执行】

记录员在纸上画出借书存储过程的执行流程:

开始
  │
  ▼
输入:reader_id, book_id
  │
  ▼
查books表 → 得到stock和title
  │
  ▼
stock > 0 ?
  │
 ├── 是 ──► stock减1 ──► 添加借阅记录 ──► 输出"借书成功"
 │
 └── 否 ──► 输出"借书失败,无库存"
  │
  ▼
结束

# ■ 成果提交区

交付物清单

  1. [ ] 借书存储过程完整代码截图
  2. [ ] 借书成功测试结果截图(含库存变化和新增借阅记录)
  3. [ ] 借书失败测试结果截图(含提示信息)
  4. [ ] 还书存储过程完整代码及测试结果截图
  5. [ ] 手绘借书流程图(标注IF的两个分支)
  6. [ ] 本工单所有区域的填写内容

格式要求

  • 截图需包含完整的存储过程代码
  • 测试截图需显示CALL前后的数据变化(如stock前后对比)

# ■ 评价反思区

一、COMET K1-K8自评表格

K标准 评价维度 1分 2分 3分 4分
K1 直观性 我能理解参数、变量、IF判断的作用 完全不懂 大概知道 能独立解释 能教别人
K2 功能性 我能创建带参数和IF判断的存储过程 总是报错 需要模板 能修改完成 能独立编写
K3 过程导向 我能测试多种情况(成功/失败) 只测一种 偶尔测试 规范测试 能发现边界问题
K4 解释与反思 我能解释借书存储过程的逻辑 说不清 能说大概 能说清楚 能画流程图
K5 创新性 我能思考存储过程还能做什么 想不出 能说1个 能说2-3个 能结合实际需求设计
K6 社会责任 我积极参与小组协作 不参与 偶尔参与 积极配合 主动协调

二、同伴互评表格

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域是否完整填写
参数与变量使用 20 IN/OUT参数、DECLARE变量是否正确
IF判断逻辑 20 条件判断是否正确,两个分支是否都处理了
业务功能实现 20 借书/还书后数据是否正确变化
团队协作 20 角色分工、互相帮助
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20%
参数与变量使用 20%
IF判断逻辑 20%
同伴互评 20% 协作系数加权
自评反思 10%
组间互评 10%
个人最终得分 100%

小组排名:第______名 / 共______组

五、个人改进计划

  1. IF判断中,我最容易写错的是:________________________
  2. DECLARE变量和SET赋值的区别是:________________________
  3. 我觉得存储过程在图书馆系统中最实用的功能是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 存储过程中的事务处理(拓展知识)】

在实际的数据库系统中,借书操作通常需要用到"事务"(Transaction)。事务的意思是:一组操作要么全部成功,要么全部失败,不会出现"库存减了但借阅记录没加上"这种半成品状态。

例如,如果借书过程中发生了断电或错误,可能出现:

  • books表的stock已经减了1
  • 但borrow_records表里没加上新记录

这就导致"书没了,但查不到谁借的"——数据不一致。事务就是用来防止这种问题的。MySQL中可以用 START TRANSACTIONCOMMIT(提交,确认修改)和 ROLLBACK(回滚,撤销修改)来实现。

本任务为了简化学习,没有引入事务,但在真实项目中,涉及多个表修改的操作都应该放在事务里。这是从"学生作业"走向"企业项目"的重要一步。



# 模块六 综合项目实战

模块导语:经过前面五个模块的学习,你已经掌握了数据库的基本概念、E-R图设计、MySQL的安装与使用、数据表的创建与管理、SQL增删改查、索引、视图和存储过程等知识和技能。现在,是时候把这些碎片拼成一幅完整的画了!本模块中,你的小组将独立为图书馆完成一个完整的"图书借阅管理系统"数据库项目——从需求分析、设计、建库、建表、录入数据,到开发视图和存储过程、测试优化,最后进行项目汇报。记住:遇到困难不要怕,前面模块学过的知识就是你的工具箱,附录中的速查卡就是你的"作弊小抄"。



# 【任务6-1】项目启动——系统需求分析与分工 【C→T】


# ■ 任务呈现区

情境:学校图书馆的王馆长找到你们小组,说:"听说你们在学习数据库,能不能帮我们做一个图书借阅管理系统?我们现在用Excel管,实在受不了了。"王馆长提了几个基本要求:要能管书、管读者、管借还、能查统计。但具体要做哪些功能,王馆长说"你们专业,你们定"。今天,你们小组需要把王馆长的"模糊需求"变成"清晰的功能清单",并制定项目计划。

学习目标

  1. 能将用户的模糊需求转化为具体的功能模块(至少6个功能点)
  2. 能根据功能模块进行合理的小组分工
  3. 能绘制简化的项目进度甘特图(用表格或横道图表示)
  4. 能撰写一份简洁的项目启动说明书

核心输出物

  • [ ] 系统需求功能清单(至少6个功能点,用勾选框形式)
  • [ ] 小组分工表(含角色、职责、负责模块)
  • [ ] 项目进度甘特图(简化版,覆盖任务6-1至6-7)
  • [ ] 项目启动说明书(1页纸)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:⑤ 综合项目型(需求分析+项目规划+团队协作)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L2→L3 | 核心K标准:K1/K3/K6/K7

向上穿透:T层"项目需求分析与分工"→C层"数据库项目启动能力"→P层"软件项目规划能力"→G层"系统思维与项目管理素养"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。本任务为模块六首个任务,建议重新确认组长(优先选择前面模块表现积极、组织能力强的学生)。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 主持需求讨论、分配模块任务、统筹进度 项目管理与沟通协调能力
操作员 在电脑上填写需求清单模板、绘制甘特图 工具使用与规范执行能力
记录员 记录讨论要点、撰写项目启动说明书 文档撰写与信息整合能力
复核员 核对功能点是否完整、检查分工是否合理 质量复核与批判性思维能力

轮换规则:模块六内每2个任务轮换一次角色(6-1/6-2一轮,6-3/6-4一轮,6-5/6-6一轮,6-7单独一轮)。

小组公约(各组在第一次课共同制定并签名):





# ■ 知识准备区

1. 什么是需求分析?

需求分析就是"把用户想要什么"变成"我们要做什么"。就像你帮同学带饭,同学说"随便",你得追问:"吃面还是吃饭?要不要辣?预算多少?"

图书馆管理系统的常见功能模块

模块 功能说明 举例
图书管理 录入新书、修改图书信息、删除下架图书 新增《Python入门》到系统
读者管理 注册新读者、修改读者信息、注销读者 给大一新生批量办理借书证
借阅管理 办理借书、办理还书、续借 张三借走《数据库原理》
查询统计 按条件查书、查读者、查借阅记录、统计报表 查"谁借了书没还"
逾期管理 自动计算逾期天数、生成逾期名单 生成"逾期30天以上名单"
系统维护 数据备份、权限管理、日志查看 每月备份一次数据库

2. 需求清单模板(可直接勾选和补充)

序号 功能模块 具体功能点 优先级 是否选中
1 图书管理 录入新书信息(书名、作者、出版社、ISBN、价格、分类)
2 图书管理 修改图书信息
3 图书管理 删除下架图书
4 图书管理 按书名/作者/ISBN查询图书
5 读者管理 注册新读者(姓名、学号/工号、班级/部门、电话)
6 读者管理 修改读者信息
7 读者管理 注销读者
8 借阅管理 办理借书(记录读者、图书、借出日期)
9 借阅管理 办理还书(记录归还日期、计算是否逾期)
10 借阅管理 图书续借
11 查询统计 查询某读者的借阅历史
12 查询统计 查询某图书的借阅情况
13 查询统计 生成逾期未还列表
14 查询统计 热门图书排行榜
15 其他 ________________________
16 其他 ________________________

3. 甘特图怎么做(简化版)

甘特图就是"横着的时间表",左边列任务,上面是时间,用横条表示每个任务做多久。

示例

任务 第1周 第2周 第3周 第4周
需求分析 ████
E-R图设计 ████
建库建表 ████
...

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
理解需求 阅读知识准备区,明确图书馆管理系统的常见功能 30分钟
讨论选型 小组讨论,从模板中勾选功能点,补充自定义功能 45分钟
分工排期 确定每人负责的模块,绘制甘特图 45分钟
撰写说明书 整理成1页纸的项目启动说明书 30分钟
展示交流 各组展示功能清单和甘特图,互相补充 30分钟

行动方案

  1. 组长组织讨论:图书馆目前最痛的问题是什么?(数据重复?查询慢?逾期难管?)
  2. 操作员打开需求清单模板,小组一起勾选功能点
  3. 记录员记录讨论中产生的"其他"功能需求
  4. 根据功能模块进行分工(如:A负责图书相关、B负责读者相关……)
  5. 用表格或Excel绘制甘特图
  6. 记录员整理项目启动说明书

# ■ 决策区

关键决策点:哪些功能是"必须有"的,哪些是"最好有"的?

你们小组的预算和时间有限(4周完成),以下功能如何取舍?

方案 核心策略 包含功能 优点 风险
A 精简实用 只选6个最高优先级功能 确保完成、质量高 系统功能较简单,展示时不够丰富
B 全面覆盖 选10个以上功能 展示效果好、覆盖全面 时间紧张,可能做不完
C 核心+亮点 选8个基础功能+1个创新功能 既有基础又有亮点 创新功能可能遇到技术难题

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 系统需求功能清单(勾选状态清晰,至少6个功能点)
  • [ ] 小组分工表(每人职责明确)
  • [ ] 项目进度甘特图(覆盖6-1到6-7)
  • [ ] 项目启动说明书(1页纸,含项目目标、范围、分工、里程碑)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:需求讨论与功能勾选 【执行】

  1. 组长提问引导讨论:
    • 图书馆管理员每天最常用的操作是什么?________
    • 学生借书时最常问的问题是什么?________
    • 馆长最头疼的统计需求是什么?________
  2. 操作员在电脑上打开需求清单模板
  3. 小组逐条讨论,决定勾选哪些功能(至少选6条,建议选8-10条)
  4. 复核员检查:每个被选中的功能是否都能说清"这个功能解决什么问题"

关键控制点:选中的每个功能都要对应一个"用户痛点",不能为了凑数而选。

Step 2:小组分工 【执行】

填写小组分工表:

学号 姓名 角色 负责模块 具体任务
组长 统筹协调 主持讨论、把控进度、组织汇报

Step 3:绘制甘特图 【执行】

用以下表格模板绘制(在对应格子打"█"):

任务/周次 第1周 第2周 第3周 第4周
6-1 需求分析与分工
6-2 E-R图与关系模型
6-3 建库建表
6-4 数据初始化
6-5 视图与存储过程
6-6 系统测试与优化
6-7 项目汇报

Step 4:撰写项目启动说明书 【执行】

记录员根据以下模板撰写(1页A4纸):

【项目启动说明书】
项目名称:图书馆借阅管理系统数据库项目
项目小组:第___组
小组成员:________、________、________、________

一、项目背景
学校图书馆目前使用Excel管理图书和借阅记录,存在________、________等问题。

二、项目目标
设计并实现一套数据库系统,实现________、________、________等功能。

三、功能范围(打√的为本期实现)
□ 图书管理  □ 读者管理  □ 借阅管理  □ 查询统计  □ 其他:______

四、小组分工
(粘贴上面的分工表)

五、里程碑计划
(粘贴甘特图关键节点)

六、风险与应对
可能遇到的风险:________
应对方案:________

Step 5:复核检查 【检查】

复核员逐项检查:

  • □ 功能清单≥6项,每项都有明确说明
  • □ 分工表4人都有明确职责
  • □ 甘特图覆盖全部7个任务
  • □ 项目启动说明书1页纸内完成

# ■ 成果提交区

交付物清单

  1. [ ] 系统需求功能清单(至少6个功能点,有勾选标记)
  2. [ ] 小组分工表(含角色、负责模块、具体任务)
  3. [ ] 项目进度甘特图(简化版,覆盖6-1至6-7)
  4. [ ] 项目启动说明书(1页纸)

格式要求:电子文档+打印稿各一份,打印稿用于课堂展示和张贴。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K1 直观性 我的功能清单清晰,别人一看就懂 混乱难懂 基本可读 清晰规范 可作模板
K3 过程导向 我能按步骤完成需求分析和分工 步骤混乱 基本完成 完整规范 能检查遗漏
K6 社会责任 我能积极参与小组讨论和决策 不参与 偶尔发言 积极发言 能引导讨论
K7 可持续性 我的甘特图和计划具有可执行性 完全不可行 基本可行 比较合理 精确可执行

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分:是否全程参与、不缺席不怠工
角色履行度 30% 1-5分:是否胜任角色职责、不推诿
协作配合度 20% 1-5分:是否主动配合他人、共享资源
成果贡献度 20% 1-5分:对最终成果的实际贡献大小
加权总分(满分5分) 计算:∑(单项评分×权重)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5)

我的协作系数 = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量、逻辑清晰
需求完整性 20 功能点≥6个,覆盖图书/读者/借阅/查询
分工合理性 20 分工明确、职责匹配、无遗漏
计划可行性 20 甘特图合理、里程碑清晰
展示与答辩 20 展示清晰、回答准确
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
需求完整性 20% 教师评
分工合理性 20% 教师评
计划可行性 20% 教师评
展示与答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 本任务中,我在需求分析时最容易遗漏的是:________________________
  2. 项目规划中我发现自己的薄弱点是:________________________
  3. 下一个任务(6-2)我要提前准备的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 什么是好的需求分析?】

好的需求分析不是"用户说什么就做什么",而是"理解用户真正需要什么"。有个经典笑话:用户说"我要一匹更快的马",其实他要的是"更快的交通工具"——最后发明的是汽车。

在软件工程中,需求分析通常分为三个阶段:

  • 需求获取:和用户聊天、观察用户工作、发放问卷
  • 需求分析:把模糊的描述变成具体的功能列表
  • 需求确认:让用户签字确认"这就是我要的"

本任务中,王馆长就是"用户",你们小组就是"需求分析师"。记住:多问"为什么",少假设"应该是"。



# 模块四:数据管理

模块导语:前面我们已经搭好了"房子"(数据库和表),现在要给房子"添家具"——往表里放入真实的数据,并且学会用不同的方式"找东西"。本模块围绕图书馆管理系统的核心操作:添加数据、查询数据、条件筛选、多表关联。所有SQL语句均提供填空模板,你只需要替换下划线部分即可。


# 【任务6-2】画设计图——E-R图与关系模型设计 【C→T】


# ■ 任务呈现区

情境:王馆长看了你们的需求清单,点头说:"不错,功能挺全的。但数据库怎么设计?要不要很多张表?表之间怎么连起来?"这就需要你们拿出"设计图纸"了。就像建房子要先画建筑图一样,做数据库要先画E-R图(实体-关系图),再把E-R图变成一张张关系表。今天,你们小组要画出图书馆系统的完整E-R图,并转换成至少4张关系表。

学习目标

  1. 能识别图书馆系统中的实体、属性和联系(至少4个实体)
  2. 能绘制规范的E-R图(实体用矩形、属性用椭圆、联系用菱形)
  3. 能将E-R图正确转换为关系表(每张表标注主键、外键)
  4. 能检查关系表是否满足第三范式(消除传递依赖)

核心输出物

  • [ ] E-R图(手绘或软件绘制,至少4个实体)
  • [ ] 关系表设计文档(含表名、字段、主键、外键、数据类型)
  • [ ] E-R图到关系模型的转换说明

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:② 技能操作型(画图设计)+ ③ 综合应用型(E-R图→关系模型转换)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L2→L3 | 核心K标准:K1/K2/K3/K5

向上穿透:T层"E-R图与关系模型设计"→C层"数据库概念与逻辑设计能力"→P层"数据建模能力"→G层"抽象思维与结构化设计素养"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 主持实体识别讨论、审核E-R图完整性 系统分析与统筹协调能力
操作员 在白板/纸上绘制E-R图、用电脑整理关系表 图形表达与工具使用能力
记录员 填写关系表设计文档、记录转换规则 技术文档撰写能力
复核员 检查E-R图是否缺少实体/联系、检查主键外键是否正确 质量复核与规范性检查能力

轮换规则:本任务与6-1为同一轮换周期,若6-1已轮换,本任务沿用新角色。

小组公约





# ■ 知识准备区

1. 图书馆系统的实体识别(提示)

实体 含义 可能的属性 与其他实体的联系
图书 图书馆收藏的书 书号、书名、作者、出版社、价格、分类号、馆藏数量 被读者借阅
读者 借书的人 读者编号、姓名、性别、班级/部门、电话、办证日期 借阅图书
借阅记录 一次借书行为 借阅编号、借出日期、应还日期、实际归还日期、是否逾期 连接图书和读者
图书分类 图书的类别 分类号、分类名称、备注 包含多本图书

💡 思考:是否需要"管理员"实体?是否需要"罚款记录"实体?根据6-1选中的功能决定。

2. E-R图基本符号

┌─────────────────────────────────────────┐
│  矩形 = 实体(如"图书")                 │
│  椭圆 = 属性(如"书名")                 │
│  菱形 = 联系(如"借阅")                 │
│  下划线 = 主键属性                       │
│  1:1 = 一对一 | 1:n = 一对多 | m:n = 多对多 │
└─────────────────────────────────────────┘

3. E-R图转关系表的规则(填空式复习)

规则 内容 示例
规则1 每个实体变成一张______ "图书"实体→图书表
规则2 实体的属性变成表的______ 书名、作者→字段
规则3 实体的主键变成表的______ 书号→主键
规则4 1:n联系:在______端加外键 读者1:n借阅→在借阅表加读者编号
规则5 m:n联系:变成一张______表 学生m:n课程→选课表(含两个外键)

4. 关系表设计模板

表名__________

字段名 数据类型 是否主键 是否外键 约束 说明

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
识别实体 小组讨论,确定系统中有哪些实体(至少4个) 30分钟
绘制E-R图 确定实体属性、联系类型,画出完整E-R图 60分钟
转换关系表 按规则把E-R图转成关系表,标注主键外键 45分钟
范式检查 检查每张表是否满足第三范式 30分钟
展示交流 各组展示E-R图,互相找问题 45分钟

行动方案

  1. 小组讨论:根据6-1选中的功能,确定需要哪些实体
  2. 操作员在白板/纸上画E-R图初稿
  3. 复核员对照"E-R图评价标准"检查初稿
  4. 记录员填写关系表设计文档
  5. 各组展示,教师点评

# ■ 决策区

关键决策点:是否需要把"借阅"设计成独立的实体?

方案 设计方式 优点 缺点
A "借阅"作为读者和图书之间的联系(菱形) E-R图简洁 借阅本身的属性(借出日期、应还日期)不好放
B "借阅"作为独立实体,与读者、图书都产生联系 能完整记录借阅信息,方便扩展 E-R图稍复杂

我的选择:□A □B 选择理由:________________________________________

关键决策点:图书和分类的关系怎么设计?

方案 设计方式 适用场景
A 图书表中直接写"分类名称"(如"计算机类") 分类很少变化
B 单独建"分类表",图书表通过"分类号"外键关联 分类可能增减,需要规范管理

我的选择:□A □B 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] E-R图(手绘或电子,至少4个实体,实体/属性/联系齐全)
  • [ ] 关系表设计文档(每张表含字段、类型、主键、外键)
  • [ ] E-R图到关系模型的转换说明(用了哪几条规则)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:确定实体和属性 【执行】

小组讨论,填写下表:

序号 实体名称 实体含义 关键属性(至少3个) 是否必须
1 图书 图书馆收藏的书 书号、书名、作者、出版社、价格
2
3
4
5

关键控制点:每个实体都要有能唯一标识它的属性(候选主键)。

Step 2:确定联系 【执行】

填写联系矩阵:

实体A 实体B 联系名称 联系类型(1:1/1:n/m:n) 说明
读者 图书 借阅 m:n 一个读者可借多本书,一本书可被多人借(不同时间)

Step 3:绘制E-R图 【执行】

操作员在白板/纸上绘制(建议先用铅笔,方便修改):

【E-R图绘制区】(可在下方手绘,或粘贴电子图)










E-R图评价标准(复核员用)

  • □ 实体数量≥4个
  • □ 每个实体有≥3个属性,主键属性已标注
  • □ 实体之间的联系类型已标注(1:1/1:n/m:n)
  • □ E-R图整体布局清晰,不拥挤
  • □ 符号使用正确(矩形、椭圆、菱形)

Step 4:转换为关系表 【执行】

记录员根据转换规则,填写以下表格(至少4张表):

表1:图书表(books

字段名 数据类型 是否主键 是否外键 约束 说明
book_id VARCHAR(20) PRIMARY KEY 书号,唯一标识一本书
title VARCHAR(100) NOT NULL 书名
author VARCHAR(50) 作者
publisher VARCHAR(50) 出版社
price DECIMAL(10,2) 价格
category_id VARCHAR(10) FOREIGN KEY 分类号,关联分类表
stock INT DEFAULT 1 馆藏数量

表2:读者表(readers

字段名 数据类型 是否主键 是否外键 约束 说明
reader_id VARCHAR(20) PRIMARY KEY 读者编号
name VARCHAR(50) NOT NULL 姓名
gender CHAR(1) 性别(男/女)
dept_class VARCHAR(50) 部门/班级
phone VARCHAR(20) 电话
register_date DATE 办证日期

表3:借阅记录表(borrow_records

字段名 数据类型 是否主键 是否外键 约束 说明
borrow_id INT PRIMARY KEY, AUTO_INCREMENT 借阅编号
reader_id VARCHAR(20) FOREIGN KEY 读者编号
book_id VARCHAR(20) FOREIGN KEY 书号
borrow_date DATE NOT NULL 借出日期
due_date DATE NOT NULL 应还日期
return_date DATE 实际归还日期(NULL表示未还)
status VARCHAR(10) DEFAULT '借阅中' 状态:借阅中/已归还/逾期

表4:分类表(categories

字段名 数据类型 是否主键 是否外键 约束 说明
category_id VARCHAR(10) PRIMARY KEY 分类号
category_name VARCHAR(50) NOT NULL 分类名称
remark VARCHAR(200) 备注

关键控制点:外键字段的数据类型必须与引用表的主键字段完全一致!

Step 5:范式检查 【检查】

复核员逐表检查:

检查项 图书表 读者表 借阅记录表 分类表
第一范式:每个字段是否不可再分?
第二范式:非主键字段是否完全依赖主键?
第三范式:是否存在传递依赖?

# ■ 成果提交区

交付物清单

  1. [ ] E-R图(手绘或电子,至少4个实体,符号规范)
  2. [ ] 关系表设计文档(至少4张表,含字段、类型、主键、外键、约束)
  3. [ ] 转换说明(说明用了哪些转换规则)

格式要求:E-R图可手绘拍照提交,关系表设计文档用电子表格或Markdown表格。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K1 直观性 我的E-R图清晰美观,符号使用正确 混乱错误 基本可读 清晰规范 可作范例
K2 功能性 我能正确识别实体、属性、联系 识别错误 基本正确 准确完整 能发现遗漏
K3 过程导向 我能按规则完成E-R图到关系表的转换 步骤混乱 基本完成 完整规范 能检查错误
K5 经济性 我的表结构设计避免了数据冗余 大量冗余 部分冗余 基本规范 完全满足3NF

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
E-R图质量 20 实体完整、属性齐全、联系正确、符号规范
关系表设计 20 主键外键正确、字段类型合理、约束完整
转换规范性 20 转换规则应用正确、说明清晰
展示答辩 20 展示清晰、能回答问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
E-R图质量 20% 教师评
关系表设计 20% 教师评
转换规范性 20% 教师评
展示答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. E-R图绘制时我容易画错的是:________________________
  2. 主键和外键的判断中我最迷糊的是:________________________
  3. 下一个任务(6-3)我要提前复习的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么E-R图是数据库设计的"黄金第一步"?】

E-R图(Entity-Relationship Diagram)是1976年由Peter Chen提出的,至今仍是数据库概念设计的主流方法。它的价值在于:先把"现实世界的业务"变成"图形化的模型",再变成"计算机能理解的表"。

很多初学者想跳过E-R图直接建表,这就像不打地基直接盖房——前面快,后面塌。一个规范的E-R图能帮你:

  • 发现遗漏的实体(如"忘记设计管理员")
  • 理清复杂的联系(如"借阅"到底是联系还是实体)
  • 避免后期的表结构大改(改表结构比改E-R图痛苦100倍)

记住:E-R图是"给人看的",关系表是"给计算机看的"。先让人看明白,再让计算机跑起来。



# 【任务6-3】建库建表——数据库与表结构实现 【C→T】


# ■ 任务呈现区

情境:设计图纸(E-R图和关系表)已经通过了王馆长的审核,现在到了"动工"的时候!你们需要在MySQL中把图纸变成现实:创建数据库、创建所有表、设置字段类型和约束、建立外键关系。这是整个项目的"地基工程",地基打得牢,后面才能顺顺利利。

学习目标

  1. 能使用CREATE DATABASE创建项目数据库
  2. 能使用CREATE TABLE创建至少4张表(含完整字段类型、约束)
  3. 能使用ALTER TABLE添加外键关系
  4. 能导出完整的SQL脚本文件(.sql)

核心输出物

  • [ ] 完整的SQL脚本文件(library_system.sql
  • [ ] 数据库和表的创建成功截图
  • [ ] 表结构验证结果(DESCRIBESHOW CREATE TABLE截图)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:② 技能操作型(SQL编码)+ ④ 规范实施型(按设计图施工)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L2→L3 | 核心K标准:K2/K3/K4

向上穿透:T层"数据库与表结构实现"→C层"MySQL数据库实施能力"→P层"数据库开发与实现能力"→G层"规范执行与工匠精神"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。操作员建议由SQL基础较好的学生担任。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 统筹建表顺序、协调问题讨论 项目进度管理能力
操作员 在MySQL中执行SQL语句、截图记录 SQL编码与调试能力
记录员 整理SQL脚本、撰写操作说明 技术文档撰写能力
复核员 核对SQL语法、检查约束和外键是否正确 代码审查与质量控制能力

轮换规则:本任务与6-4为同一轮换周期,建议轮换角色。

小组公约





# ■ 知识准备区

1. 建库建表的顺序(重要!)

Step 1: CREATE DATABASE  (先建数据库)
Step 2: USE 数据库名     (切换到数据库)
Step 3: CREATE TABLE 无外键的表  (先建"独立"的表)
Step 4: CREATE TABLE 有外键的表  (后建"依赖"别人的表)
Step 5: ALTER TABLE 添加外键    (也可以在建表时直接加)

💡 提示:如果B表的外键引用A表的主键,必须先建A表,再建B表!

2. SQL脚本模板框架(填空式)

-- ============================================
-- 图书馆借阅管理系统 - 数据库创建脚本
-- 小组:第___组
-- 日期:________
-- ============================================

-- 第1步:创建数据库
CREATE DATABASE IF NOT EXISTS library_system
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

USE library_system;

-- 第2步:创建分类表(无外键,先建)
CREATE TABLE categories (
    category_id VARCHAR(10) PRIMARY KEY COMMENT '分类号',
    category_name VARCHAR(50) NOT NULL COMMENT '分类名称',
    remark VARCHAR(200) COMMENT '备注'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 第3步:创建图书表(外键引用分类表)
CREATE TABLE books (
    book_id VARCHAR(20) PRIMARY KEY COMMENT '书号',
    title VARCHAR(100) NOT NULL COMMENT '书名',
    author VARCHAR(50) COMMENT '作者',
    publisher VARCHAR(50) COMMENT '出版社',
    price DECIMAL(10,2) COMMENT '价格',
    category_id VARCHAR(10) COMMENT '分类号',
    stock INT DEFAULT 1 COMMENT '馆藏数量',
    -- 外键约束
    CONSTRAINT fk_book_category 
        FOREIGN KEY (category_id) REFERENCES categories(category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 第4步:创建读者表(无外键,可提前建)
CREATE TABLE readers (
    reader_id VARCHAR(20) PRIMARY KEY COMMENT '读者编号',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    gender CHAR(1) COMMENT '性别',
    dept_class VARCHAR(50) COMMENT '部门/班级',
    phone VARCHAR(20) COMMENT '电话',
    register_date DATE COMMENT '办证日期'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 第5步:创建借阅记录表(外键引用读者表和图书表,最后建)
CREATE TABLE borrow_records (
    borrow_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '借阅编号',
    reader_id VARCHAR(20) NOT NULL COMMENT '读者编号',
    book_id VARCHAR(20) NOT NULL COMMENT '书号',
    borrow_date DATE NOT NULL COMMENT '借出日期',
    due_date DATE NOT NULL COMMENT '应还日期',
    return_date DATE COMMENT '实际归还日期',
    status VARCHAR(10) DEFAULT '借阅中' COMMENT '状态',
    -- 外键约束
    CONSTRAINT fk_borrow_reader 
        FOREIGN KEY (reader_id) REFERENCES readers(reader_id),
    CONSTRAINT fk_borrow_book 
        FOREIGN KEY (book_id) REFERENCES books(book_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 第6步:验证表是否创建成功
SHOW TABLES;
DESCRIBE books;
DESCRIBE readers;
DESCRIBE borrow_records;
DESCRIBE categories;

3. 常见错误提醒

错误现象 可能原因 解决方法
ERROR 1049:Unknown database 没执行USE或数据库名打错 检查CREATE DATABASEUSE语句
ERROR 1215:Cannot add foreign key 外键字段类型与被引用字段不一致 检查两边字段类型、长度是否完全一样
ERROR 1452:Cannot add or update child row 外键值在被引用表中不存在 先往父表(如categories)插数据
ERROR 1064:SQL syntax 语法错误 检查逗号、括号、引号是否成对
ERROR 1075:Incorrect table definition 自增字段不是主键 AUTO_INCREMENT字段必须是主键

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
创建数据库 执行CREATE DATABASE,设置字符集 15分钟
创建无关联表 建categories、readers表 30分钟
创建有关联表 建books、borrow_records表(含外键) 45分钟
验证表结构 执行SHOW TABLES、DESCRIBE检查 15分钟
导出SQL脚本 用Navicat/MySQL Workbench导出完整脚本 15分钟
备份与容错 保存脚本、测试删除重建 30分钟

行动方案

  1. 操作员打开MySQL Workbench/Navicat
  2. 按"先独立表、后关联表"顺序执行建表语句
  3. 复核员每建完一张表就检查一次
  4. 全部成功后导出.sql文件
  5. 测试:删除数据库,用.sql文件重新执行,确保能完整重建

# ■ 决策区

关键决策点:外键是在建表时加,还是建完表后用ALTER TABLE加?

方案 方式 优点 缺点
A CREATE TABLE时直接加FOREIGN KEY 脚本紧凑,一眼看清表结构 建表顺序必须严格,不能乱
B 所有表建完后再ALTER TABLE ADD FOREIGN KEY 建表顺序灵活,不容易报错 脚本分散,需要多步执行

我的选择:□A □B 选择理由:________________________________________

关键决策点:字符集选utf8还是utf8mb4?

方案 说明 适用场景
A utf8 节省空间,兼容老版本
B utf8mb4 完整支持4字节UTF-8,可存Emoji

我的选择:□A □B 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] SHOW TABLES;运行结果截图(显示4张表)
  • [ ] DESCRIBE books;结果截图(显示字段、类型、约束)
  • [ ] SHOW CREATE TABLE borrow_records;结果截图(显示完整建表语句和外键)
  • [ ] SQL脚本文件(.sql)已保存并提交

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:创建数据库 【执行】

CREATE DATABASE IF NOT EXISTS library_system
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;
    
USE library_system;

操作员执行后记录:

  • 执行结果:□成功 □失败
  • 如失败,错误信息:________________________

Step 2:创建独立表 【执行】

按6-2设计的关系表,先建没有外键的表。

表1:categories(分类表)

CREATE TABLE categories (
    category_id VARCHAR(10) PRIMARY KEY COMMENT '分类号',
    category_name VARCHAR(50) NOT NULL COMMENT '分类名称',
    remark VARCHAR(200) COMMENT '备注'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 执行结果:□成功 □失败
  • 复核员检查:DESCRIBE categories;输出是否正确?□是 □否

表2:readers(读者表)

CREATE TABLE readers (
    reader_id VARCHAR(20) PRIMARY KEY COMMENT '读者编号',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    gender CHAR(1) COMMENT '性别',
    dept_class VARCHAR(50) COMMENT '部门/班级',
    phone VARCHAR(20) COMMENT '电话',
    register_date DATE COMMENT '办证日期'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 执行结果:□成功 □失败
  • 复核员检查:DESCRIBE readers;输出是否正确?□是 □否

关键控制点:每建完一张表,立即用DESCRIBE检查字段、类型、主键是否正确!

Step 3:创建关联表 【执行】

表3:books(图书表,含外键引用categories)

CREATE TABLE books (
    book_id VARCHAR(20) PRIMARY KEY COMMENT '书号',
    title VARCHAR(100) NOT NULL COMMENT '书名',
    author VARCHAR(50) COMMENT '作者',
    publisher VARCHAR(50) COMMENT '出版社',
    price DECIMAL(10,2) COMMENT '价格',
    category_id VARCHAR(10) COMMENT '分类号',
    stock INT DEFAULT 1 COMMENT '馆藏数量',
    CONSTRAINT fk_book_category 
        FOREIGN KEY (category_id) REFERENCES categories(category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 执行结果:□成功 □失败
  • 复核员检查:DESCRIBE books;输出是否正确?□是 □否

表4:borrow_records(借阅记录表,含外键引用readers和books)

CREATE TABLE borrow_records (
    borrow_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '借阅编号',
    reader_id VARCHAR(20) NOT NULL COMMENT '读者编号',
    book_id VARCHAR(20) NOT NULL COMMENT '书号',
    borrow_date DATE NOT NULL COMMENT '借出日期',
    due_date DATE NOT NULL COMMENT '应还日期',
    return_date DATE COMMENT '实际归还日期',
    status VARCHAR(10) DEFAULT '借阅中' COMMENT '状态',
    CONSTRAINT fk_borrow_reader 
        FOREIGN KEY (reader_id) REFERENCES readers(reader_id),
    CONSTRAINT fk_borrow_book 
        FOREIGN KEY (book_id) REFERENCES books(book_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 执行结果:□成功 □失败
  • 复核员检查:DESCRIBE borrow_records;输出是否正确?□是 □否

关键控制点:外键字段的数据类型、长度必须与引用表的主键完全一致!

Step 4:验证与导出 【检查】

  1. 执行SHOW TABLES;,截图保存:
检查结果 状态
数据库library_system存在
categories表存在
readers表存在
books表存在
borrow_records表存在
至少4张表
  1. 执行以下验证语句,截图保存:
DESCRIBE books;
DESCRIBE readers;
DESCRIBE borrow_records;
DESCRIBE categories;
SHOW CREATE TABLE borrow_records;
  1. 导出SQL脚本:
    • 在Navicat/MySQL Workbench中选择数据库→右键→转储SQL文件
    • 或使用命令行:mysqldump -u root -p library_system > library_system.sql
    • 保存位置:________________________

Step 5:灾难恢复测试 【检查】

关键控制点:一个好的SQL脚本,应该能"删了重来"也成功!

  1. 执行:DROP DATABASE library_system;
  2. 重新执行你们保存的.sql脚本
  3. 验证:是否所有表都重建成功?□是 □否
  4. 如失败,记录错误并修正:________________________

# ■ 成果提交区

交付物清单

  1. [ ] SQL脚本文件library_system.sql,含CREATE DATABASE和CREATE TABLE)
  2. [ ] 建库建表成功截图SHOW TABLES;DESCRIBE结果)
  3. [ ] 外键验证截图SHOW CREATE TABLE borrow_records;
  4. [ ] 灾难恢复测试记录(删库重建是否成功)

格式要求:SQL脚本以.sql文件提交,截图清晰显示完整结果。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K2 功能性 我的SQL脚本能正确创建所有表和约束 大量报错 基本成功 完全正确 可作模板
K3 过程导向 我能按正确顺序建库建表(先独立后关联) 顺序混乱 基本正确 完全正确 能解释原因
K4 使用价值 我的表结构能满足图书馆系统的基本需求 功能缺失 基本满足 完全满足 有扩展设计
K5 经济性 我的字段类型选择合理,不浪费空间 类型混乱 基本合理 合理规范 精确优化

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
数据库创建 20 字符集设置正确、数据库创建成功
表结构质量 20 字段类型合理、约束完整、外键正确
SQL规范性 20 脚本规范、有注释、可重复执行
展示答辩 20 展示清晰、能回答问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
数据库创建 20% 教师评
表结构质量 20% 教师评
SQL规范性 20% 教师评
展示答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 建表时我最容易犯的错误是:________________________
  2. 外键创建失败时我首先应该检查的是:________________________
  3. 下一个任务(6-4)我要提前准备的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么InnoDB是默认存储引擎?】

MySQL有多种存储引擎,最常用的是InnoDB和MyISAM。在MySQL 5.5之后,InnoDB成为默认引擎,原因是:

  • 支持外键:MyISAM不支持外键约束,数据完整性靠程序员自觉
  • 支持事务:万一操作到一半出错了,可以"回滚"到之前的状态
  • 支持行级锁:多人同时操作时,锁一行而不是锁一整张表,并发性能更好

对于图书馆管理系统这种需要保证数据一致性、可能多人同时操作的应用,InnoDB是唯一正确的选择。



# 【任务6-4】数据初始化——导入数据与基础查询 【C→T】


# ■ 任务呈现区

情境:数据库和表都建好了,但里面是空的——就像新装修的图书馆,书架上还没有一本书。今天你们小组要往系统里"上架图书""注册读者""模拟借阅",让数据库"活"起来。同时,你们需要用基础查询语句验证数据是否正确录入。

学习目标

  1. 能编写INSERT语句为每张表插入至少5条测试数据
  2. 能使用基础SELECT语句验证数据完整性
  3. 能处理插入时的外键约束和重复主键问题
  4. 能导出INSERT脚本文件和查询结果截图

核心输出物

  • [ ] INSERT脚本文件(insert_data.sql,每张表≥5条数据)
  • [ ] 至少5个基础查询的SQL语句及运行截图
  • [ ] 数据验证报告(数据是否完整、有无错误)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:② 技能操作型(SQL编码)+ ④ 规范实施型(数据录入与验证)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L2→L3 | 核心K标准:K2/K3/K4

向上穿透:T层"数据初始化与基础查询"→C层"SQL数据操作能力"→P层"数据库数据管理能力"→G层"细致严谨与数据质量意识"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 统筹数据插入顺序、分配数据编写任务 任务分配与协调能力
操作员 在MySQL中执行INSERT和SELECT语句 SQL执行与调试能力
记录员 整理INSERT脚本、记录查询结果 数据记录与文档能力
复核员 核对数据是否正确、查询结果是否完整 数据质量检查能力

轮换规则:本任务与6-3为同一轮换周期。

小组公约





# ■ 知识准备区

1. 插入顺序(重要!和外键有关!)

先插"父表"(被引用的表)→ 再插"子表"(有外键的表)

正确顺序:
1. categories(分类表,没有外键)
2. readers(读者表,没有外键)
3. books(图书表,外键引用categories)
4. borrow_records(借阅记录表,外键引用readers和books)

2. INSERT批量插入模板

-- 单条插入
INSERT INTO categories (category_id, category_name, remark) 
VALUES ('TP3', '计算机类', '包含编程、数据库、网络等');

-- 多条插入(推荐,更高效)
INSERT INTO categories (category_id, category_name, remark) VALUES
('TP3', '计算机类', '编程、数据库、网络'),
('I24', '文学类', '小说、散文、诗歌'),
('G64', '教育类', '教材、教辅、教育理论'),
('F23', '经济类', '经济、管理、金融'),
('O15', '综合类', '百科、年鉴、工具书');

-- 从其他表插入(进阶)
INSERT INTO readers_backup SELECT * FROM readers;

3. 基础验证查询模板

-- 查全表
SELECT * FROM books;

-- 查总行数
SELECT COUNT(*) FROM readers;

-- 查某条件的数据
SELECT * FROM books WHERE category_id = 'TP3';

-- 查最大值/最小值
SELECT MAX(price), MIN(price) FROM books;

-- 联查(验证外键关系)
SELECT b.title, c.category_name 
FROM books b 
JOIN categories c ON b.category_id = c.category_id;

4. 数据设计建议(贴近校园生活)

数据设计建议
categories TP3计算机、I24文学、G64教育、F23经济、O15综合
readers 用学号如20230101、20230102,姓名用常见名,班级如"软件2301"
books ISBN可用978-7-xxx格式,书名用真实教材名,作者用知名作者
borrow_records 借出日期选最近3个月内的日期,应还日期=借出日期+30天

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
设计测试数据 小组讨论,为每张表设计5条以上测试数据 30分钟
编写INSERT脚本 按顺序编写INSERT语句,保存为.sql文件 45分钟
执行插入 在MySQL中执行脚本,处理报错 30分钟
验证查询 执行至少5个查询,验证数据正确性 30分钟
整理报告 截图、写验证报告 30分钟
展示交流 各组展示数据,互相检查 45分钟

行动方案

  1. 组长分配:每人负责设计一张表的数据(注意数据之间的关联!)
  2. 操作员汇总INSERT语句,按正确顺序排列
  3. 执行插入,遇到外键错误立即排查
  4. 执行验证查询,截图保存
  5. 复核员检查:borrow_records中的reader_id和book_id是否在父表中存在

# ■ 决策区

关键决策点:数据是越真实越好,还是可以随意编造?

方案 策略 优点 缺点
A 尽量真实(用真实书名、真实学号格式) 演示效果好、贴近实际 想真实数据比较费时间
B 随意编造(书名用"书1""书2",姓名用"张三""李四") 快速、简单 演示时显得不专业、测试时难以发现逻辑错误
C 半真实(书名用真实书名,人名用常见测试名) 兼顾效率和专业度 需要花一点时间找真实书名

我的选择:□A □B □C 选择理由:________________________________________

关键决策点:borrow_records的数据如何设计才能覆盖"逾期"场景?

方案 逾期数据设计 说明
A 把部分记录的借出日期设为2个月前,应还日期设为1个月前 模拟已逾期
B 把return_date留空(NULL),表示未归还,再让系统判断逾期 更符合真实系统逻辑

我的选择:□A □B 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] INSERT脚本文件(insert_data.sql
  • [ ] SELECT * FROM 表名;运行截图(4张表各1张)
  • [ ] 至少5个验证查询的SQL及截图
  • [ ] 数据验证报告(总记录数、有无错误)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:设计测试数据 【执行】

各组员填写下表(每人负责一张表的数据设计):

categories表数据(5条)

category_id category_name remark
TP3 计算机类
I24 文学类

readers表数据(5条)

reader_id name gender dept_class phone register_date
20230101 软件2301 2023-09-01

books表数据(5条)(注意:category_id必须在categories表中存在!)

book_id title author publisher price category_id stock
978-7-111-12345-1 TP3 3

borrow_records表数据(5条)(注意:reader_id和book_id必须在父表中存在!)

borrow_id reader_id book_id borrow_date due_date return_date status
1 20230101 978-7-111-12345-1 2026-04-01 2026-05-01 NULL 借阅中

关键控制点:borrow_records表中的reader_id和book_id,必须在readers表和books表中事先存在!否则外键会报错!

Step 2:编写INSERT脚本 【执行】

记录员汇总为完整的insert_data.sql

-- ============================================
-- 图书馆借阅管理系统 - 数据初始化脚本
-- 小组:第___组
-- 日期:________
-- ============================================

USE library_system;

-- 第1步:插入分类数据
INSERT INTO categories (category_id, category_name, remark) VALUES
('TP3', '计算机类', '编程、数据库、网络'),
('I24', '文学类', '小说、散文、诗歌'),
('G64', '教育类', '教材、教辅、教育理论'),
('F23', '经济类', '经济、管理、金融'),
('O15', '综合类', '百科、年鉴、工具书');

-- 第2步:插入读者数据
INSERT INTO readers (reader_id, name, gender, dept_class, phone, register_date) VALUES
('20230101', '张伟', '男', '软件2301', '13800138001', '2023-09-01'),
('20230102', '李娜', '女', '软件2301', '13800138002', '2023-09-01'),
('20230201', '王强', '男', '网络2301', '13800138003', '2023-09-01'),
('20230202', '刘洋', '女', '网络2301', '13800138004', '2023-09-01'),
('20230301', '陈静', '女', '大数据2301', '13800138005', '2023-09-01');

-- 第3步:插入图书数据(注意category_id要对应categories表)
INSERT INTO books (book_id, title, author, publisher, price, category_id, stock) VALUES
('978-7-111-12345-1', 'MySQL数据库入门', '李明', '机械工业出版社', 59.00, 'TP3', 3),
('978-7-302-23456-2', '红楼梦', '曹雪芹', '人民文学出版社', 45.00, 'I24', 2),
('978-7-303-34567-3', '教育学原理', '王守仁', '北京师范大学出版社', 38.00, 'G64', 5),
('978-7-304-45678-4', '经济学基础', '马歇尔', '商务印书馆', 68.00, 'F23', 2),
('978-7-305-56789-5', '中国大百科全书', '编辑部', '中国大百科全书出版社', 128.00, 'O15', 1);

-- 第4步:插入借阅记录数据(注意reader_id和book_id要对应父表)
INSERT INTO borrow_records (reader_id, book_id, borrow_date, due_date, return_date, status) VALUES
('20230101', '978-7-111-12345-1', '2026-04-01', '2026-05-01', NULL, '借阅中'),
('20230102', '978-7-302-23456-2', '2026-04-10', '2026-05-10', '2026-04-25', '已归还'),
('20230201', '978-7-111-12345-1', '2026-04-15', '2026-05-15', NULL, '借阅中'),
('20230202', '978-7-303-34567-3', '2026-03-01', '2026-04-01', NULL, '逾期'),
('20230301', '978-7-304-45678-4', '2026-04-20', '2026-05-20', NULL, '借阅中');

💡 提示:上面的数据是示例,你们小组应该替换成自己的数据。但至少要保持5条/表,且外键关系正确。

Step 3:执行插入并处理错误 【执行】

操作员在MySQL中执行脚本,记录员记录结果:

执行步骤 结果 错误信息(如有)
USE library_system □成功 □失败
INSERT categories □成功 □失败
INSERT readers □成功 □失败
INSERT books □成功 □失败
INSERT borrow_records □成功 □失败

常见错误处理记录:

  • 错误1:________________________,解决方法:________________________
  • 错误2:________________________,解决方法:________________________

Step 4:执行验证查询 【检查】

操作员执行以下查询,记录员截图保存:

查询1:查看所有分类

SELECT * FROM categories;
  • 结果:______条记录

查询2:查看所有读者

SELECT * FROM readers;
  • 结果:______条记录

查询3:查看所有图书

SELECT * FROM books;
  • 结果:______条记录

查询4:查看所有借阅记录

SELECT * FROM borrow_records;
  • 结果:______条记录

查询5:验证外键关系——查看每本图书的分类名称

SELECT b.title, c.category_name 
FROM books b 
JOIN categories c ON b.category_id = c.category_id;
  • 结果是否正确?□是 □否

关键控制点:每张表至少5条数据,外键关联查询结果必须正确!

Step 5:数据完整性检查 【检查】

复核员填写数据验证报告:

检查项 预期结果 实际结果 是否通过
categories表记录数 ≥5
readers表记录数 ≥5
books表记录数 ≥5
borrow_records表记录数 ≥5
books.category_id都在categories中存在
borrow_records.reader_id都在readers中存在
borrow_records.book_id都在books中存在
有至少1条"已归还"记录
有至少1条"逾期"记录
有至少1条"借阅中"且未归还记录

# ■ 成果提交区

交付物清单

  1. [ ] INSERT脚本文件insert_data.sql,每张表≥5条数据)
  2. [ ] *4张表的SELECT 截图(显示数据已成功插入)
  3. [ ] 至少5个验证查询的SQL语句及截图
  4. [ ] 数据验证报告(含10项检查表)

格式要求:SQL脚本以.sql文件提交,截图清晰显示完整结果集。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K2 功能性 我的INSERT脚本能正确插入所有数据 大量报错 基本成功 完全正确 含批量插入和优化
K3 过程导向 我能按正确顺序插入数据(先父后子) 顺序混乱 基本正确 完全正确 能解释原因
K4 使用价值 我的测试数据能覆盖正常、归还、逾期等场景 数据单一 基本覆盖 完整覆盖 有边界值测试
K5 经济性 我的数据设计合理,不冗余不缺失 数据混乱 基本完整 完整规范 精确匹配需求

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
数据完整性 20 每张表≥5条,外键关系正确
数据场景覆盖 20 包含借阅中/已归还/逾期多种状态
查询验证 20 至少5个查询,结果正确
展示答辩 20 展示清晰、能回答问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
数据完整性 20% 教师评
数据场景覆盖 20% 教师评
查询验证 20% 教师评
展示答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. INSERT语句编写时我最容易出错的是:________________________
  2. 外键约束导致插入失败时,我首先应该:________________________
  3. 下一个任务(6-5)我要提前复习的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 为什么要设计"测试数据"而不是随便填?】

专业的软件测试有一条原则:"Garbage in, garbage out"(垃圾进,垃圾出)。如果测试数据本身不合理,测试就没意义。

好的测试数据应该覆盖:

  • 正常情况:符合业务规则的数据(如正常借还)
  • 边界情况:刚好在边界上的数据(如应还日期=今天)
  • 异常情况:不符合规则但需要处理的数据(如逾期、重复借同一本书)

你们今天设计的每一条数据,都是明天测试视图和存储过程的"弹药"。数据设计得越全面,后面越轻松。



# 模块五:进阶功能

模块导语:图书馆数据库已经有了数据,也能查数据了。但随着数据越来越多,查询变慢了;有些查询太复杂,每次都要写一大串SQL;有些操作需要重复执行,很繁琐。本模块将学习三个"进阶工具":索引(让查询变快)、视图(把复杂查询"打包"成一张虚拟表)、存储过程(把多条SQL"打包"成一个命令直接调用)。这些工具是数据库管理员和开发人员的必备技能。


# 【任务6-5】功能实现——视图与存储过程开发 【C→T】


# ■ 任务呈现区

情境:数据库建好了,数据也导入了,王馆长说:"不错!但现在我想查'谁借了书没还',还得写一大段SQL,太麻烦了。能不能像点按钮一样,输入一个读者姓名就查出他的借阅历史?"这就是视图和存储过程的用武之地——视图是"保存好的查询",存储过程是"保存好的操作步骤"。今天你们小组要为图书馆开发实用的视图和存储过程,让系统真正"好用"。

学习目标

  1. 能创建至少2个实用视图(如逾期未还列表、热门图书排行)
  2. 能创建至少2个存储过程(如借书、还书、查询读者借阅历史)
  3. 能调用视图和存储过程并验证结果
  4. 能导出视图和存储过程的SQL脚本

核心输出物

  • [ ] 至少2个视图的CREATE VIEW脚本及运行截图
  • [ ] 至少2个存储过程的CREATE PROCEDURE脚本及运行截图
  • [ ] 视图和存储过程的调用测试记录
  • [ ] 功能说明文档(每个视图/存储过程的作用和使用方法)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:③ 综合应用型(视图+存储过程开发)+ ⑤ 综合项目型(系统功能实现)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L3→L4 | 核心K标准:K2/K3/K4/K5

向上穿透:T层"视图与存储过程开发"→C层"数据库编程与对象设计能力"→P层"数据库应用开发能力"→G层"工程思维与用户体验意识"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。本任务难度较高,建议操作员由SQL基础最好的学生担任。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 分配视图/存储过程开发任务、统筹协调 技术管理与进度把控能力
操作员 编写和执行CREATE VIEW/PROCEDURE语句 SQL编程与调试能力
记录员 整理脚本、撰写功能说明文档 技术文档撰写能力
复核员 测试每个视图和存储过程、检查边界情况 软件测试与质量控制能力

轮换规则:本任务与6-6为同一轮换周期,建议轮换角色。

小组公约





# ■ 知识准备区

1. 视图(VIEW)是什么?

视图就是"虚拟表"——看起来像一张表,但其实是一条保存好的SELECT语句。好处是:用户不用写复杂查询,直接SELECT * FROM 视图名就行。

2. 存储过程(PROCEDURE)是什么?

存储过程就是"保存好的SQL程序"——把多条SQL语句打包成一个"函数",输入参数,执行一系列操作,返回结果。

3. 视图模板(可直接修改表名和字段名)

-- 视图1:逾期未还列表
CREATE VIEW view_overdue_books AS
SELECT 
    b.borrow_id,
    r.name AS reader_name,
    r.phone,
    bk.title AS book_title,
    b.borrow_date,
    b.due_date,
    DATEDIFF(CURDATE(), b.due_date) AS overdue_days
FROM borrow_records b
JOIN readers r ON b.reader_id = r.reader_id
JOIN books bk ON b.book_id = bk.book_id
WHERE b.status = '借阅中' 
  AND b.due_date < CURDATE();

-- 调用:SELECT * FROM view_overdue_books;

-- 视图2:热门图书排行(被借次数最多的书)
CREATE VIEW view_hot_books AS
SELECT 
    bk.book_id,
    bk.title,
    bk.author,
    COUNT(b.borrow_id) AS borrow_count
FROM books bk
LEFT JOIN borrow_records b ON bk.book_id = b.book_id
GROUP BY bk.book_id, bk.title, bk.author
ORDER BY borrow_count DESC;

-- 调用:SELECT * FROM view_hot_books LIMIT 10;

4. 存储过程模板(完整代码,学生修改表名和字段名即可)

-- ============================================
-- 存储过程1:查询读者借阅历史
-- 输入:读者姓名(支持模糊查询)
-- 输出:该读者的所有借阅记录
-- ============================================
DELIMITER //

CREATE PROCEDURE sp_reader_borrow_history(IN p_reader_name VARCHAR(50))
BEGIN
    SELECT 
        b.borrow_id,
        r.reader_id,
        r.name AS reader_name,
        bk.title AS book_title,
        b.borrow_date,
        b.due_date,
        b.return_date,
        b.status,
        CASE 
            WHEN b.status = '借阅中' AND b.due_date < CURDATE() 
            THEN CONCAT('逾期', DATEDIFF(CURDATE(), b.due_date), '天')
            ELSE '正常'
        END AS remark
    FROM borrow_records b
    JOIN readers r ON b.reader_id = r.reader_id
    JOIN books bk ON b.book_id = bk.book_id
    WHERE r.name LIKE CONCAT('%', p_reader_name, '%')
    ORDER BY b.borrow_date DESC;
END //

DELIMITER ;

-- 调用:CALL sp_reader_borrow_history('张伟');
-- 调用:CALL sp_reader_borrow_history('');  -- 查所有人


-- ============================================
-- 存储过程2:办理借书
-- 输入:读者编号、书号
-- 功能:插入借阅记录,检查库存和重复借阅
-- ============================================
DELIMITER //

CREATE PROCEDURE sp_borrow_book(
    IN p_reader_id VARCHAR(20),
    IN p_book_id VARCHAR(20)
)
BEGIN
    DECLARE v_stock INT;
    DECLARE v_exists INT;
    
    -- 检查是否已借过该书且未还
    SELECT COUNT(*) INTO v_exists 
    FROM borrow_records 
    WHERE reader_id = p_reader_id 
      AND book_id = p_book_id 
      AND status = '借阅中';
    
    IF v_exists > 0 THEN
        SELECT '错误:该读者已借阅此书,不能重复借阅!' AS message;
    ELSE
        -- 检查库存
        SELECT stock INTO v_stock FROM books WHERE book_id = p_book_id;
        
        IF v_stock IS NULL OR v_stock <= 0 THEN
            SELECT '错误:该书库存不足!' AS message;
        ELSE
            -- 插入借阅记录
            INSERT INTO borrow_records 
                (reader_id, book_id, borrow_date, due_date, status)
            VALUES 
                (p_reader_id, p_book_id, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 30 DAY), '借阅中');
            
            -- 减少库存
            UPDATE books SET stock = stock - 1 WHERE book_id = p_book_id;
            
            SELECT '借书成功!' AS message;
        END IF;
    END IF;
END //

DELIMITER ;

-- 调用:CALL sp_borrow_book('20230101', '978-7-111-12345-1');


-- ============================================
-- 存储过程3:办理还书
-- 输入:借阅编号
-- 功能:更新借阅记录为已归还,增加图书库存
-- ============================================
DELIMITER //

CREATE PROCEDURE sp_return_book(IN p_borrow_id INT)
BEGIN
    DECLARE v_book_id VARCHAR(20);
    DECLARE v_status VARCHAR(10);
    
    -- 获取当前状态
    SELECT book_id, status INTO v_book_id, v_status 
    FROM borrow_records 
    WHERE borrow_id = p_borrow_id;
    
    IF v_status IS NULL THEN
        SELECT '错误:借阅记录不存在!' AS message;
    ELSEIF v_status = '已归还' THEN
        SELECT '错误:该书已归还!' AS message;
    ELSE
        -- 更新借阅记录
        UPDATE borrow_records 
        SET return_date = CURDATE(), status = '已归还'
        WHERE borrow_id = p_borrow_id;
        
        -- 增加库存
        UPDATE books SET stock = stock + 1 WHERE book_id = v_book_id;
        
        SELECT '还书成功!' AS message;
    END IF;
END //

DELIMITER ;

-- 调用:CALL sp_return_book(1);

5. 重要提醒:DELIMITER

存储过程中有多条语句,MySQL默认遇到;就执行。所以需要临时把分隔符改成//,等存储过程写完再改回;。这是最容易忘记的地方!


# ■ 计划区

子目标分解

子目标 具体内容 预计用时
理解需求 明确需要哪些视图和存储过程 20分钟
创建视图 编写并执行至少2个CREATE VIEW 45分钟
创建存储过程 编写并执行至少2个CREATE PROCEDURE 60分钟
测试验证 调用每个视图/存储过程,检查边界情况 45分钟
整理文档 编写功能说明文档 30分钟
展示交流 各组演示功能 40分钟

行动方案

  1. 组长分配:两人负责视图,两人负责存储过程
  2. 操作员编写SQL,复核员同时准备测试用例
  3. 每完成一个对象,立即测试
  4. 记录员整理功能说明文档
  5. 各组现场演示"借书→查询→还书"完整流程

# ■ 决策区

关键决策点:存储过程要不要做复杂的错误处理?

方案 错误处理策略 优点 缺点
A 简单处理(只判断基本条件,如库存不足) 代码简洁、容易理解 边界情况可能出错
B 完整处理(判断所有可能错误:读者不存在、书不存在、已借过等) 系统健壮、专业 代码复杂、容易写错

我的选择:□A □B 选择理由:________________________________________

关键决策点:视图2做什么主题?

方案 视图主题 说明
A 热门图书排行 被借次数最多的书
B 读者借阅统计 每个读者借了几本书
C 图书库存预警 库存为0或1的图书列表

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 视图运行截图(SELECT * FROM view_xxx;结果)
  • [ ] 存储过程运行截图(CALL sp_xxx(...);结果)
  • [ ] 功能说明文档(每个对象的名称、作用、参数、示例调用)
  • [ ] 现场演示:借书→查询→还书完整流程

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:创建视图 【执行】

操作员执行以下视图创建语句(根据你们小组的表名和字段名修改):

视图1:逾期未还列表

CREATE VIEW view_overdue_books AS
SELECT 
    b.borrow_id,
    r.name AS reader_name,
    r.phone,
    bk.title AS book_title,
    b.borrow_date,
    b.due_date,
    DATEDIFF(CURDATE(), b.due_date) AS overdue_days
FROM borrow_records b
JOIN readers r ON b.reader_id = r.reader_id
JOIN books bk ON b.book_id = bk.book_id
WHERE b.status = '借阅中' 
  AND b.due_date < CURDATE();
  • 执行结果:□成功 □失败
  • 验证:SELECT * FROM view_overdue_books;
  • 结果:______条记录(如果0条,说明测试数据里没有逾期,需要修改borrow_records数据)

视图2:________________(自选主题)

CREATE VIEW view_________ AS
SELECT 
    ________________
FROM ________________
WHERE ________________;
  • 执行结果:□成功 □失败
  • 验证:SELECT * FROM view_________;
  • 结果:______条记录

关键控制点:视图创建成功后,必须用SELECT验证,确保返回的数据符合预期!

Step 2:创建存储过程 【执行】

操作员执行(根据模板修改表名和字段名):

存储过程1:查询读者借阅历史

DELIMITER //
CREATE PROCEDURE sp_reader_borrow_history(IN p_reader_name VARCHAR(50))
BEGIN
    SELECT 
        b.borrow_id,
        r.name AS reader_name,
        bk.title AS book_title,
        b.borrow_date,
        b.due_date,
        b.return_date,
        b.status
    FROM borrow_records b
    JOIN readers r ON b.reader_id = r.reader_id
    JOIN books bk ON b.book_id = bk.book_id
    WHERE r.name LIKE CONCAT('%', p_reader_name, '%')
    ORDER BY b.borrow_date DESC;
END //
DELIMITER ;
  • 执行结果:□成功 □失败
  • 验证:CALL sp_reader_borrow_history('张');
  • 结果是否正确?□是 □否

存储过程2:办理借书/还书(二选一或都写)

-- (使用上面的模板,根据实际表名修改)
  • 执行结果:□成功 □失败
  • 验证:CALL sp_________('参数1', '参数2');
  • 结果是否正确?□是 □否

关键控制点:存储过程创建时如果报错,90%是因为:① DELIMITER忘记改/改回来 ② 字段名/表名打错 ③ 变量没声明 ④ 字符串拼接语法错误

Step 3:边界测试 【检查】

复核员设计并执行以下测试用例:

测试对象 测试场景 输入 预期结果 实际结果 是否通过
view_overdue 有逾期数据时 SELECT * FROM view_overdue_books; 显示逾期记录
view_overdue 无逾期数据时 修改数据使无逾期 返回空结果集
sp_borrow 正常借书 存在的读者+有库存的书 借书成功
sp_borrow 重复借阅 已借该书的读者 提示不能重复
sp_borrow 库存不足 库存为0的书 提示库存不足
sp_return 正常还书 存在的借阅编号 还书成功
sp_return 重复还书 已归还的记录 提示已归还

Step 4:编写功能说明文档 【执行】

记录员整理:

【图书馆系统数据库对象说明文档】
小组:第___组

一、视图清单

1. 视图名:view_overdue_books
   作用:查询所有逾期未还的借阅记录
   调用方式:SELECT * FROM view_overdue_books;
   返回字段:借阅编号、读者姓名、电话、书名、借出日期、应还日期、逾期天数
   
2. 视图名:view_________
   作用:________________________
   调用方式:________________________
   返回字段:________________________

二、存储过程清单

1. 过程名:sp_reader_borrow_history
   作用:按读者姓名查询借阅历史
   参数:p_reader_name VARCHAR(50) —— 读者姓名(支持模糊查询)
   调用方式:CALL sp_reader_borrow_history('张伟');
   返回:该读者的所有借阅记录
   
2. 过程名:sp_________
   作用:________________________
   参数:________________________
   调用方式:________________________
   返回:________________________

# ■ 成果提交区

交付物清单

  1. [ ] 视图SQL脚本create_views.sql,至少2个视图)
  2. [ ] 存储过程SQL脚本create_procedures.sql,至少2个存储过程)
  3. [ ] 测试截图(每个视图和存储过程的运行结果)
  4. [ ] 功能说明文档(对象名称、作用、参数、调用示例)

格式要求:SQL脚本以.sql文件提交,截图清晰显示完整结果。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K2 功能性 我的视图和存储过程能正确运行并返回预期结果 大量报错 基本运行 完全正确 有完善错误处理
K3 过程导向 我能按步骤完成视图和存储过程的开发与测试 步骤混乱 基本完成 完整规范 有单元测试
K4 使用价值 我的对象能满足图书馆系统的实际查询需求 功能缺失 基本满足 完全满足 超出预期
K5 经济性 我的SQL代码简洁高效,无冗余 代码混乱 基本可运行 简洁规范 优化高效

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
视图质量 20 至少2个,主题实用,结果正确
存储过程质量 20 至少2个,参数合理,逻辑正确
测试完整性 20 边界测试覆盖,有测试用例表
展示答辩 20 现场演示流畅、回答准确
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
视图质量 20% 教师评
存储过程质量 20% 教师评
测试完整性 20% 教师评
展示答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 存储过程编写时我最容易忘记的是:________________________
  2. DELIMITER相关错误我遇到了______次,原因是:________________________
  3. 下一个任务(6-6)我要重点复习的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 视图和存储过程的安全价值】

视图和存储过程不仅是"方便",更是"安全"。

  • 视图的安全作用:可以限制用户只能看到部分数据。比如创建一个视图view_public_books,只显示书名和作者,不显示进价和库存位置。用户查视图,就看不到敏感信息。
  • 存储过程的安全作用:用户不需要直接操作表,只需要调用存储过程。存储过程内部做权限检查,防止用户直接DELETE FROM books把全库删了。

在企业级应用中,通常会禁止普通用户直接访问表,只给他们视图和存储过程的权限。这就是数据库安全管理的"最小权限原则"。



# 【任务6-6】系统测试——功能测试与性能优化 【C→T】


# ■ 任务呈现区

情境:系统功能基本做完了,但王馆长不放心:"你们确定借书还书都不会出错?查逾期名单准不准?如果书多了,查询会不会变慢?"这些问题需要通过系统测试来回答。今天你们小组要当"测试工程师"——设计测试用例、执行功能测试、分析查询性能、创建必要的索引优化速度。

学习目标

  1. 能设计至少5个功能测试用例(输入→预期结果→实际结果)
  2. 能使用EXPLAIN分析查询性能
  3. 能根据分析结果创建合理的索引优化查询
  4. 能撰写简要的测试报告

核心输出物

  • [ ] 测试用例表(至少5个,含输入/预期结果/实际结果/是否通过)
  • [ ] EXPLAIN分析截图(至少2个查询)
  • [ ] 索引优化前后的性能对比
  • [ ] 简要测试报告(1页纸)

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:③ 综合应用型(测试+优化)+ ⑤ 综合项目型(质量保障)

行动维度:资讯→计划→决策→执行→检查→评价(完整六步)

需求维度:目标水平=L3→L4 | 核心K标准:K2/K3/K4/K5

向上穿透:T层"系统测试与性能优化"→C层"数据库测试与优化能力"→P层"软件质量保障能力"→G层"质量意识与精益求精精神"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 统筹测试计划、分配测试任务 质量管理与统筹协调能力
操作员 执行测试用例、运行EXPLAIN、创建索引 SQL执行与分析能力
记录员 填写测试用例表、记录测试结果、撰写测试报告 测试文档撰写能力
复核员 复核测试结果、检查索引是否合理、验证优化效果 质量复核与性能评估能力

轮换规则:本任务与6-5为同一轮换周期。

小组公约





# ■ 知识准备区

1. 什么是软件测试?

软件测试就是"故意找茬"——想方设法让系统出错,然后修复。好的测试不是证明系统没问题,而是尽可能发现问题。

2. 测试用例模板

用例编号 测试功能 输入数据 预期结果 实际结果 是否通过
TC001 借书 reader_id='20230101', book_id='978-7-111-12345-1' 借阅记录增加1条,库存减1

3. EXPLAIN基础用法

-- 在SELECT前加EXPLAIN,看MySQL怎么执行这条查询
EXPLAIN SELECT * FROM borrow_records WHERE reader_id = '20230101';

EXPLAIN结果关键字段

字段 含义 好/坏
type 访问类型 system>const>eq_ref>ref>range>index>ALL(ALL最差)
key 实际使用的索引 有值=用了索引,NULL=没用到
rows 扫描的行数 越小越好
Extra 额外信息 Using index(好)/ Using filesort(坏)

4. 创建索引优化

-- 给经常查询的字段加索引
CREATE INDEX idx_reader_id ON borrow_records(reader_id);
CREATE INDEX idx_book_id ON borrow_records(book_id);
CREATE INDEX idx_status ON borrow_records(status);

-- 复合索引(多个字段组合查询)
CREATE INDEX idx_borrow_status ON borrow_records(borrow_date, status);

-- 删除索引(如果建错了)
DROP INDEX idx_reader_id ON borrow_records;

💡 提示:索引不是越多越好!每加一个索引,插入/更新/删除会变慢。只在"经常查询但很少修改"的字段上加索引。


# ■ 计划区

子目标分解

子目标 具体内容 预计用时
设计测试用例 至少5个功能测试用例 30分钟
执行功能测试 运行测试用例,记录实际结果 45分钟
EXPLAIN分析 对慢查询执行EXPLAIN 30分钟
创建索引 根据分析结果创建索引 30分钟
验证优化 再次EXPLAIN,对比优化前后 30分钟
撰写报告 整理测试报告 30分钟
展示交流 各组展示测试发现和优化成果 45分钟

行动方案

  1. 小组讨论:系统最容易出问题的地方是什么?
  2. 记录员填写测试用例表
  3. 操作员执行测试,记录实际结果
  4. 对可能慢的查询执行EXPLAIN
  5. 创建索引,对比优化效果
  6. 整理测试报告

# ■ 决策区

关键决策点:哪些字段需要加索引?

方案 加索引策略 理由
A 只在WHERE和JOIN条件字段上加 这些字段查询最多
B 所有字段都加 查询最快
C 只在borrow_records表上加 这是查询最频繁的表

我的选择:□A □B □C 选择理由:________________________________________

关键决策点:发现严重bug(如还书时库存没增加)怎么办?

方案 处理方式 适用情况
A 立即修复存储过程,重新测试 时间充裕
B 记录为已知问题,在汇报时说明 时间紧张,bug复杂
C 绕过该功能,用其他方式实现 bug短期内无法修复

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] 测试用例表(至少5个,有实际结果和通过状态)
  • [ ] EXPLAIN分析截图(优化前和优化后各至少1张)
  • [ ] 索引创建语句及验证截图
  • [ ] 测试报告(1页纸,含发现的问题和修复情况)

同伴互评记录

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:设计测试用例 【执行】

记录员填写测试用例表:

用例编号 测试功能 测试场景 输入数据 预期结果 实际结果 是否通过
TC001 借书 正常借书 reader_id='20230101', book_id='...' 借阅记录+1,库存-1
TC002 借书 重复借阅 同一读者借同一本未还的书 提示"不能重复借阅"
TC003 还书 正常还书 borrow_id=1 状态变"已归还",库存+1
TC004 查询 查逾期名单 SELECT * FROM view_overdue_books 显示所有逾期记录
TC005 查询 查读者历史 CALL sp_reader_borrow_history('张') 显示匹配的借阅记录
TC006 数据完整性 删除有借阅记录的读者 DELETE FROM readers WHERE reader_id='...' 外键阻止删除或有级联
TC007 自定义 ________________

关键控制点:测试用例要覆盖"正常情况"和"异常情况"!

Step 2:执行功能测试 【执行】

操作员逐条执行测试用例,记录员记录实际结果:

  • TC001实际结果:________________________ 是否通过:□
  • TC002实际结果:________________________ 是否通过:□
  • TC003实际结果:________________________ 是否通过:□
  • TC004实际结果:________________________ 是否通过:□
  • TC005实际结果:________________________ 是否通过:□
  • TC006实际结果:________________________ 是否通过:□

发现的Bug记录

Bug编号 发现用例 问题描述 严重程度 修复方案 修复状态
BUG001 ⭐⭐⭐ □已修复 □未修复
BUG002 ⭐⭐ □已修复 □未修复

Step 3:EXPLAIN性能分析 【执行】

操作员对以下查询执行EXPLAIN:

查询A:按读者查借阅记录(优化前)

EXPLAIN SELECT * FROM borrow_records WHERE reader_id = '20230101';
字段
type
key
rows
Extra

查询B:联查借阅详情(优化前)

EXPLAIN SELECT b.*, r.name, bk.title 
FROM borrow_records b
JOIN readers r ON b.reader_id = r.reader_id
JOIN books bk ON b.book_id = bk.book_id
WHERE b.status = '借阅中';
字段
type
key
rows
Extra

Step 4:创建索引 【执行】

根据EXPLAIN结果,在缺少索引的字段上创建索引:

-- 请根据你们的分析填写需要创建的索引
CREATE INDEX idx_________ ON _________(_________);
CREATE INDEX idx_________ ON _________(_________);
  • 创建的索引1:________________________
  • 创建的索引2:________________________

Step 5:验证优化效果 【检查】

再次执行EXPLAIN,对比优化前后:

查询 优化前type 优化前rows 优化后type 优化后rows 优化效果
查询A
查询B

关键控制点:优化后type应该变好(如从ALL变成ref),rows应该变小!

Step 6:撰写测试报告 【执行】

记录员整理:

【图书馆系统测试报告】
小组:第___组
测试日期:________

一、测试范围
对图书馆借阅管理系统的________、________、________功能进行测试。

二、测试用例执行结果
总用例数:___  通过:___  失败:___  通过率:___%

三、发现的问题
1. ________________(严重程度:⭐⭐⭐)
   修复情况:________
2. ________________(严重程度:⭐⭐)
   修复情况:________

四、性能优化
优化前:________________
优化措施:________________
优化后:________________

五、测试结论
□ 系统功能基本正常,可以进入汇报阶段
□ 存在严重问题,需要修复后再测试

# ■ 成果提交区

交付物清单

  1. [ ] 测试用例表(至少5个,有实际结果和通过状态)
  2. [ ] EXPLAIN分析截图(优化前和优化后)
  3. [ ] 索引创建脚本及验证截图
  4. [ ] 测试报告(1页纸)

格式要求:电子文档提交,截图清晰。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K2 功能性 我能设计合理的测试用例并正确执行 用例混乱 基本覆盖 完整规范 有边界测试
K3 过程导向 我能按步骤完成EXPLAIN分析和索引优化 步骤混乱 基本完成 完整规范 能解释原理
K4 使用价值 我的测试能发现系统的实际问题 没发现问题 发现小问题 发现关键问题 有预防性建议
K5 经济性 我的索引设计合理,不盲目添加 不加或乱加 基本合理 精准优化 全面权衡

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
测试用例设计 20 覆盖正常/异常场景,至少5个
EXPLAIN分析 20 分析正确,理解type/key/rows
索引优化 20 索引设计合理,优化效果明显
展示答辩 20 展示清晰、能回答问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
测试用例设计 20% 教师评
EXPLAIN分析 20% 教师评
索引优化 20% 教师评
展示答辩 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 设计测试用例时我容易遗漏的场景是:________________________
  2. EXPLAIN结果中我最看不懂的是:________________________
  3. 下一个任务(6-7)我要准备的是:________________________

# ■ 理论注解 ★(可选阅读)

【P1 索引为什么能加速查询?】

想象你在图书馆找一本书。没有索引时,就像从第一排书架开始,一本一本翻——这就是"全表扫描"(ALL)。有索引时,就像查目录卡,直接定位到某排某架——这就是"索引查找"(ref/range)。

但索引也有代价:

  • 每本书进馆(INSERT)都要更新目录卡
  • 每本书换位置(UPDATE)都要更新目录卡
  • 目录卡本身也占空间

所以索引要"精准打击"——只在查询频繁、修改稀少的字段上加。borrow_records表的reader_idbook_id查询多、修改少,非常适合加索引。而status字段如果频繁从"借阅中"改成"已归还",索引维护成本就比较高。



# 【任务6-7】项目汇报——成果展示与答辩评价 【C→T】


# ■ 任务呈现区

情境:四周的项目开发到了收官时刻!王馆长要来听你们小组的汇报。你们需要像真正的软件项目团队一样,制作PPT演示文稿,现场运行系统,回答提问。这不仅是技术的展示,更是沟通能力、团队协作能力和职业素养的综合考验。

学习目标

  1. 能制作结构清晰的PPT演示文稿(8-12页)
  2. 能现场演示系统的核心功能(运行SQL)
  3. 能清晰表达设计思路和解决问题的过程
  4. 能回答他组和教师的提问

核心输出物

  • [ ] PPT演示文稿(8-12页)
  • [ ] 系统现场演示(运行SQL脚本,展示功能)
  • [ ] 答辩回答记录
  • [ ] 组间互评表

# ■ 任务定位栏

【3D Penetration】本工单的三维属性标注

内容维度:⑤ 综合项目型(成果汇报+答辩评价)

行动维度:资讯→计划→决策→执行→展示→评价(完整六步)

需求维度:目标水平=L3→L4 | 核心K标准:K1/K6/K7/K8

向上穿透:T层"项目汇报与答辩"→C层"数据库项目综合展示能力"→P层"软件项目汇报与沟通能力"→G层"表达展示与职业素养"


# ■ 分组与角色分配

分组原则:4人/组,异质分组。本任务建议全员参与汇报,每人负责1-2页PPT和对应讲解。

角色分工(本任务建议角色分配):

角色 主要职责 本任务重点能力培养
组长 统筹PPT结构、主持汇报、协调答辩 项目汇报与现场把控能力
操作员 负责现场SQL演示(投屏操作电脑) 现场操作与应变能力
记录员 制作PPT、准备讲稿、记录答辩问题 演示文稿制作与文档能力
复核员 检查PPT内容准确性、准备可能被问到的问题 内容审核与预判能力

轮换规则:本任务为模块六最后一个任务,建议全员轮换汇报角色,每人讲解一部分。

小组公约





# ■ 知识准备区

1. PPT结构模板(每页内容提示)

页码 内容 建议时长 讲解人
第1页 封面:项目名称、小组名称、成员名单 30秒 组长
第2页 项目背景:图书馆痛点、项目目标 1分钟 组长
第3页 需求分析:功能清单(勾选展示) 1分钟 记录员
第4页 数据库设计:E-R图展示 1分钟 记录员
第5页 表结构设计:关系表截图 1分钟 操作员
第6页 系统实现:建库建表+数据初始化概述 1分钟 操作员
第7页 核心功能演示:视图+存储过程运行截图 2分钟 操作员
第8页 现场演示:打开MySQL,运行SQL 3分钟 操作员
第9页 测试与优化:测试用例表+EXPLAIN截图 1分钟 复核员
第10页 项目总结:收获、困难、解决方案 1分钟 复核员
第11页 反思与展望:如果再做一次,哪里改进 1分钟 组长
第12页 感谢页:谢谢聆听,欢迎提问 30秒 组长

💡 提示:总时长控制在12-15分钟,留3-5分钟给提问。

2. 现场演示注意事项

  • 提前测试:汇报前在教室电脑上测试MySQL能否正常打开
  • 备份方案:如果现场MySQL打不开,准备截图版"Plan B"
  • SQL文件准备:把要演示的SQL语句提前写在.sql文件中,复制粘贴比手打快且准
  • 放大字体:MySQL客户端字体调大,确保后排能看清

3. 常见答辩问题预判

问题 建议回答方向
"为什么选择这4个实体?" 围绕需求分析,说明每个实体解决什么问题
"借阅记录表的status字段为什么用VARCHAR而不用ENUM?" VARCHAR更通用,ENUM修改需改表结构
"如果图书库存很多,查询会变慢吗?" 我们加了索引,EXPLAIN显示从ALL变成ref
"你们遇到的最大困难是什么?怎么解决的?" 诚实回答,重点讲解决过程
"如果让你再加一个功能,你想加什么?" 提前想好,如"预约借书""图书推荐""扫码借书"

# ■ 计划区

子目标分解

子目标 具体内容 预计用时
确定PPT结构 小组讨论,按模板确定每页内容 20分钟
制作PPT 记录员主做,其他成员提供素材 60分钟
准备讲稿 每人写自己负责部分的讲稿 30分钟
彩排演练 完整排练一遍,计时 30分钟
现场演示 汇报+答辩 15分钟/组
组间互评 填写互评表 15分钟

行动方案

  1. 小组讨论:确定PPT每页的具体内容
  2. 收集素材:E-R图、表结构截图、SQL运行截图、测试用例表
  3. 制作PPT(建议用WPS/Office,简洁为主)
  4. 分配讲解任务,准备讲稿
  5. 组内彩排,控制时间
  6. 正式汇报

# ■ 决策区

关键决策点:现场演示是直接手敲SQL还是用准备好的脚本?

方案 方式 优点 缺点
A 直接手敲 展示真实能力 容易紧张打错,浪费时间
B 复制粘贴准备好的SQL 快速准确 显得不够"现场"
C 半准备:关键语句手敲,长语句复制 兼顾展示力和准确性 需要提前规划

我的选择:□A □B □C 选择理由:________________________________________

关键决策点:PPT风格选哪种?

方案 风格 适用情况
A 简洁商务风(白底黑字,少量图表) 内容为主,技术汇报推荐
B 活泼校园风(彩色、卡通元素) 拉近与同学距离
C 技术极客风(深色背景、代码高亮) 展示技术细节

我的选择:□A □B □C 选择理由:________________________________________


# ■ 展示区

展示内容清单

  • [ ] PPT演示文稿(8-12页,内容完整)
  • [ ] 现场SQL演示(建库→查询→借书→还书,或核心功能展示)
  • [ ] 项目成果物展示(.sql文件、截图等)

同伴互评记录(组间互评):

反馈人 问题/建议 我的回应/修正

# ■ 执行区

Step 1:收集素材 【执行】

复核员检查以下素材是否齐全:

素材 文件名/位置 是否已准备
E-R图
关系表设计文档
建库建表SQL脚本 library_system.sql
INSERT数据脚本 insert_data.sql
视图/存储过程脚本 create_views.sql / create_procedures.sql
测试用例表
EXPLAIN截图
系统运行截图 借书/还书/查询结果

Step 2:制作PPT 【执行】

按"知识准备区"的12页模板制作。记录员主做,每页完成后组长审核。

PPT制作 checklist:

  • □ 封面有项目名称、小组、成员
  • □ E-R图清晰可见,实体/关系可辨认
  • □ 表结构截图字体够大
  • □ SQL截图有重点标注(用红框/箭头)
  • □ 页码正确,总页数8-12页
  • □ 没有大段文字,每页不超过6行要点

Step 3:准备讲稿 【执行】

每人写自己负责页面的讲稿(控制在100字以内/页):

页码 讲解人 讲稿要点(不超过3条)
1. 2. 3.
1. 2. 3.
1. 2. 3.

Step 4:彩排 【检查】

完整排练一遍,计时:

轮次 用时 问题记录 改进措施
第1次 ______分钟
第2次 ______分钟

关键控制点:总时长控制在12-15分钟!超时会被打断。

Step 5:现场演示检查 【检查】

汇报前30分钟,操作员在教室电脑上检查:

  • □ MySQL服务已启动
  • □ 数据库library_system存在
  • □ 所有表和数据完整
  • □ 视图和存储过程可正常调用
  • □ 投屏/投影正常显示
  • □ 字体已调大(建议16号以上)

Plan B(如果MySQL打不开):

  • □ 所有关键截图已保存到PPT备用页

Step 6:正式汇报 【执行】

按分工进行汇报,组长注意控制时间。

Step 7:答辩 【执行】

记录员记录被问到的问题和回答:

提问人 问题 回答要点 回答满意度自评
⭐⭐⭐

# ■ 成果提交区

交付物清单

  1. [ ] PPT演示文稿(8-12页,.pptx格式)
  2. [ ] 现场演示记录(照片或视频截图)
  3. [ ] 答辩记录(提问和回答)
  4. [ ] 组间互评表(填写对其他组的评价)

格式要求:PPT以.pptx提交,答辩记录手写或电子均可。


# ■ 评价反思区

一、COMET K1-K8自评

K标准 评价维度 1分(初步) 2分(基本) 3分(熟练) 4分(精通)
K1 直观性 我的PPT清晰美观,讲解有条理 混乱难懂 基本可读 清晰规范 引人入胜
K6 社会责任 我在汇报中积极参与,配合团队 不参与 偶尔参与 积极承担 主导协调
K7 可持续性 我的项目设计考虑了后续维护和扩展 完全没考虑 略有涉及 基本考虑 有扩展设计
K8 系统思维 我能把需求→设计→实现→测试完整串讲 讲不清楚 基本完整 完整清晰 有深度反思

二、同伴互评(组内成员互评)

评价维度 权重 评分标准 组员A 组员B 组员C 平均分
任务参与度 30% 1-5分
角色履行度 30% 1-5分
协作配合度 20% 1-5分
成果贡献度 20% 1-5分
加权总分(满分5分)

协作系数 = 0.5 + 0.5 × (加权平均分 / 5) = ____________

三、教师评分(Rubric)

评分维度 满分 得分 评分要点
工单完成度 20 各区域完成质量
PPT质量 20 结构清晰、内容完整、美观大方
现场演示 20 SQL运行流畅、功能展示完整
讲解表达 20 表达清晰、时间控制得当、有互动
答辩表现 20 回答问题准确、有深度、不回避问题
教师评分合计 100

四、小组评分汇总

得分来源 原始得分 权重 计入得分 备注
工单完成度 20% 教师评
PPT质量 20% 教师评
现场演示 20% 教师评
讲解表达 20% 教师评
答辩表现 20% 教师评
个人最终得分 100%

小组排名(本任务):第______名 / 共______组


五、个人改进计划

  1. 本次项目汇报中我表现最好的是:________________________
  2. 我表现最不足的是:________________________
  3. 如果再做一次项目,我会在________方面改进:________________________

# ■ 理论注解 ★(可选阅读)

【P1 技术汇报的"黄金圈法则"】

著名的"黄金圈法则"(Simon Sinek提出)告诉我们:汇报时先讲"为什么",再讲"怎么做",最后讲"做了什么"。

  • Why(为什么):图书馆为什么需要这个系统?痛点是什么?
  • How(怎么做):你们是怎么设计数据库的?关键决策是什么?
  • What(做了什么):最终实现了哪些功能?效果如何?

很多同学的汇报顺序是反的:上来就讲"我们建了4张表",听众一脸茫然。如果先讲"图书馆用Excel管理,查找一本书要翻10分钟",再讲"所以我们设计了索引和视图",最后展示"现在查书只要0.1秒"——这就引人入胜了。



# 课程总结与综合评价


# 一、课程能力达成总评

恭喜你已经完成了《数据库原理与应用》的全部6个模块、24个工单任务!请对照以下清单,回顾你的能力成长。

# C层(课程能力)达成清单

能力代码 能力描述 自评(1-4分) 证据(完成的工单)
C1 能理解数据库基本概念和数据模型 任务1-1、1-2
C2 能进行小型数据库的需求分析和概念设计 任务2-1、2-2、6-1、6-2
C3 能使用MySQL创建数据库、数据表和完整性约束 任务3-1至3-4、6-3
C4 能使用SQL进行数据的增删改查操作 任务4-1至4-4、6-4
C5 能使用索引、视图、存储过程优化和管理数据库 任务5-1至5-4、6-5、6-6
C6 能完成一个小型数据库应用系统的设计与实现 任务6-1至6-7

# P层(专业群能力)达成清单

能力描述 自评(1-4分) 证据
数据库设计与实现能力 模块二、模块六
SQL语言编程能力 模块三、四、五、六
数据库管理与维护能力 模块五、六
软件项目文档撰写能力 各工单成果提交区

# G层(通用素养)达成清单

素养描述 自评(1-4分) 证据
逻辑思维与问题分析能力 各工单决策区
团队协作与沟通表达能力 各工单分组与展示区
自主学习能力与信息检索能力 知识准备区、理论注解
规范意识与文档撰写能力 各工单成果提交区

# 二、模块衔接与知识图谱

┌─────────────────────────────────────────────────────────────────┐
│                     《数据库原理与应用》知识图谱                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  【模块一】认识数据库世界                                          │
│    数据库系统概念 → 数据模型 → 关系数据库基础                      │
│         ↓                                                        │
│  【模块二】设计数据库                                              │
│    需求分析 → E-R图 → 关系模型转换 → 规范化                       │
│         ↓                                                        │
│  【模块三】MySQL基础操作                                           │
│    安装配置 → 存储引擎 → CREATE DATABASE/TABLE → 完整性约束       │
│         ↓                                                        │
│  【模块四】数据管理                                                │
│    INSERT → SELECT → WHERE/ORDER BY → JOIN                        │
│         ↓                                                        │
│  【模块五】进阶功能                                                │
│    索引(CREATE INDEX)→ 视图(CREATE VIEW)→ 存储过程(PROCEDURE)│
│         ↓                                                        │
│  【模块六】综合项目实战                                            │
│    需求分析 → E-R设计 → 建库建表 → 数据初始化 → 视图/存储过程      │
│    → 系统测试 → 性能优化 → 项目汇报                                │
│                                                                  │
│  ════════════════════════════════════════════════════════════    │
│  贯穿全课程的总任务:为学校图书馆设计并实现图书借阅管理系统数据库    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

模块之间的递进关系

前一模块 后一模块 衔接点
模块一(概念) 模块二(设计) 先用数据模型描述世界,再设计具体结构
模块二(设计) 模块三(实现) E-R图和关系表需要MySQL来实现
模块三(建表) 模块四(数据) 表建好了才能往里面放数据
模块四(操作) 模块五(进阶) 基础SQL熟练后才能学索引、视图、存储过程
模块五(进阶) 模块六(综合) 所有知识点在综合项目中整合应用

# 三、向真实岗位的迁移指南

本课程对接以下真实岗位,每个岗位需要重点掌握的能力如下:

# 岗位1:数据库管理员助理(DBA助理)

日常工作 本课程对应能力 建议加强
安装配置数据库服务器 模块三 学习Linux系统、MySQL集群
监控数据库运行状态 模块五、六 学习性能监控工具(如Prometheus)
备份和恢复数据库 模块六 学习mysqldump、XtraBackup
创建用户和分配权限 模块三 学习GRANT/REVOKE语句
优化慢查询 模块五、六 深入学习执行计划、慢查询日志

# 岗位2:软件开发助理

日常工作 本课程对应能力 建议加强
根据需求设计数据库表 模块二、六 学习ORM框架(如MyBatis)
编写SQL查询供程序调用 模块四、五 学习一门编程语言(Java/Python)
调试数据相关Bug 模块四、六 学习单元测试、接口测试
与前端协作确定数据结构 模块二 学习RESTful API设计

# 岗位3:数据录入与维护员

日常工作 本课程对应能力 建议加强
批量导入数据 模块四 学习Excel高级功能、Python数据处理
核对数据准确性 模块四、六 学习数据清洗技术
生成统计报表 模块四、五 学习报表工具(如帆软报表)
维护数据字典 模块二、三 学习数据治理基础

# 四、继续学习路径建议

根据你的兴趣和职业方向,选择以下继续学习路径:

# 路径A:数据库专家方向(适合喜欢深耕技术的同学)

阶段1(已学完)→ 阶段2 → 阶段3 → 阶段4
《数据库原理与应用》 → 《MySQL高级应用》 → 《数据库性能优化》 → 《分布式数据库》
                        (存储引擎深入、   (执行计划分析、    (Redis、MongoDB、
                         事务与锁、复制)   分区表、读写分离)   TiDB、分库分表)

# 路径B:软件开发方向(适合喜欢做应用的同学)

阶段1(已学完)→ 阶段2 → 阶段3 → 阶段4
《数据库原理与应用》 → 《Java/Python程序设计》 → 《Web应用开发》 → 《企业级项目实战》
                        (语言基础、        (Spring/Flask、   (微服务、
                         面向对象)         前后端分离)       容器化部署)

# 路径C:数据分析方向(适合喜欢从数据中发现规律的同学)

阶段1(已学完)→ 阶段2 → 阶段3 → 阶段4
《数据库原理与应用》 → 《Python数据分析》 → 《数据可视化》 → 《商业智能BI》
                        (Pandas、NumPy、  (ECharts、        (Tableau、
                         数据清洗)         PowerBI)          数据仓库)

# 推荐免费学习资源

资源名称 类型 说明
MySQL官方文档 文档 https://dev.mysql.com/doc/
菜鸟教程-SQL 网站 https://www.runoob.com/sql/sql-tutorial.html
廖雪峰SQL教程 教程 通俗易懂的SQL入门教程
LeetCode数据库题 练习 在线刷SQL题,有难度分级
B站MySQL视频 视频 搜索"MySQL入门",选择播放量高的教程


# 附录


# 附录A:SQL语句速查卡

💡 使用提示:本速查卡建议打印后塑封,放在桌边随时查阅。


# 一、数据库操作

-- 创建数据库
CREATE DATABASE database_name
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

-- 删除数据库(危险!慎用!)
DROP DATABASE IF EXISTS database_name;

-- 使用/切换数据库
USE database_name;

-- 查看所有数据库
SHOW DATABASES;

-- 查看当前数据库
SELECT DATABASE();

# 二、表操作

-- 创建表
CREATE TABLE table_name (
    column1 datatype CONSTRAINT,
    column2 datatype CONSTRAINT,
    PRIMARY KEY (column1),
    FOREIGN KEY (column2) REFERENCES other_table(other_column)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 常用数据类型速记
-- INT          整数
-- DECIMAL(m,n) 小数(m总位数,n小数位)
-- VARCHAR(n)   变长字符串(最多n个字符)
-- CHAR(n)      定长字符串
-- DATE         日期(YYYY-MM-DD)
-- DATETIME     日期时间(YYYY-MM-DD HH:MM:SS)
-- TEXT         长文本

-- 常用约束速记
-- PRIMARY KEY      主键(唯一且非空)
-- AUTO_INCREMENT   自增(只能用于主键整数)
-- NOT NULL         非空
-- UNIQUE           唯一
-- DEFAULT value    默认值
-- FOREIGN KEY      外键

-- 查看所有表
SHOW TABLES;

-- 查看表结构
DESCRIBE table_name;
-- 或
SHOW COLUMNS FROM table_name;

-- 查看完整建表语句
SHOW CREATE TABLE table_name;

-- 修改表:添加列
ALTER TABLE table_name ADD column_name datatype;

-- 修改表:修改列类型
ALTER TABLE table_name MODIFY column_name new_datatype;

-- 修改表:删除列
ALTER TABLE table_name DROP COLUMN column_name;

-- 修改表:添加外键
ALTER TABLE table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name) REFERENCES parent_table(parent_column);

-- 删除表
DROP TABLE IF EXISTS table_name;

-- 清空表数据(保留表结构)
TRUNCATE TABLE table_name;

# 三、数据操作(CRUD)

-- ========== 增(CREATE)==========

-- 插入单条
INSERT INTO table_name (column1, column2) 
VALUES (value1, value2);

-- 插入多条(推荐)
INSERT INTO table_name (column1, column2) VALUES
(value1, value2),
(value3, value4),
(value5, value6);

-- 从另一个表插入
INSERT INTO table_name SELECT * FROM other_table WHERE condition;


-- ========== 查(READ)==========

-- 查询所有列
SELECT * FROM table_name;

-- 查询指定列
SELECT column1, column2 FROM table_name;

-- 去重查询
SELECT DISTINCT column1 FROM table_name;

-- 条件查询
SELECT * FROM table_name WHERE condition;
-- 常用条件运算符:=  !=(或<>)  >  <  >=  <=  BETWEEN  LIKE  IN  IS NULL

-- 模糊查询
SELECT * FROM table_name WHERE column LIKE '%关键词%';
-- % 表示任意多个字符
-- _ 表示单个字符

-- 排序
SELECT * FROM table_name ORDER BY column1 ASC, column2 DESC;
-- ASC 升序(默认)  DESC 降序

-- 分页
SELECT * FROM table_name LIMIT 10;           -- 前10条
SELECT * FROM table_name LIMIT 10 OFFSET 20; -- 跳过20条,取10条

-- 聚合函数
SELECT COUNT(*) FROM table_name;      -- 计数
SELECT SUM(column) FROM table_name;   -- 求和
SELECT AVG(column) FROM table_name;   -- 平均
SELECT MAX(column) FROM table_name;   -- 最大
SELECT MIN(column) FROM table_name;   -- 最小

-- 分组统计
SELECT column1, COUNT(*) 
FROM table_name 
GROUP BY column1;

-- 分组后过滤
SELECT column1, COUNT(*) 
FROM table_name 
GROUP BY column1 
HAVING COUNT(*) > 5;
-- WHERE 在分组前过滤,HAVING 在分组后过滤

-- 内连接(只返回匹配的行)
SELECT a.*, b.* 
FROM table_a a
INNER JOIN table_b b ON a.id = b.a_id;

-- 左连接(返回左表所有行,右表不匹配填NULL)
SELECT a.*, b.* 
FROM table_a a
LEFT JOIN table_b b ON a.id = b.a_id;


-- ========== 改(UPDATE)==========

UPDATE table_name 
SET column1 = value1, column2 = value2 
WHERE condition;
-- ⚠️ 切记加WHERE!不加WHERE会更新全表!


-- ========== 删(DELETE)==========

DELETE FROM table_name WHERE condition;
-- ⚠️ 切记加WHERE!不加WHERE会删除全表!

# 四、高级对象

-- ========== 索引 ==========

-- 创建索引
CREATE INDEX index_name ON table_name(column_name);

-- 创建复合索引
CREATE INDEX index_name ON table_name(column1, column2);

-- 删除索引
DROP INDEX index_name ON table_name;

-- 查看索引
SHOW INDEX FROM table_name;


-- ========== 视图 ==========

-- 创建视图
CREATE VIEW view_name AS
SELECT column1, column2 
FROM table_name 
WHERE condition;

-- 查询视图(和查表一样)
SELECT * FROM view_name;

-- 删除视图
DROP VIEW IF EXISTS view_name;


-- ========== 存储过程 ==========

-- 创建存储过程(注意DELIMITER!)
DELIMITER //
CREATE PROCEDURE procedure_name(IN param1 datatype, OUT param2 datatype)
BEGIN
    -- SQL语句
    SELECT column INTO param2 FROM table_name WHERE id = param1;
END //
DELIMITER ;

-- 调用存储过程
CALL procedure_name('参数值', @结果);
SELECT @结果;

-- 删除存储过程
DROP PROCEDURE IF EXISTS procedure_name;

# 附录B:MySQL常用数据类型速查表

数据类型 说明 存储范围/大小 使用场景
整数型
TINYINT 很小的整数 -128~127(1字节) 状态码(0/1)
SMALLINT 小整数 -32768~32767(2字节) smallint
INT 标准整数 -21亿~21亿(4字节) 编号、数量
BIGINT 大整数 极大(8字节) 自增ID(超大数据量)
小数型
FLOAT 单精度浮点 约6-7位有效数字 科学计算
DOUBLE 双精度浮点 约15位有效数字 科学计算
DECIMAL(m,n) 定点小数 m位数字,n位小数 金额、价格(精确计算)
字符串型
CHAR(n) 定长字符串 n个字符(最多255) 固定长度(如性别'M'/'F')
VARCHAR(n) 变长字符串 n个字符(最多65535) 姓名、书名、地址
TEXT 长文本 最多65535字符 简介、备注
日期时间型
DATE 日期 YYYY-MM-DD 生日、办证日期
TIME 时间 HH:MM:SS 时间段
DATETIME 日期时间 YYYY-MM-DD HH:MM:SS 创建时间、修改时间
TIMESTAMP 时间戳 自动更新 记录最后修改时间
其他
ENUM 枚举 最多65535个值 固定选项(如状态)
BOOLEAN 布尔 0或1 是/否判断

💡 选类型口诀:整数选INT,小数用DECIMAL,字符串用VARCHAR,日期用DATE或DATETIME,状态用VARCHAR或TINYINT。


# 附录C:COMET八标准能力评价速查表

K标准 全称 核心含义 数据库课程中的应用场景
K1 直观性/形象性 呈现清晰、结构合理、易于理解 E-R图是否清晰?表结构设计是否一目了然?
K2 功能性 解决方案有效、符合要求 SQL语句能否正确执行并返回预期结果?
K3 过程导向性/使用价值导向性 行动步骤合理、目标导向 建库建表顺序是否正确?测试流程是否规范?
K4 使用价值/现实意义 对实际问题有价值 设计的系统是否真能解决图书馆的管理问题?
K5 经济性/效率 资源利用合理、不浪费 字段类型选择是否合理?索引是否精准?
K6 社会责任/合作性 团队合作、社会规范 小组协作是否积极?是否遵守机房规范?
K7 可持续性/环保性 长期有效、可维护、可扩展 数据库设计是否考虑了后续功能扩展?
K8 系统性/综合性 整体思考、各部分协调 从需求→设计→实现→测试是否形成完整闭环?

自评评分参考

分值 等级 描述
1分 初步 刚开始接触,还有很多不理解
2分 基本 能完成基本操作,但不够熟练
3分 熟练 能独立完成,结果正确规范
4分 精通 不仅能完成,还能优化、能教别人

# 附录D:常见错误排查指南(FAQ)

# Q1:MySQL服务启动失败怎么办?

排查步骤

  1. 右键"此电脑"→"管理"→"服务和应用程序"→"服务"
  2. 找到 MySQL 服务,右键→"启动"
  3. 如果启动失败,记下错误代码:
    • 错误1067:配置文件my.ini损坏,尝试重装或修复
    • 错误2:系统找不到文件,检查安装路径是否被移动
  4. 终极方案:用安装包Repair修复,或卸载重装

# Q2:忘记root密码怎么办?

重置步骤

  1. 停止MySQL服务
  2. 打开命令提示符(管理员),进入MySQL的bin目录
  3. 执行:mysqld --skip-grant-tables(跳过权限验证启动)
  4. 新开一个命令窗口,登录:mysql -u root
  5. 修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
  6. 重启MySQL服务(正常模式)

# Q3:中文乱码怎么解决?

检查清单

  1. 数据库字符集:SHOW CREATE DATABASE 数据库名; → 确认是utf8mb4
  2. 表字符集:SHOW CREATE TABLE 表名; → 确认是utf8mb4
  3. 客户端字符集:执行SET NAMES utf8mb4;
  4. 一劳永逸:在my.ini中添加:
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    

# Q4:外键创建失败的原因?

错误原因 检查方法 解决方法
字段类型不一致 DESCRIBE两张表对比 修改字段类型使其完全一致
被引用的字段不是主键 SHOW CREATE TABLE查看 给被引用字段加PRIMARY KEY
已有数据违反外键约束 检查表中现有数据 先删除/修改违规数据
引用的表不存在 SHOW TABLES确认 先创建被引用的表
引擎不是InnoDB SHOW CREATE TABLE查看 ALTER TABLE ... ENGINE=InnoDB;

# Q5:存储过程delimiter忘记改回来的错误?

现象:写完存储过程后,后面的普通SQL语句执行报错。

原因:创建存储过程时执行了DELIMITER //,但结尾忘了执行DELIMITER ;

解决

  1. 立即执行DELIMITER ;
  2. 如果还是不行,退出重连MySQL
  3. 养成习惯:写存储过程时,先写第一行DELIMITER //,再写最后一行DELIMITER ;,中间再填空

# Q6:INSERT插入中文报错?

解决:在插入前执行:SET NAMES utf8mb4;

# Q7:DELETE/UPDATE忘加WHERE,数据被删光了?

预防

  1. 执行前先SELECT确认影响范围
  2. 开启安全模式:SET SQL_SAFE_UPDATES = 1;(这样不加WHERE的UPDATE/DELETE会被拒绝)
  3. 定期备份:导出.sql文件

# Q8:EXPLAIN的type=ALL是什么意思?

含义:全表扫描,MySQL把表里每一行都读了一遍才找到结果。

解决:在WHERE条件和JOIN条件的字段上创建索引。


# 附录E:小组协作系数算法

# 一、协作系数公式

$$ 协作系数 = 0.5 + 0.5 \times \frac{加权平均分}{5} $$

# 二、计算示例

假设某同学获得的同伴互评如下:

评价维度 权重 组员A 组员B 组员C 平均分
任务参与度 30% 4 5 4 4.33
角色履行度 30% 4 4 5 4.33
协作配合度 20% 5 4 4 4.33
成果贡献度 20% 4 4 5 4.33

加权平均分计算: $$ 4.33 \times 30% + 4.33 \times 30% + 4.33 \times 20% + 4.33 \times 20% = 4.33 $$

协作系数计算: $$ 协作系数 = 0.5 + 0.5 \times \frac{4.33}{5} = 0.5 + 0.5 \times 0.866 = 0.5 + 0.433 = 0.933 $$

# 三、协作系数的意义

加权平均分 协作系数 说明
5.0 1.0 满分协作,同伴评价极高
4.0 0.9 良好协作
3.0 0.8 一般协作
2.0 0.7 协作较差
1.0 0.6 协作很差
0.0 0.5 最低系数,即使同伴给0分也保留50%

设计意图:协作系数最低为0.5,即使同伴评价很低也不会完全抹杀个人在其他维度(如工单完成度、成果质量)的努力;最高为1.0,激励积极参与协作。


# 附录F:工单式教学改革反馈表

请同学和教师填写本表,帮助我们持续改进工单式教学。

# 学生反馈

反馈项目 非常满意 满意 一般 不满意
工单结构清晰易懂
任务情境贴近实际
知识准备区有帮助
模板和脚手架足够
评价反思区有价值
小组协作促进学习
总体学习效果

开放题

  1. 你最喜欢的任务是哪一个?为什么?

  1. 你觉得哪个任务最难?需要哪些额外帮助?

  1. 你对工单式教学有什么建议?

# 教师反馈

反馈项目 非常好 一般 需改进
工单与课程目标匹配度
课时安排合理性
学生参与度
成果可评价性
教材可复用性

开放题

  1. 实施本工单时遇到的主要困难是什么?

  1. 对工单内容的修改建议:

  1. 对工单式教学模式的总体评价:


教材编写信息

课程名称:《数据库原理与应用》 教材版本:1.0 编写日期:2026-06-08 适用对象:高职计算机应用技术、软件技术、大数据技术、电子商务等专业 总课时:96课时(24个工单任务) 编写依据:泰州职业技术学院工单式教学指导书(第1版) 理论基础:完整行动七步法 × GPCT四层穿透 × COMET八标准


【全书完】