学习自测(MySQL系列第一期、第二期)
以下十个问题覆盖前两期笔记的核心知识点。请尝试独立回答,检验掌握程度,发现薄弱环节。
-
数据分类:请结合具体例子说明结构化数据、半结构化数据和非结构化数据的核心区别。为什么说半结构化数据是"自描述"的?
-
数据管理发展:文件系统管理数据阶段相比人工管理阶段有哪些进步?又存在哪些主要缺陷?这些缺陷如何被数据库系统阶段解决?
-
关系型数据库核心术语:解释主键、外键、复合键的作用。为什么主键通常使用自增整数类型?请给出一个必须使用复合键的实际场景。
-
E-R模型与联系类型:设计一个"学生选课"系统的局部E-R图,至少包含学生、课程两个实体以及它们之间的联系。请分别说明实体、属性、联系在图中的表示符号,并判断联系类型属于哪种(1:1, 1:n, m:n)?
-
数据库规范化(范式):某张表包含字段(订单ID,商品ID,商品名称,数量,单价,总价),其中主键为(订单ID,商品ID),"商品名称"只依赖于"商品ID","总价"可由"数量×单价"计算得出。请问该表违反了哪几个范式?应如何拆分?
-
SQL语言分类 :将以下操作归类为 DDL、DML、DQL、DCL 或 TCL:
CREATE DATABASE、INSERT、SELECT、GRANT、ALTER TABLE、DELETE、COMMIT、DROP USER。 -
MySQL客户端使用 :写出使用mysql命令行工具连接到远程主机 192.168.1.100 的 3307 端口,用户名为 reporter,密码为 123abc,并直接执行
SHOW DATABASES;后退出的完整命令。同时说明如何用mysqladmin创建一个名为testdb的数据库。 -
数据库与表的DDL操作:请写出完整的SQL语句完成以下任务(顺序执行):
- 创建数据库
company,默认字符集为 utf8mb4; - 在该库中创建表
employees,包含字段:emp_id(自增主键)、name(非空)、hire_date(日期类型)、salary(精确到两位小数,无符号); - 为
employees表添加一个email字段(变长字符串,最大100); - 将
salary字段的类型改为DECIMAL(12,2); - 删除
hire_date字段。
- 创建数据库
-
数据类型与选择原则:为以下业务场景选择最合适的数据类型,并简要说明理由:
- 用户年龄(0~150)
- 商品价格(如 19.99 元)
- 用户手机号(11位数字)
- 文章正文(可能超过5000字)
- 员工状态(在职/离职/休假,三选一)
-
字符集与排序规则 :MySQL 8.0 默认字符集是什么?
utf8mb4与旧版utf8(即utf8mb3)有何关键区别?排序规则utf8mb4_0900_ai_ci中的ai和ci分别代表什么含义?什么情况下需要选择utf8mb4_bin?
建议:回答时尽量动手在 MySQL 环境中验证。如有不清楚的地方,可回看第一期和第二期相关章节。后续笔记会继续深入,请保持练习。
自测解析笔记第一期:MySQL系列第一期、第二期详解
本笔记为前两期学习笔记的配套自测题解析。共十题,每题包含:题目回顾、考查知识点、详细解答与分析。建议先独立完成自测,再对照本解析查漏补缺。
题目一:数据分类
题目:请结合具体例子说明结构化数据、半结构化数据和非结构化数据的核心区别。为什么说半结构化数据是"自描述"的?
考查知识点
- 数据的三种分类及其特征(第一期 §1.1)
- 半结构化数据的"自描述"含义
详细解答
| 类型 | 核心区别 | 示例 |
|---|---|---|
| 结构化数据 | 可用二维表逻辑表达,固定格式和有限长度,先有结构后有数据 | MySQL 中存储的学生表(学号、姓名、年龄) |
| 半结构化数据 | 不符合关系型数据模型,但包含标签/标记来分隔语义元素,先有数据后有结构,数据结构与内容混合 | JSON、XML、HTML |
| 非结构化数据 | 没有固定结构,无法用二维表表示,整体存储 | 音视频文件、图片、二进制文件 |
"自描述"含义 :半结构化数据中,数据的结构和内容不分离,标签或标记本身描述了数据的含义。例如 JSON 中的 "name":"唐三",name 这个键直接说明了后面值的意义,不需要额外的数据字典或表结构来定义。因此,即使没有预先定义模式,接收方也能理解数据结构。
题目二:数据管理发展
题目:文件系统管理数据阶段相比人工管理阶段有哪些进步?又存在哪些主要缺陷?这些缺陷如何被数据库系统阶段解决?
考查知识点
- 数据管理的三个阶段及其特点(第一期 §1.2)
- 文件系统的优缺点
- 数据库系统的改进
详细解答
进步(优点):
- 数据可以长期保存在磁盘中
- 文件格式多样化(文本、二进制等)
- 由文件系统进行管理,具备一定独立性
- 支持批处理和联机实时处理
缺陷:
- 应用程序对接不方便,没有统一接口
- 不支持并发访问,无安全控制
- 难以按用户视图表示数据
- 数据间联系弱
- 数据冗余不可避免
数据库系统如何解决:
- 提供统一的数据定义语言(DDL)和操作语言(DML),统一接口
- 实现并发控制机制,保证多用户同时访问的正确性
- 采用复杂的数据模型(如关系模型),清晰表达数据间联系
- 通过规范化理论减少数据冗余
- 提供安全性检查、完整性约束、事务管理等功能
题目三:关系型数据库核心术语
题目:解释主键、外键、复合键的作用。为什么主键通常使用自增整数类型?请给出一个必须使用复合键的实际场景。
考查知识点
- RDBMS 核心术语(第一期 §1.4)
- 主键、外键、复合键定义
- 自增主键的工程理由
详细解答
| 术语 | 作用 |
|---|---|
| 主键 | 唯一标识表中的每一行,不允许为 NULL,一个表只能有一个主键 |
| 外键 | 关联两个表,引用另一张表的主键,保证参照完整性 |
| 复合键 | 由多个列组合而成的索引键,常用于表示多对多关系的中间表 |
为什么主键通常使用自增整数类型:
- 唯一性保证:自增机制天然生成唯一值,不会重复
- 性能优势:整数比较比字符串快,且主键默认是聚簇索引,整型自增可以避免页分裂,提高插入效率
- 存储空间:INT(4字节)或 BIGINT(8字节)占用空间小
- 业务无关性:不依赖业务字段,避免业务变动影响主键
必须使用复合键的场景 :多对多关系的中间表。例如"学生选课"中间表,包含 (student_id, course_id) 作为复合主键,因为同一个学生可以选多门课,同一门课可以被多个学生选,只有联合才能唯一标识一条选课记录。
题目四:E-R 模型与联系类型
题目:设计一个"学生选课"系统的局部 E-R 图,至少包含学生、课程两个实体以及它们之间的联系。请分别说明实体、属性、联系在图中的表示符号,并判断联系类型属于哪种?
考查知识点
- E-R 模型组成及符号(第一期 §1.4.1)
- 联系类型判断(第一期 §1.4.2)
详细解答
E-R 图符号:
- 实体 → 矩形(如:学生、课程)
- 属性 → 椭圆形(如:学号、姓名、课程号、课程名、学分)
- 联系 → 菱形(如:选修)
联系类型 :学生与课程之间是 多对多(m:n) 关系。一个学生可选多门课程,一门课程可被多名学生选修。
E-R 图示(文字描述):
text
(学号) (姓名) (课程号) (课程名)
│ │ │ │
○ ○ ○ ○
\ / \ /
\ / \ /
╲ ╱ ╲ ╱
[学生] [课程]
\ /
\ /
\ /
╲ ╱
╲ ╱
╲ ╱
◇ 选修 ◇
/ \
/ \
/ \
(成绩) (选课时间)
○ ○
联系属性:在"选修"联系上可以附加属性,如"成绩"、"选课时间"等。
转关系模式:多对多联系需要转换为一个独立的中间表,包含两个外键(分别指向学生和课程)以及联系的属性。
题目五:数据库规范化(范式)
题目:某张表包含字段(订单ID,商品ID,商品名称,数量,单价,总价),其中主键为(订单ID,商品ID),"商品名称"只依赖于"商品ID","总价"可由"数量×单价"计算得出。请问该表违反了哪几个范式?应如何拆分?
考查知识点
- 第一范式(1NF)、第二范式(2NF)、第三范式(3NF)的定义与识别(第一期 §1.4.4)
- 部分依赖与传递依赖
详细解答
分析:
-
1NF 检查:所有字段都是原子值,满足 1NF。
-
2NF 检查 :主键为复合键
(订单ID, 商品ID)。非主键字段:- "数量"依赖于完整的 (订单ID, 商品ID) → 完全依赖,没问题。
- "单价"依赖于 "商品ID" 吗?通常单价由商品决定 → 部分依赖(只依赖商品ID)。
- "商品名称"依赖于 "商品ID" → 部分依赖。
- "总价" = 数量 × 单价 → 属于派生属性,不独立依赖主键。
结论:违反 2NF(存在部分依赖)。
-
3NF 检查:先要满足 2NF。即使拆到 2NF,还可能存在传递依赖。例如如果"商品ID"确定"供应商名称","供应商名称"再确定"供应商地址",则"供应商地址"传递依赖于"商品ID"。本题未给出,暂不涉及。
拆分方案(至少满足 3NF):
- 订单明细表(订单ID,商品ID,数量)--- 主键 (订单ID, 商品ID)
- 商品表(商品ID,商品名称,单价)--- 主键 商品ID
- 订单表(订单ID,订单日期,客户ID...)--- 主键 订单ID
- 总价 通常不做存储,查询时计算
数量 * 单价即可,避免数据冗余和更新异常。
改进后:消除了部分依赖,且总价不再存储,符合设计原则。
题目六:SQL 语言分类
题目 :将以下操作归类为 DDL、DML、DQL、DCL 或 TCL:CREATE DATABASE、INSERT、SELECT、GRANT、ALTER TABLE、DELETE、COMMIT、DROP USER。
考查知识点
- SQL 语句分类(第二期 §1.1)
详细解答
| 语句 | 分类 | 说明 |
|---|---|---|
CREATE DATABASE |
DDL | 数据定义语言,定义数据库结构 |
INSERT |
DML | 数据操纵语言,增加数据 |
SELECT |
DQL | 数据查询语言(有时归为 DML 的子集,但单独列出) |
GRANT |
DCL | 数据控制语言,授权 |
ALTER TABLE |
DDL | 修改表结构 |
DELETE |
DML | 删除数据 |
COMMIT |
TCL | 事务控制语言,提交事务 |
DROP USER |
DDL | 删除用户(属于定义用户对象) |
注意 :不同教材可能将 DQL 视为 DML 的一部分,但标准分类中通常单独列出。DROP USER 虽然没有直接操作表结构,但用户是数据库对象,属于 DDL。
题目七:MySQL 客户端使用
题目 :写出使用 mysql 命令行工具连接到远程主机 192.168.1.100 的 3307 端口,用户名为 reporter,密码为 123abc,并直接执行 SHOW DATABASES; 后退出的完整命令。同时说明如何用 mysqladmin 创建一个名为 testdb 的数据库。
考查知识点
- mysql 客户端选项(第一期 §2.4.4.1)
- mysqladmin 创建数据库(第一期 §2.4.4.3)
详细解答
mysql 连接并执行单条语句:
bash
mysql -h 192.168.1.100 -P 3307 -u reporter -p123abc -e "SHOW DATABASES;"
说明:
-h指定主机-P指定端口(大写)-u指定用户名-p123abc密码直接写在后面(生产环境不建议,会暴露在命令行历史中;可只写-p然后交互输入)-e后跟要执行的 SQL 语句,执行后自动退出。
mysqladmin 创建数据库:
bash
mysqladmin -h 192.168.1.100 -P 3307 -u reporter -p123abc create testdb
如果密码为空可省略
-p;否则建议只写-p回车后输入。
题目八:数据库与表的 DDL 操作
题目:请写出完整的 SQL 语句完成以下任务(顺序执行):
- 创建数据库
company,默认字符集为 utf8mb4; - 在该库中创建表
employees,包含字段:emp_id(自增主键)、name(非空)、hire_date(日期类型)、salary(精确到两位小数,无符号); - 为
employees表添加一个email字段(变长字符串,最大100); - 将
salary字段的类型改为DECIMAL(12,2); - 删除
hire_date字段。
考查知识点
- 创建数据库及指定字符集(第二期 §3.2)
- 创建表(字段定义、主键、数据类型、约束)(第二期 §5.1)
- ALTER TABLE 添加、修改、删除字段(第二期 §5.3)
详细解答
sql
-- 1. 创建数据库 company,指定字符集
CREATE DATABASE company DEFAULT CHARACTER SET utf8mb4;
-- 2. 切换到该数据库
USE company;
-- 3. 创建 employees 表
CREATE TABLE employees (
emp_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
hire_date DATE,
salary DECIMAL(10,2) UNSIGNED
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 4. 添加 email 字段
ALTER TABLE employees ADD email VARCHAR(100);
-- 5. 修改 salary 字段类型为 DECIMAL(12,2)
ALTER TABLE employees MODIFY salary DECIMAL(12,2) UNSIGNED;
-- 6. 删除 hire_date 字段
ALTER TABLE employees DROP COLUMN hire_date;
注意 :
DECIMAL(M,D)中的 M 是总位数,D 是小数位数。最初设DECIMAL(10,2)可表示最大 99999999.99,足够一般工资。后改为DECIMAL(12,2)更宽松。删除字段操作不可逆,生产环境谨慎。
题目九:数据类型与选择原则
题目:为以下业务场景选择最合适的数据类型,并简要说明理由:
- 用户年龄(0~150)
- 商品价格(如 19.99 元)
- 用户手机号(11位数字)
- 文章正文(可能超过5000字)
- 员工状态(在职/离职/休假,三选一)
考查知识点
- 数据类型的选择原则(第二期 §4)
- 各数据类型的适用场景
详细解答
| 业务场景 | 推荐类型 | 理由 |
|---|---|---|
| 用户年龄 | TINYINT UNSIGNED |
范围 0-255,足够存年龄(0~150),无符号更合适,占用仅1字节 |
| 商品价格 | DECIMAL(10,2) |
金额必须精确,不能使用浮点型(FLOAT/DOUBLE会丢失精度),DECIMAL 保证精确计算 |
| 用户手机号 | CHAR(11) 或 VARCHAR(11) |
手机号是固定11位数字,但不建议存为整数 (可能丢失前导0,且无法做正则校验)。字符类型更合适,CHAR(11) 定长效率高 |
| 文章正文 | TEXT 或 LONGTEXT |
超过5000字可能超过 VARCHAR(65535) 的行限制,TEXT 可存约64KB,足够普通文章;极长文章用 LONGTEXT |
| 员工状态 | ENUM('在职','离职','休假') 或 TINYINT |
ENUM 语义清晰,限制只能选三个值;或用 TINYINT(1) 映射 0,1,2 占用空间更小 |
题目十:字符集与排序规则
题目 :MySQL 8.0 默认字符集是什么?utf8mb4 与旧版 utf8(即 utf8mb3)有何关键区别?排序规则 utf8mb4_0900_ai_ci 中的 ai 和 ci 分别代表什么含义?什么情况下需要选择 utf8mb4_bin?
考查知识点
- MySQL 默认字符集演变(第二期 §2.1)
- utf8 与 utf8mb4 的区别
- 排序规则后缀含义
- 区分大小写与二进制比较
详细解答
MySQL 8.0 默认字符集 :utf8mb4
utf8mb4 与 utf8mb3 的区别:
- MySQL 中的
utf8实际上是utf8mb3,每个字符最多用 3 个字节存储,不支持辅助字符(如 emoji 表情、部分罕见汉字)。 utf8mb4是真正的 UTF-8 编码,每个字符最多用 4 个字节,完整支持 Unicode(含 emoji)。- 建议始终使用
utf8mb4,避免存储特殊字符时出错。
排序规则 utf8mb4_0900_ai_ci 后缀含义:
0900:基于 Unicode 9.0.0 标准ai:Accent Insensitive (不区分重音),例如é和e视为相同ci:Case Insensitive (不区分大小写),例如A和a视为相同
需要选择 utf8mb4_bin 的场景:
- 需要区分大小写和重音,进行二进制严格比较时
- 用户名、密码校验(虽然密码通常存储哈希,但某些场景需要大小写敏感的唯一性)
- 程序代码中需要精确匹配字符字节值的场景
示例 :
SELECT 'A' = 'a' COLLATE utf8mb4_bin;返回 0(不相等)。
附:知识点对应总表
| 题号 | 主要考查知识点(对应笔记章节) |
|---|---|
| 1 | 第一期 §1.1 数据的分类 |
| 2 | 第一期 §1.2 数据管理发展历史 |
| 3 | 第一期 §1.4 关系型数据库理论(主键、外键、复合键) |
| 4 | 第一期 §1.4.1 E-R 模型;§1.4.2 联系类型 |
| 5 | 第一期 §1.4.4 数据库规范化(1NF、2NF、3NF) |
| 6 | 第二期 §1.1 SQL 分类 |
| 7 | 第一期 §2.4.4 MySQL 客户端使用;§2.4.4.3 mysqladmin |
| 8 | 第二期 §3(数据库 DDL);§5(表 DDL) |
| 9 | 第二期 §4 数据类型(选择原则) |
| 10 | 第二期 §2 字符集与排序规则 |
学习建议:对于答错的题目,请回看对应章节,并动手在 MySQL 环境中执行相关代码。后续笔记将继续深入 SQL 查询与多表操作,建议扎实掌握当前基础知识。