前言
经过一个学期的 MySQL 数据库课程学习,我系统地掌握了从数据库基础概念到高级应用的完整知识体系。从最开始的 SQL 基础语法,到后来的索引优化、事务管理、存储过程,每一个知识点都让我对数据库有了更深的理解。
这篇文章是我对本学期所学内容的全面梳理和总结,既是对知识的复习巩固,也是对学习过程的反思和沉淀。希望通过这篇文章,能够帮助自己建立完整的知识体系,同时也能给正在学习 MySQL 的同学一些参考。
一、数据库基础与环境搭建
1.1 数据库的基本概念
在正式学习 SQL 之前,首先要理解数据库是什么。简单来说,数据库就是一个存储数据的仓库,它能够高效地存储、管理和检索数据。
为什么要用数据库而不是 Excel?
- 数据量大:数据库能存储千万级甚至亿级数据,Excel 最多几百万行
- 并发访问:数据库支持多人同时操作,Excel 做不到
- 数据安全:数据库有权限控制、备份恢复等机制
- 查询速度快:通过索引等技术,数据库查询速度比 Excel 快得多
常见的数据库类型:
- 关系型数据库:MySQL、Oracle、SQL Server(用表存数据,表与表之间有关系)
- 非关系型数据库:Redis、MongoDB(存储格式灵活,适合特定场景)
1.2 MySQL 的安装与配置
MySQL 是最流行的开源关系型数据库,学习数据库一般从 MySQL 入门。
安装注意事项:
- 端口号默认是 3306,没有特殊需求不要改
- 字符集一定要选 utf8mb4,支持完整的 Unicode 包括 emoji
- root 密码一定要记住,忘记了会很麻烦
配置文件 my.ini/my.cnf 的几个重要参数:
- port:端口号,默认 3306
- character-set-server:服务器字符集,建议设为 utf8mb4
- default-storage-engine:默认存储引擎,一般是 InnoDB
- max_connections:最大连接数,根据服务器配置调整
1.3 存储引擎的选择
MySQL 有多种存储引擎,最常用的是 InnoDB 和 MyISAM。
学习心得: 现在基本都用 InnoDB,它是 MySQL 的默认存储引擎,支持事务和行级锁,适合绝大多数业务场景。MyISAM 已经逐渐被淘汰,了解一下就行。
二、SQL 基础语法
2.1 SQL 语言分类
SQL(结构化查询语言)是操作数据库的标准语言,按功能可以分为四大类:
- DDL(数据定义语言):定义数据库结构,如 CREATE、ALTER、DROP
- DML(数据操作语言):操作数据,如 INSERT、UPDATE、DELETE
- DQL(数据查询语言):查询数据,如 SELECT
- DCL(数据控制语言):权限控制,如 GRANT、REVOKE
2.2 DDL 数据定义语言
创建数据库:
创建表:
建表规范总结:
- 表名、字段名用小写,多个单词用下划线分隔
- 每个字段都要有 COMMENT 注释
- 主键一般用自增 ID
- 字符串类型区分定长(CHAR)和变长(VARCHAR)
- 日期时间用 DATE、DATETIME 类型,不要用字符串
修改表结构:
删除表:
⚠️ 易错点:
- DROP 操作要慎重,删除后数据就没了
- 生产环境修改表结构要小心,大表 ALTER 会锁表
- 字段类型修改可能导致数据截断或丢失
2.3 DML 数据操作语言
插入数据:
更新数据:
删除数据:
⚠️ 最容易犯的错误:
UPDATE 和 DELETE 一定要加 WHERE 条件!
刚学 SQL 的时候,很多人会忘记加 WHERE,导致全表数据被修改或删除。这是非常严重的事故。
安全建议:
- 执行 UPDATE/DELETE 前,先用 SELECT 查询确认条件
- 重要数据操作前先备份
- 生产环境开启事务,确认无误后再提交
2.4 DQL 数据查询语言
查询是 SQL 中最常用也是最重要的部分。
基础查询:
条件查询:
排序查询:
分页查询:
分页公式: 第 n 页,每页 m 条 → LIMIT (n-1)*m, m
聚合函数:
分组查询:
WHERE 和 HAVING 的区别:
- WHERE:分组前筛选,不能用聚合函数
- HAVING:分组后筛选,可以用聚合函数
三、高级查询
3.1 多表连接查询
实际开发中,数据往往分散在多个表中,需要关联查询。
内连接(INNER JOIN): 只返回两个表中匹配的数据
左连接(LEFT JOIN): 返回左表全部数据,右表匹配不到的显示 NULL
右连接(RIGHT JOIN): 与左连接相反,用得较少
连接查询注意事项:
- 一定要写连接条件,否则会产生笛卡尔积(数据量爆炸)
- 多表查询时给表起别名,SQL 更简洁
- 连接的表越多,性能越差,一般不超过 3-5 个表
3.2 子查询
子查询就是嵌套在另一个查询中的查询。
子查询分类:
- 标量子查询:返回单个值
- 列子查询:返回一列
- 行子查询:返回一行
- 表子查询:返回多行多列
⚠️ 注意: 子查询虽然方便,但性能往往不如连接查询,特别是子查询在 WHERE 条件中且数据量大的时候。实际开发中要谨慎使用。
四、数据类型与运算符
4.1 常用数据类型
数值类型:
- TINYINT:1 字节,范围 - 128~127(存年龄、状态等小数字)
- INT:4 字节,范围约 - 21 亿~21 亿(最常用)
- BIGINT:8 字节,范围很大(存主键、订单号等)
- DECIMAL(M,D):精确小数,存金额必须用这个
字符串类型:
- CHAR(n):定长字符串,最多 255 字符(存性别、手机号等固定长度)
- VARCHAR(n):变长字符串,最多 65535 字节(存姓名、地址等)
- TEXT:长文本,最多 65535 字符(存文章内容等)
日期时间类型:
- DATE:日期,格式 YYYY-MM-DD
- TIME:时间,格式 HH:MM:SS
- DATETIME:日期时间,格式 YYYY-MM-DD HH:MM:SS
- TIMESTAMP:时间戳,范围小但有时区特性
类型选择原则:
- 在满足需求的前提下,尽量选小的类型
- 整数优先于字符串(存手机号用 BIGINT 比 VARCHAR 快)
- 金额用 DECIMAL,绝对不能用 FLOAT/DOUBLE
- 日期时间用专门的类型,不要用字符串
4.2 常用运算符
算术运算符: +、-、*、/、%(取模)
比较运算符: =、!=、>、<、>=、<=
逻辑运算符: AND、OR、NOT
特殊运算符:
- BETWEEN...AND...:在范围内
- IN:在指定值列表中
- LIKE:模糊匹配
- IS NULL:判断是否为空
五、常用函数
MySQL 提供了很多内置函数,方便我们处理数据。
5.1 字符串函数
5.2 日期函数
5.3 数值函数
学习心得: 函数不用死记硬背,常用的自然就记住了,不常用的用到了再查文档。关键是要知道有哪些功能,遇到需求时知道可以用函数解决。
六、索引
索引是数据库优化最重要的手段之一,也是这学期的重点和难点。
6.1 什么是索引?
索引就像书的目录。没有索引,查数据要一页一页翻(全表扫描);有了索引,直接通过目录定位到位置(索引查找)。
索引的优点:
- 大大提高查询速度
- 加速表与表的连接
- 提高分组和排序的效率
索引的缺点:
- 占用额外的存储空间
- 插入、更新、删除数据时要维护索引,变慢
- 不是索引越多越好
6.2 索引的类型
- 普通索引(INDEX):最基本的索引
- 唯一索引(UNIQUE):索引列的值必须唯一
- 主键索引(PRIMARY KEY):特殊的唯一索引,一个表只能有一个
- 联合索引:多个字段组成的索引
- 全文索引(FULLTEXT):用于全文搜索
6.3 索引的使用
6.4 最左前缀原则
联合索引遵循最左前缀原则,这是索引优化的核心。
比如有联合索引 idx(a, b, c):
- ✅ WHERE a = 1 走索引
- ✅ WHERE a = 1 AND b = 2 走索引
- ✅ WHERE a = 1 AND b = 2 AND c = 3 走索引
- ❌ WHERE b = 2 不走索引
- ❌ WHERE c = 3 不走索引
- ❌ WHERE b = 2 AND c = 3 不走索引
简单说:必须从最左边的列开始,不能跳过中间的列。
6.5 索引失效的常见情况
- 联合索引不满足最左前缀原则
- 在索引列上使用函数、运算
- 隐式类型转换(比如字符串和数字比较)
- LIKE 以 % 开头
- 使用 OR 连接的条件中有非索引列
- 数据量太小,MySQL 觉得全表扫描更快
6.6 EXPLAIN 分析执行计划
判断 SQL 有没有走索引,用 EXPLAIN:
七、事务
7.1 什么是事务?
事务是一组 SQL 操作,要么全部成功,要么全部失败。最经典的例子就是银行转账:A 扣钱和 B 加钱必须同时成功或同时失败。
7.2 事务的四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小单位,要么全成功要么全失败
- 一致性(Consistency):事务执行前后,数据保持一致
- 隔离性(Isolation):多个事务之间互不干扰
- 持久性(Durability):事务提交后,数据就永久保存了
7.3 事务的使用
7.4 事务的隔离级别
MySQL 默认隔离级别是可重复读(REPEATABLE READ)。
几个概念解释:
- 脏读:一个事务读到了另一个事务未提交的数据
- 不可重复读:同一个事务内,两次读取同一条数据结果不一样(被别的事务修改了)
- 幻读:同一个事务内,两次查询的行数不一样(别的事务插入 / 删除了数据)
学习心得: 事务是数据库的核心概念,也是面试常考题。ACID 四大特性要背熟,隔离级别要理解清楚。实际开发中,涉及多个写操作的业务一定要用事务,保证数据一致性。
八、视图、存储过程与触发器
8.1 视图
视图就是一张虚拟的表,它的数据来自于查询结果。
视图的作用:
- 简化复杂的查询
- 保护数据,只暴露部分字段给用户
- 数据独立性,表结构变了不影响视图
8.2 存储过程
存储过程是一组预编译的 SQL 语句,存在数据库中,可以重复调用。
存储过程的优缺点:
- 优点:执行速度快(预编译)、减少网络传输、代码复用
- 缺点:调试困难、可移植性差、维护成本高
学习心得: 存储过程在传统企业系统中用得比较多,但现在互联网公司用得越来越少,因为不好维护和扩展。了解基本用法就行,实际开发中一般把业务逻辑放在应用层。
8.3 触发器
触发器是在表发生增删改操作时,自动触发执行的一段 SQL。
触发器的注意事项:
- 触发器会增加数据库的复杂度
- 出了问题不好排查
- 可能导致意外的连锁反应
学习心得: 触发器功能强大但要慎用,特别是在高并发场景下,容易引起性能问题和死锁。能用应用代码实现的,尽量不要用触发器。
九、用户与权限管理
9.1 创建用户
9.2 授权
9.3 撤销权限
9.4 权限管理原则
- 最小权限原则:只给用户需要的权限,不给多余的
- 禁止 root 直连:root 账号只用于管理,业务不用
- 限制登录 IP:生产环境不要用 %,限制内网 IP
- 定期清理:不用的账号及时删除
十、学习总结与反思
10.1 学习收获
经过一个学期的学习,我收获了很多:
知识层面:
- 建立了完整的 MySQL 知识体系,从基础到进阶都有了系统的了解
- 掌握了 SQL 的基本语法,能够独立完成常见的增删改查
- 理解了索引、事务等核心概念,知道了怎么优化数据库
- 学会了视图、存储过程、触发器等高级特性
能力层面:
- 能够根据业务需求设计合理的表结构
- 能够写出规范、高效的 SQL 语句
- 能够用 EXPLAIN 分析 SQL 性能,进行简单的优化
- 有了基本的数据库安全意识
10.2 学习中的困难
学习过程中也遇到了不少困难:
- 索引优化比较抽象:最左前缀原则、索引失效场景,一开始不太好理解,需要多做练习
- 事务隔离级别容易混淆:四个隔离级别、三种读问题,概念多,容易记混
- 多表查询容易写错:表多了之后,连接条件、别名容易搞混
- 高级特性用得少:存储过程、触发器这些,课堂上学了但实际用得不多,掌握不牢
10.3 需要加强的部分
通过这次总结,我发现自己还有很多需要加强的地方:
- SQL 优化能力:只会基础的索引优化,复杂 SQL 的优化能力还不够
- 实战经验不足:都是课堂练习,没有在真实项目中应用过
- 数据库运维知识欠缺:备份恢复、主从复制、性能监控这些还没接触
- 高级特性不熟练:存储过程、触发器、事件这些用得太少
10.4 后续学习计划
针对以上不足,我制定了后续的学习计划:
- 多做实战项目:找一些练手项目,把学到的知识用起来
- 深入学习优化:多看 SQL 优化的文章和案例,提升优化能力
- 学习运维知识:了解备份、主从、监控等 DBA 基础知识
- 了解 NoSQL:学习 Redis、MongoDB 等非关系型数据库,拓宽视野
结语
一个学期的 MySQL 课程结束了,但数据库的学习才刚刚开始。数据库是后端开发的基本功,需要不断地学习和实践才能真正掌握。
回顾这学期的学习,从最开始连 SELECT 都写不对,到现在能够独立设计表、写复杂查询、做基本优化,进步还是很明显的。但我也清楚地知道,自己掌握的还只是皮毛,还有很多东西需要学习。
最后,感谢老师的悉心教导。在今后的学习中,我会继续努力,把数据库这门基本功练扎实,为以后的开发工作打下坚实的基础。
全文完,感谢阅读!