
MySQL数据库基础 — 完整知识点复习资料
整合来源:教案 + 9章PPT课件 适用考试:2026年7月3日(下周五) 使用方法:逐单元阅读,重点命令务必手写默写!
1. 认识数据库
1.1 数据管理技术发展阶段(填空/选择高频)
数据管理技术经历了三个阶段:
- 人工管理阶段 — 没有专用软件,数据面向应用,一组数据只能对应一个程序
- 文件系统阶段 — 有三大约束:数据冗余性、数据不一致性、数据联系弱
- 数据库系统阶段 — 数据可共享、冗余低、独立性高
填空:数据管理技术经历了人工管理、文件系统 和 数据库系统 三个阶段。
1.2 三种基本数据模型(选择高频)
| 模型 | 数据结构 | 说明 |
|---|---|---|
| 层次模型 | 树形结构 | 按层次组织数据 |
| 网状模型 | 无向图 | 复杂网状结构 |
| 关系模型 | 二维表 | MySQL使用的模型 |
填空:按照数据结构的类型来命名,逻辑模型分为 层次模型、网状模型和 关系模型。
1.3 关系模型核心概念
- 二维表 = 关系
- 行 = 记录(元组)
- 列 = 字段(属性)
- 主键 = 唯一标识一条记录
- 外键 = 引用其他表主键
1.4 实体间的三种联系(填空高频)
实体之间的联系可抽象为三类:一对一(1:1)、一对多(1:n) 和 多对多(m:n)。
1.5 数据库的特点
数据库系统的特点:
- 数据共享 ✅
- 数据冗余低 ✅(不是高!)
- 数据独立性高 ✅
- 数据完整性 ✅
选择题陷阱:数据冗余很高 ❌ 不是数据库特点
1.6 数据不一致的根本原因
数据冗余 — 冗余导致更新异常,产生数据不一致
1.7 数据库 vs DBMS vs DBS
| 概念 | 全称 | 含义 |
|---|---|---|
| DB | Database | 数据库 — 数据的集合 |
| DBMS | DataBase Management System | 数据库管理系统 |
| DBS | Database System | 数据库系统 — 包含DB + DBMS + 应用系统 + DBA + 用户 |
1.8 MySQL简介
- 关系型数据库管理系统(RDBMS)
- 瑞典MySQLAB公司开发,现并入Oracle旗下
- 特点:体积小、速度快、成本低、开放源码
- 广泛用于中小型网站
- 默认端口:3306
- 常用图形管理工具:Navicat for MySQL
1.9 SQL语言
- 全称:Structured Query Language(结构化查询语言)
- 1974年由Boyce和Chambedin提出,原名SEQUEL
- 1976年IBM优化为SEQUEL2,即SQL
- 四大功能:数据查询、数据操纵、数据定义、数据控制
- 主要特点:综合统一、高度非过程化、面向集合、语言简洁
1.10 数据库分类
| 类型 | 说明 | 代表 |
|---|---|---|
| 关系型(SQL/RDBMS) | ACID准则 | Oracle、MySQL、SQL Server |
| 非关系型(NoSQL) | Key-value存储,最终一致性 | MongoDB、Redis、Elasticsearch |
| NewSQL | SQL的ACID + NoSQL的可扩展性 | — |
2. 数据库设计
2.1 E-R图(实体-联系图)
- E-R图用于建立数据库的 概念模型
- E-R图三要素:
| 要素 | 图形 | 说明 |
|---|---|---|
| 实体 | 矩形 | 客观存在的事物 |
| 属性 | 椭圆 | 实体的特征,主键加斜线标记 |
| 联系 | 菱形 | 实体间关联,标注1:1、1:n、m:n |
2.2 E-R图设计步骤
- 收集信息 — 了解业务需求
- 标识对象 — 确定实体集
- 标识每个对象的属性 — 确定属性
- 标识对象之间的关系 — 确定联系类型
- 绘制局部E-R图 — 针对每一用户
- 综合生成总体E-R图 — 去掉冗余,同名实体只出现一次
2.3 三种联系的E-R图表示
1:1 联系(一对一):
- 例:院长与学院、主任与系
1:n 联系(一对多):
- 例:仓库与商品、学院与教师
m:n 联系(多对多):
- 例:教师与课程、读者与图书
2.4 E-R图转关系模型(核心考点)
1:1 联系转换(三种方法)
方案1:把A的主键加入B 方案2:把B的主键加入A 方案3:建立第三个关系(含双方主键+联系属性)
1:n 联系转换
把“一方”的主键纳入“n方”的关系中,同时把联系的属性也一并纳入
m:n 联系转换
必须对“联系”单独建立一个关系 该关系包含双方实体集的主关键字 + 联系属性
试卷设计题示例:仓库(仓库号,地点,面积) — 商品(商品号,商品名,价格) 的1:n转换 方案1(三表拆分): 仓库、商品、存放(仓库号,商品号,数量) 方案2(合并到多方): 仓库、商品(商品号,商品名,价格,数量,仓库号)
2.5 数据库规范化(范式理论)
| 范式 | 要求 | 核心思想 |
|---|---|---|
| 1NF | 每列不可再分(原子性) | 消除复合字段 |
| 2NF | 每列都依赖完整主键 | 消除部分函数依赖,一个表只描述一件事 |
| 3NF | 每列直接依赖主键,不传递依赖 | 消除传递函数依赖 |
规范化实例:建筑公司工资系统 原始单表 → 工程表 + 员工表 + 项目工时表 → 再加职务表(消除传递依赖)
课堂练习:学生成绩系统 A同学设计(单表):学号、姓名、年龄、课程名称、成绩、学分 → 大量冗余 B同学设计(三表):学生表 + 课程表 + 成绩表 → 节省空间
规范化和性能的关系:为商业目标,有时性能比规范化更重要,可适度反规范化
3. 数据定义(DDL)
📌 三剑客:CREATE / ALTER / DROP
3.1 数据库操作
CREATE DATABASE 数据库名; -- 创建数据库
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集; -- 指定字符集
DROP DATABASE [IF EXISTS] 数据库名; -- 删除数据库
SHOW DATABASES; -- 查看所有数据库
USE 数据库名; -- 切换当前数据库
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 新字符集; -- 修改字符集
3.2 表操作(三剑客)
CREATE TABLE 表名 (列定义...); -- 创建表
ALTER TABLE 表名 ...; -- 修改表结构
DROP TABLE [IF EXISTS] 表名; -- 删除表(表+数据+约束+索引全删)
⚠️ 选择题陷阱:
DELETE TABLE❌ 不存在此命令MODIFY TABLE❌ 不存在此命令CHANGE TABLE❌ 不存在此命令- 删除表用 DROP TABLE ✅
- 修改表结构用 ALTER TABLE ✅
3.3 ALTER TABLE 常用操作
-- 添加列
ALTER TABLE 表名 ADD 列名 数据类型 [FIRST | AFTER 列名];
-- 删除列
ALTER TABLE 表名 DROP COLUMN 列名;
-- 修改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型;
-- 修改列类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
-- 添加唯一索引
ALTER TABLE 表名 ADD UNIQUE(列名);
-- 添加普通索引
ALTER TABLE 表名 ADD INDEX 索引名(列名);
-- 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
-- 删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
-- 重命名表
ALTER TABLE 表名 RENAME TO 新表名;
删除属性“年龄”的正确写法:
ALTER TABLE s DROP COLUMN age;
3.4 MySQL数据类型速记
| 类型 | 说明 | 示例 |
|---|---|---|
| char(n) | 定长字符 | char(8) |
| varchar(n) | 变长字符 | varchar(10) |
| text | 文本 | — |
| BLOB | 二进制大对象(存图片/音频) | — |
| int | 整型 | INT(3) |
| float(M,D) | 浮点数 | float(5,2) — M总位数,D小数位 |
| decimal(M,D) | 精确小数 | decimal(8,4) |
| date | 日期 | 1999-06-17 |
| time | 时间 | 12:30:43 |
| datetime | 日期+时间 | 1999-06-17 12:30:43 |
定义字段时,int 4 是错误的写法 ❌
3.5 MySQL字符型数据类型(选择高频)
主要包括:char、varchar、text
⚠️ int是数值型,不是字符型!
3.6 数据完整性(四大类)
| 完整性类型 | 约束方法 | 说明 |
|---|---|---|
| 实体完整性 | PRIMARY KEY、UNIQUE | 每行唯一标识 |
| 域完整性 | 数据类型、CHECK、DEFAULT、NOT NULL | 取值符合范围 |
| 参照完整性 | FOREIGN KEY | 表间引用关系 |
| 用户定义完整性 | 存储过程、触发器 | 特定业务规则 |
3.7 约束类型速记
| 约束 | 关键字 | 说明 |
|---|---|---|
| 主键 | PRIMARY KEY |
唯一且非空,一个表只能有一个 |
| 非空 | NOT NULL |
不允许为空 |
| 唯一 | UNIQUE |
禁止输入重复值 |
| 默认 | DEFAULT |
默认值 |
| 检查 | CHECK(条件) |
限制取值范围 |
| 外键 | FOREIGN KEY |
引用另一表的主键 |
3.8 外键参照动作
| 动作 | 说明 |
|---|---|
| CASCADE | 主表修改/删除,子表同步变更 |
| RESTRICT | 子表有数据时,禁止主表删除/修改 |
| SET NULL | 主表变更后,外键列置空 |
| NO ACTION | 同RESTRICT |
默认动作:RESTRICT
4. 数据操作(DML)
📌 三命令:INSERT / UPDATE / DELETE
4.1 INSERT — 插入数据(三种写法)
-- 写法1:指定列名(推荐)
INSERT INTO 表名(列1,列2,列3) VALUES(值1,值2,值3);
-- 写法2:按顺序写全列
INSERT INTO 表名 VALUES(值1,值2,值3);
-- 写法3:SET语法(MySQL特有)
INSERT INTO 表名 SET 列1=值1, 列2=值2;
-- 多行插入
INSERT INTO 表名 VALUES(值1,值2),(值3,值4),(值5,值6);
4.2 UPDATE — 修改数据
-- 单表更新(必写WHERE,否则全表更新!)
UPDATE 表名 SET 列1=新值1, 列2=新值2 WHERE 条件;
-- 自增更新
UPDATE sell SET 数量=数量*1.1 WHERE 产品编号='103';
-- 多表联合更新
UPDATE 表1, 表2 SET 表1.列=值 WHERE 表1.外键=表2.主键;
⚠️ SET 后面跟的是 列名=新值,不是表名! 错误写法:
UPDATE grade=85 WHERE ...❌
4.3 DELETE — 删除数据
-- 按条件删除
DELETE FROM 表名 WHERE 条件;
-- 删除全部(不用WHERE则删除所有行)
DELETE FROM 表名;
4.4 TRUNCATE TABLE
TRUNCATE TABLE 表名; -- 清空全表,不可回滚,重置自增主键
DELETE vs TRUNCATE对比:
- DELETE:逐行删除,可回滚,保留表结构,自增计数不变
- TRUNCATE:释放数据页,不可回滚,重置自增主键,速度更快
4.5 命令对比速记
| 命令 | 作用对象 | 用途 |
|---|---|---|
| CREATE | 数据库/表/视图 | 创建对象 |
| DROP | 数据库/表/视图 | 删除整个对象 |
| ALTER | 表 | 修改表结构 |
| INSERT | 表 | 插入数据行 |
| UPDATE | 表 | 修改数据行 |
| DELETE | 表 | 删除数据行 |
5. 数据查询(DQL)
📌 SELECT 是SQL中最重要的语句!
5.1 SELECT 完整语法结构(注意顺序!)
SELECT [DISTINCT] 列名 [AS 别名], ...
FROM 表名 [AS 别名]
[WHERE 行过滤条件]
[GROUP BY 分组列]
[HAVING 分组后过滤]
[ORDER BY 排序列 [ASC|DESC]]
[LIMIT 偏移量, 行数];
执行顺序: FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
5.2 列操作
-- 选择指定列
SELECT 姓名, 年龄 FROM student;
-- 选择所有列
SELECT * FROM student;
-- 列别名
SELECT 姓名 AS name, 年龄 AS age FROM student;
SELECT 姓名 AS 'Number of Student' FROM student; -- 含空格需引号
-- 计算列
SELECT 书名, 数量*单价 AS 金额 FROM book;
-- 去重
SELECT DISTINCT 图书类别 FROM book;
5.3 CASE表达式(替换查询结果)
SELECT 图书编号, 书名,
CASE
WHEN 数量 IS NULL THEN '尚未进货'
WHEN 数量 < 5 THEN '需进货'
WHEN 数量 >= 5 AND 数量 <= 50 THEN '库存正常'
ELSE '库存积压'
END AS 库存
FROM book;
5.4 WHERE 条件查询
-- 等值查询
SELECT 姓名, 年龄 FROM student WHERE 性别 = '女';
-- BETWEEN ... AND(闭区间,含边界)
SELECT * FROM SG WHERE Grade BETWEEN 60 AND 80;
-- IN(值是否在集合中)
SELECT * FROM book WHERE 出版社 IN ('高等教育出版社', '北京大学出版社');
-- LIKE 模糊查询(填空高频)
-- % 匹配任意多个字符,_ 匹配单个字符
SELECT * FROM 表名 WHERE 列名 LIKE '李%'; -- 姓李的
SELECT * FROM 表名 WHERE 列名 LIKE '%6_'; -- 倒数第二位为6
SELECT * FROM 表名 WHERE 列名 LIKE '%_%' ESCAPE '#'; -- 含下划线
-- 空值判断(不能用= NULL!)
SELECT * FROM 表名 WHERE 列 IS NULL;
SELECT * FROM 表名 WHERE 列 IS NOT NULL;
SELECT * FROM 表名 WHERE 列 <=> NULL; -- 特殊等于(含NULL)
5.5 逻辑运算符
| 运算符 | 符号 | 说明 |
|---|---|---|
| AND | AND / && | 且 — 都为真才真 |
| OR | OR / || | 或 — 任一为真就真 |
| NOT | NOT / ! | 非 — 取反 |
| XOR | XOR / ^ | 异或 — 不同为真 |
优先级:NOT > AND > OR
5.6 聚合函数(必记5个)
| 函数 | 功能 | 示例 |
|---|---|---|
| COUNT() | 计数 | COUNT(*) 总行数,COUNT(列) 非NULL行数 |
| MAX() | 最大值 | SELECT MAX(grade) FROM SG; |
| MIN() | 最小值 | SELECT MIN(grade) FROM SG; |
| SUM() | 求和 | SELECT SUM(数量) FROM sell; |
| AVG() | 平均值 | SELECT AVG(成绩) FROM SG; |
聚合函数只能用于:SELECT、HAVING、ORDER BY LIMIT不用于分组!(判断题常考)
5.7 GROUP BY 分组
-- 按性别分组,计算平均年龄
SELECT 性别, AVG(年龄) FROM student GROUP BY 性别;
-- 按出版社统计图书平均单价、总金额
SELECT 出版社, AVG(单价), SUM(数量*单价) FROM book GROUP BY 出版社;
-- 带ROLLUP生成小计
SELECT 图书类别, 出版社, SUM(数量) FROM book
GROUP BY 图书类别, 出版社 WITH ROLLUP;
5.8 HAVING 分组过滤
-- HAVING过滤分组后的结果(可用聚合函数)
SELECT 用户号, AVG(订购册数) FROM sell
GROUP BY 用户号 HAVING AVG(订购册数) > 5;
-- WHERE vs HAVING:WHERE过滤原始行,HAVING过滤分组后的聚合结果
SELECT 用户号, AVG(订购册数) FROM sell
WHERE 订购册数 > 5
GROUP BY 用户号 HAVING COUNT(*) > 2;
5.9 ORDER BY 排序
-- 降序
SELECT * FROM student ORDER BY 年龄 DESC;
-- 升序(默认,可省略ASC)
SELECT * FROM student ORDER BY 年龄 ASC;
-- 多字段排序
SELECT * FROM 借阅表 ORDER BY 状态, 借阅日期 DESC;
5.10 LIMIT 限制行数
LIMIT 5; -- 返回前5行
LIMIT 3, 5; -- 从第4行开始返回5行(偏移量从0开始)
LIMIT 5 OFFSET 3; -- 同上(PostgreSQL兼容语法)
5.11 多表连接查询
-- 等值连接(WHERE方式)
SELECT 姓名, 成绩 FROM student, SG
WHERE student.学号 = SG.学号
ORDER BY 成绩 DESC;
-- INNER JOIN(内连接:仅返回匹配记录)
SELECT 姓名, 书名 FROM book
INNER JOIN sell ON book.图书编号 = sell.图书编号;
-- LEFT JOIN(左外连接:左表全部保留,右表无匹配填NULL)
SELECT 条码, 位置, 读者编号 FROM 库存
LEFT JOIN 借阅 ON 库存.条码 = 借阅.条码;
-- RIGHT JOIN(右外连接:右表全部保留,左表无匹配填NULL)
-- 多表连接
SELECT 姓名, 书名, 借阅日期 FROM 读者
JOIN 借阅 ON 读者.编号 = 借阅.读者编号
JOIN 图书 ON 借阅.条码 = 图书.条码;
-- USING子句(列名相同时)
SELECT DISTINCT 姓名 FROM members JOIN sell USING (用户号);
5.12 子查询
-- IN子查询
SELECT * FROM sell WHERE 用户号 IN
(SELECT 用户号 FROM members WHERE 姓名 = '张三');
-- 比较子查询
SELECT * FROM book WHERE 单价 > ALL
(SELECT 单价 FROM book WHERE 图书类别 = '网页设计');
-- EXISTS子查询
SELECT * FROM members WHERE EXISTS
(SELECT * FROM sell WHERE sell.用户号 = members.用户号);
5.13 UNION 联合查询
-- 自动去重
SELECT 图书编号, 订购册数 FROM sell WHERE 用户号 = 'C0138'
UNION
SELECT 图书编号, 数量 FROM book WHERE 图书编号 = 'TP.2525';
-- 保留重复
SELECT ... UNION ALL SELECT ...;
6. 数据视图
6.1 视图概念
- 视图是一个虚表 — 只存定义,不存数据
- 从基本表或者视图中导出
- 可以像表一样被查询、修改、删除
- 优点:简化查询、屏蔽复杂性、简化权限管理、便于数据共享
6.2 视图相关命令(必记)
-- 创建视图
CREATE VIEW 视图名 [(列别名)] AS SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
-- 修改视图
ALTER VIEW 视图名 [(列别名)] AS SELECT 语句;
-- 删除视图
DROP VIEW [IF EXISTS] 视图名1, 视图名2;
6.3 WITH CHECK OPTION
-- 通过视图插入/修改数据必须满足视图WHERE条件
CREATE VIEW jsj_book AS
SELECT * FROM book WHERE 图书类别 = '计算机'
WITH CHECK OPTION;
-- 尝试插入非计算机类图书会报错
INSERT INTO jsj_book VALUES('TP.0837','文学','Office应用实例',...);
-- ❌ 报错:违反CHECK OPTION
6.4 不可更新视图(包含以下任一结构)
聚合函数、DISTINCT、GROUP BY、ORDER BY、HAVING、UNION、多表JOIN、子查询等
6.5 通过视图操作数据
-- 通过视图插入(视图依赖多个表时不可插入)
INSERT INTO jsj_book VALUES(...);
-- 通过视图修改
UPDATE jsj_book SET 单价 = 单价 * 0.95;
-- 通过视图删除
DELETE FROM jsj_book WHERE 出版社 = '人民邮电出版社';
6.6 视图相关选择题要点
- 视图是从 基本表或者视图 中导出的 ✅
- 视图名称 不得 与该用户拥有的任何表的名称相同 ✅
- 可以 像查询表一样查询视图(判断题:说法“不可以”是错误的) ✅
7. 索引和分区
7.1 索引的作用
- 提高查询的检索性能(核心目的)
- 可以加快表之间连接的速度
- 类似书的目录,通过索引找到特定值,然后跟随指针到目标行
- MySQL自动为主键创建索引
7.2 索引的分类
| 类型 | 说明 | 创建方式 |
|---|---|---|
| 主键索引 | 唯一+非空,一个表只能有一个 | PRIMARY KEY |
| 普通索引 | 无唯一性限制 | INDEX |
| 唯一索引 | 不允许重复值 | UNIQUE |
| 全文索引 | TEXT/VARCHAR文本检索 | FULLTEXT(仅MyISAM) |
7.3 创建索引(三种方式)
-- 方式1:CREATE INDEX(已有表)
CREATE INDEX 索引名 ON 表名(列名[(长度)] [ASC|DESC]);
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
-- 方式2:ALTER TABLE(已有表)
ALTER TABLE 表名 ADD INDEX 索引名(列名);
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
ALTER TABLE 表名 ADD UNIQUE(列名);
-- 方式3:建表时直接定义
CREATE TABLE 表名(
列1 类型 PRIMARY KEY,
列2 类型,
INDEX 索引名(列2),
UNIQUE(列3)
);
7.4 删除索引
DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;
ALTER TABLE 表名 DROP PRIMARY KEY;
7.5 索引设计原则
| 应该创建 ✅ | 不应该创建 ❌ |
|---|---|
| WHERE子句中出现频率较高的列 | 具有很多NULL值的列 |
| 用于连接的外键列 | 记录较少的基本表 |
| 经常排序/分组的列 | 需要更新频繁的表 |
7.6 索引相关选择题要点
- 一个表 只能 建立 一个 主键索引(多选1个)✅
- 索引可以建立在 一个或多个 字段上 ✅
- 不能 使用
ADD INDEX语句创建索引(错误说法)✅ - 快速查出某教师所讲授的课程 → 在 课程表 上按 教师编号 建索引 ✅
7.7 数据库分区(四种类型)
| 类型 | 说明 | 语法 |
|---|---|---|
| RANGE | 按连续数值区间分区 | PARTITION BY RANGE(表达式) |
| LIST | 按离散枚举值分区 | PARTITION BY LIST(表达式) |
| HASH | 按表达式哈希均匀分配 | PARTITION BY HASH(表达式) PARTITIONS n |
| KEY | 基于主键哈希 | PARTITION BY KEY() PARTITIONS n |
7.8 分区管理
-- 增加分区
ALTER TABLE 表名 ADD PARTITION (PARTITION p3 VALUES IN (2));
-- 重新分区
ALTER TABLE 表名 REORGANIZE PARTITION p2,p3 INTO (PARTITION m VALUES IN (0,2));
-- 删除分区
ALTER TABLE 表名 DROP PARTITION p1;
-- 移除分区(保留表结构)
ALTER TABLE 表名 REMOVE PARTITIONING;
8. 数据库编程
8.1 常量与变量
| 类型 | 说明 | 示例 |
|---|---|---|
| 字符串常量 | 单引号或双引号 | 'hello' |
| 数值常量 | 整数/浮点数 | 100, 3.14 |
| 日期时间常量 | 单引号括起 | '1999-06-17', '12:30:43' |
| NULL值 | 无数据,≠ 0 或空字符串 | NULL |
| 用户变量 | @开头 | @name='王林' |
| 系统变量 | @@开头 | @@VERSION, CURRENT_DATE |
8.2 流程控制语句
IF语句
IF 条件1 THEN
语句序列1;
[ELSEIF 条件2 THEN 语句序列2;]
[ELSE 语句序列e;]
END IF;
CASE语句
-- 格式1:表达式匹配
CASE 表达式
WHEN 值1 THEN 语句1;
WHEN 值2 THEN 语句2;
ELSE 语句e;
END CASE;
-- 格式2:条件判断
CASE
WHEN 条件1 THEN 语句1;
WHEN 条件2 THEN 语句2;
ELSE 语句e;
END CASE;
循环语句
| 类型 | 语法 | 说明 |
|---|---|---|
| WHILE | WHILE 条件 DO ... END WHILE |
先判断后执行 |
| REPEAT | REPEAT ... UNTIL 条件 END REPEAT |
先执行后判断 |
| LOOP | [标号:] LOOP ... END LOOP [标号] |
需LEAVE退出 |
8.3 存储过程(必记)
-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE 过程名 ([IN/OUT/INOUT 参数 类型])
BEGIN
-- 局部变量声明(必须在开头)
DECLARE 变量名 类型 [DEFAULT 值];
-- SQL语句
...
END$$
DELIMITER ;
-- 调用存储过程(必记命令:CALL)
CALL 过程名(参数);
-- 删除存储过程
DROP PROCEDURE [IF EXISTS] 过程名;
📌 DELIMITER命令:存储过程体有多条SQL语句,需临时改结束符为
$$
8.4 存储函数(必记)
-- 创建存储函数
DELIMITER $$
CREATE FUNCTION 函数名([参数 类型])
RETURNS 类型
BEGIN
RETURN 表达式; -- 必须包含RETURN
END$$
DELIMITER ;
-- 调用存储函数(SELECT调用)
SELECT 函数名(参数);
-- 删除存储函数
DROP FUNCTION 函数名;
存储过程 vs 存储函数:
- 存储函数 必须 有RETURN语句
- 存储函数 不能 用CALL调用
- 存储函数 没有 OUT参数
8.5 触发器(必记)
-- 创建触发器
DELIMITER $$
CREATE TRIGGER 触发器名 BEFORE/AFTER INSERT/UPDATE/DELETE
ON 表名 FOR EACH ROW
BEGIN
-- 使用NEW.列名(新行)或OLD.列名(旧行)
...
END$$
DELIMITER ;
-- 删除触发器(必记命令:DROP TRIGGER)
DROP TRIGGER 触发器名;
⚠️ 删除触发器用 DROP TRIGGER(不是 DELETE / REMOVE / DISABLE)
8.6 事件(必记)
-- 创建事件
CREATE EVENT 事件名
ON SCHEDULE EVERY 1 MINUTE
STARTS 时间点 [ENDS 时间点]
DO
BEGIN
SQL语句;
END;
-- 管理事件
SET GLOBAL EVENT_SCHEDULER = 1; -- 开启调度器
ALTER EVENT 事件名 ENABLE/DISABLE; -- 启用/禁用
DROP EVENT 事件名; -- 删除
SHOW EVENTS; -- 查看事件
8.7 控制结构速查
| 结构 | 关键字 | 说明 |
|---|---|---|
| 分支 | CASE ... END CASE / IF ... END IF |
多分支选择 |
| 循环 | WHILE ... END WHILE / REPEAT ... END REPEAT / LOOP ... END LOOP |
循环执行 |
| 变量定义 | DECLARE |
声明局部变量 |
| 变量赋值 | SET |
给变量赋值 |
| 函数返回值 | RETURN |
存储函数返回 |
9. 数据安全
9.1 用户管理(必记命令)
-- 创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
-- 示例:CREATE USER 'Wang'@'localhost' IDENTIFIED BY '123456';
-- 修改密码
SET PASSWORD FOR '用户名'@'主机' = '新密码';
-- 改名
RENAME USER 旧用户名 TO 新用户名;
-- 删除用户
DROP USER '用户名'@'主机';
9.2 权限管理(必记命令)
-- 授权
GRANT 权限1, 权限2 ON 数据库.表 TO '用户名'@'主机';
-- 示例:GRANT SELECT,INSERT ON LibraryDB.* TO 'user1'@'localhost';
-- 授权并允许传递
GRANT SELECT ON LibraryDB.读者表 TO 'user3'@'localhost' WITH GRANT OPTION;
-- 回收权限
REVOKE SELECT ON LibraryDB.读者表 FROM 'user1'@'localhost';
-- 回收全部权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM '用户名'@'主机';
9.3 权限层级
| 层级 | 说明 | 语法 |
|---|---|---|
| 列权限 | 单字段 | GRANT UPDATE(列名) ON 表 TO ... |
| 表权限 | 整张表 | GRANT SELECT ON 表 TO ... |
| 库权限 | 库内所有表 | GRANT SELECT ON 库名.* TO ... |
| 全局权限 | 全部数据库 | GRANT CREATE ON *.* TO ... |
9.4 GRANT和REVOKE的作用
维护数据库的 安全性(不是完整性!)
9.5 DELETE权限 vs DROP权限
| 权限 | 作用 |
|---|---|
| DELETE | 允许删除表中的数据行 |
| DROP | 允许删除数据库对象(表、库等) |
| 两者 不等价 | — |
10. 名词解释速记
| 英文 | 中文含义 |
|---|---|
| DBMS | 数据库管理系统 |
| SQL | 结构化查询语言 |
| E-R图 | 实体-联系图 |
| DBS | 数据库系统 |
| Primary Key | 主键 |
| Foreign Key | 外键 |
| Character Set | 字符集 |
| DEFAULT | 默认值 |
| 1NF | 第一范式 |
| UNIQUE INDEX | 唯一性索引 |
11. 备份与恢复
11.1 三种数据安全方案
- 数据库备份 — 导出数据或表文件拷贝
- 二进制日志 — 记录所有更改数据的语句
- 数据库复制 — 主从复制
11.2 文本导出导入
-- 导出数据
SELECT * FROM 表名
INTO OUTFILE 'D:/data.txt'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '?';
-- 导入数据
LOAD DATA INFILE 'D:/data.txt'
INTO TABLE 表名
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '?';
11.3 mysqldump备份
mysqldump -u root -p 数据库名 > file.sql # 备份
mysql -u root -p 数据库名 < file.sql # 恢复
11.4 二进制日志管理
-- 清理日志
RESET MASTER; -- 清除所有日志
PURGE BINARY LOGS BEFORE '2026-01-01'; -- 删除指定时间前的日志
11.5 事务(ACID)
| 特性 | 说明 |
|---|---|
| 原子性(A) | 事务是不可分割的最小单元 |
| 一致性(C) | 事务前后数据保持一致 |
| 隔离性(I) | 事务间互不干扰 |
| 持久性(D) | 提交后永久保存 |
SET @@AUTOCOMMIT = 0; -- 关闭自动提交
START TRANSACTION; -- 开始事务
-- SQL操作...
COMMIT; -- 提交
ROLLBACK; -- 回滚
附录A:判断题高频考点速记
| 说法 | 正误 | 说明 |
|---|---|---|
| 数据库系统减少了数据冗余 | ✅ | |
| 关系数据库中的关键字是很关键的字段 | ❌ | 关键字是能唯一标识元组的属性 |
| 规范化的关系至少满足四范式 | ❌ | 不需要,三范式即可 |
| MySQL是关系数据库系统 | ✅ | |
| 不可以像查询表一样查询视图 | ❌ | 可以! |
| 可以用CREATE USER添加用户并设密码 | ✅ | |
| LIMIT子句用于分组输出 | ❌ | LIMIT用于限制行数 |
| 一个表的主键只能是一个字段 | ❌ | 可以是复合主键 |
| 存储图形图像用BLOB | ✅ | |
| 事务日志可恢复数据库 | ✅ |
附录B:考试题型及分值分布
| 题型 | 分值 | 重点 |
|---|---|---|
| 填空题 | ~20分 | 数据管理三阶段、数据模型、联系类型、SQL命令 |
| 选择题 | ~60分 | 概念理解、命令辨析、数据类型、约束 |
| 判断题 | ~10分 | 易混淆概念 |
| 名词解释 | ~20分 | 10个英文术语 |
| 简答题/写SQL | ~30分 | 创建表、增删改查、授权 |
| 设计题 | ~40分 | E-R图转关系模型、综合SQL |
| 机试操作 | ~100分 | 建库建表、索引、SQL编写、用户授权 |
考前最后提醒
- 填空题:注意区分 CREATE/DROP/ALTER、INSERT/UPDATE/DELETE
- 选择题:注意陷阱 — DELETE TABLE ❌、DROP TABLE ✅;LIMIT不分组 ✅;int 4 ❌
- 写SQL题:命令拼写、WHERE不能漏、FROM不能漏、引号要用对
- 授权题:注意
'用户名'@'localhost'的格式 - 设计题:1:n 联系可以三表拆分,也可以合并到多方
- 名词解释:10个名词全部要背
- E-R图转关系模型:1:1三种方法、1:n合并到多方、m:n必须新建中间表
祝考试顺利! 🎯