MySQL学习笔记:从零开始的数据库之旅

张开发
2026/4/19 22:12:40 15 分钟阅读

分享文章

MySQL学习笔记:从零开始的数据库之旅
第一部分先搞懂几个核心概念在动手之前我觉得最重要的是先理解数据库到底是什么以及它为什么存在。数据库Database就像是一个结构化的电子文件柜。它不是单个文件而是一堆按照特定规则组织起来的文件集合用来高效地存储、管理和检索数据。想象一下如果没有数据库我们要存储学生信息可能需要在Excel里手动维护数据重复、难以查询、容易出错。而数据库解决了这些问题降低数据冗余、实现数据共享、保证数据完整性、提供数据安全性。数据库管理系统DBMS是数据库的管家。它专门用来管理数据库中的数据提供增删改查的能力。常见的有MySQL、Oracle、SQL Server、PostgreSQL等。我们可以把DBMS理解为操作系统数据库是硬盘上的文件而DBMS就是管理这些文件的程序。SQL结构化查询语言是与数据库对话的通用语言。无论你用的是MySQL还是OracleSQL的基本语法都是相通的。它就像英语一样是数据库世界的通用语。SQL包括创建数据库、删除数据库、查询记录、修改记录、添加字段等各种操作。关系模型是现代数据库最核心的数据组织思想。这里有几个关键概念需要理解实体就是现实世界中可以区分的对象比如学生、课程就是一个实体。在数据库中实体通常对应表中的行。属性是实体的特征比如学生的姓名、学号、年龄都是属性。在数据库中属性对应表中的列。联系描述了不同实体之间的关系。比如学生和课程之间存在选修的关系。这三种联系类型特别重要理解它们对设计数据库结构至关重要一对一1:1比如一个人只有一个身份证号一个身份证号只属于一个人。一对多1:N比如一个部门有多个员工但一个员工只能属于一个部门。这是最常见的一种关系。多对多M:N比如一个学生可以选修多门课程一门课程也可以被多个学生选修。在关系型数据库中多对多关系需要通过一个中间表关联表来实现。第二部分安装与连接——迈出第一步理解了概念后我们开始动手。MySQL默认监听3306端口这是它的门牌号。在CentOS或RHEL系统上安装MySQL非常简单首先安装服务端和客户端程序然后启动服务并设置开机自启。安装完成后我们可以直接输入mysql命令进行本地连接因为默认的root用户是没有密码的。但要注意这个root用户与操作系统的root没有任何关系它是MySQL自己的管理用户。连接数据库时我们可以使用mysql命令的各种选项-u指定用户名-p指定密码-h指定主机地址-P指定端口号。比如mysql -uroot -p123.com -hlocalhost -P3306就是完整的连接命令。安装完成后MySQL会自带四个特殊的系统数据库它们存储着MySQL自身的元数据和配置信息。其中最重要的是information_schema它是一个虚拟库存储了所有数据库、表、列、权限等的元数据你可以把它看作是数据库的地图。mysql库存储了用户账户、权限等关键信息。performance_schema用于监控MySQL服务器的性能指标。sys库是对performance_schema的封装提供了更易读的视图。第三部分SQL语言分类——掌握数据库的语法SQL语言分为四大类理解这个分类对后续学习非常重要DDL数据定义语言用于定义和修改数据库结构包括CREATE创建、ALTER改变、DROP删除。这些命令操作的是数据库的骨架比如创建数据库、创建表、修改表结构等。DML数据操作语言用于操作表中的数据包括INSERT插入、UPDATE更新、DELETE删除。这些命令操作的是数据库的血肉即具体的数据内容。DQL数据查询语言用于查询表中的数据核心命令是SELECT。这是最常用也最复杂的部分包括各种条件查询、聚合查询、连接查询等。DCL数据控制语言用于控制用户权限包括GRANT授权、REVOKE撤销权限。这些命令关系到数据库的安全性。第四部分数据类型详解——选择合适的容器数据类型的选择是数据库设计中的重难点选对了事半功倍选错了后患无穷。我来详细解读几种常用的数据类型。整型数据类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT它们分别占用1到8个字节。关键是要理解UNSIGNED无符号的概念。比如INT的有符号范围是-2147483648到2147483647而INT UNSIGNED的范围是0到4294967295。当我们存储年龄、数量等非负数时一定要加上UNSIGNED这样可以将正数范围扩大一倍。AUTO_INCREMENT通常与主键结合使用自动为新记录生成唯一的递增ID。浮点型与定点型的区别非常重要。FLOAT和DOUBLE存储的是近似值存在精度损失不适合存储金额等需要精确计算的场景。而DECIMAL存储的是精确值比如DECIMAL(10,2)可以精确存储到小数点后两位强烈推荐用于金额字段。日期时间类型中DATETIME和TIMESTAMP的区别经常让人困惑。DATETIME范围大1000-9999年与时区无关存储的就是你插入的字面值。TIMESTAMP范围小1970-2038年与时区有关存储的是UTC时间戳在不同会话时区下显示的值会自动转换。通常记录创建时间、最后修改时间等用TIMESTAMP更合适。字符串类型的选择也很关键。CHAR是定长字符串无论存多少字符都占用指定的字节数适合存储长度固定的字符串如国家代码。VARCHAR是变长字符串只占用实际字符数加1或2字节用于记录长度绝大多数场景应优先选择VARCHAR。TEXT类型用于存储超长文本如文章内容但不能有默认值且索引有特殊限制。ENUM和SET是两种特殊的字符串类型。ENUM是枚举类型列的值只能是预定义列表中的一个内部用数字存储非常节省空间。比如性别字段可以定义为ENUM(男, 女, 未知)。SET是集合类型列的值可以是预定义列表中的多个比如爱好字段可以定义为SET(读书, 音乐, 电影, 旅行)。第五部分数据库与表的操作——搭建数据的房子创建数据库时指定字符集很重要。比如CREATE DATABASE mydb CHARACTER SET utf8mb4utf8mb4支持完整的Unicode字符包括emoji表情。切换到某个数据库用USE命令查看所有数据库用SHOW DATABASES。创建表是数据库设计的核心环节。一个典型的建表语句包含表名、列名、数据类型、约束等信息。比如创建学生表CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age TINYINT UNSIGNED,email VARCHAR(100) UNIQUE);这里每个约束都有其意义。PRIMARY KEY主键保证了每一行数据的唯一性是后续做关联查询的桥梁。NOT NULL非空强制该列必须有值防止脏数据入库。UNIQUE唯一保证该列的值在整个表中是唯一的比如邮箱地址。修改表结构用ALTER TABLE命令它可以添加列、修改列类型、删除列、重命名表等。比如ALTER TABLE students ADD COLUMN phone VARCHAR(20)添加电话列ALTER TABLE students MODIFY COLUMN name VARCHAR(100)修改名字长度。第六部分数据操作——填充数据的内容INSERT用于插入数据可以单行插入也可以批量插入。UPDATE用于更新数据一定要带WHERE条件否则会更新整张表。DELETE用于删除数据同样一定要带WHERE条件否则会删除整张表。这两个命令如果不加WHERE条件后果可能是灾难性的。SELECT是查询数据的核心命令也是最复杂的部分。基础查询包括条件查询WHERE、模糊查询LIKE、范围查询BETWEEN、空值判断IS NULL等。聚合函数包括COUNT计数、SUM求和、AVG平均值、MAX最大值、MIN最小值。GROUP BY用于将数据按某一列或多列进行分组然后对每个组应用聚合函数。HAVING用于过滤分组后的结果而WHERE是过滤分组前的行。比如SELECT age, COUNT() FROM students GROUP BY age HAVING COUNT() 1查询每个年龄段的学生人数只显示人数大于1的年龄段。ORDER BY用于排序ASC升序DESC降序。LIMIT用于分页查询比如LIMIT 10, 10表示从第11条开始取10条记录这是实现分页的关键。多表查询是SQL中的难点。内连接INNER JOIN只返回两张表中都存在匹配的记录。左外连接LEFT JOIN返回左表的所有记录以及右表中匹配的记录如果右表没有匹配则为NULL。右外连接RIGHT JOIN与左外连接相反。理解这些连接的区别对处理复杂查询至关重要。第七部分用户权限管理——守护数据的安全在生产环境中安全是第一要务。MySQL的权限控制通过GRANT和REVOKE命令来管理。创建用户用CREATE USER命令比如CREATE USER webuser192.168.1.% IDENTIFIED BY StrongPass!。这里192.168.1.%表示该用户只能从192.168.1网段的主机连接。授予权限时要遵循最小权限原则只授予必要的权限。比如GRANT SELECT, INSERT, UPDATE ON mydb.* TO webuser192.168.1.%只授予查询、插入、更新的权限不授予删除权限。授予权限后要执行FLUSH PRIVILEGES刷新权限。查看用户权限用SHOW GRANTS命令撤销权限用REVOKE命令。删除用户用DROP USER命令。第八部分数据备份与恢复——数据的保险数据备份的重要性怎么强调都不为过。任何数据的丢失都可能产生严重后果备份的主要目的就是灾难恢复。根据是否需要数据库离线备份分为冷备需要关服务、温备只读、热备业务不受影响。MyISAM不支持热备InnoDB支持热备但需要专门的工具。根据备份数据的范围分为完全备份备份全部数据、差异备份备份上一次完全备份后的数据、增量备份备份上一次备份后的数据。推荐的恢复策略是完全增量二进制日志或完全差异二进制日志。根据备份的内容分为物理备份直接备份数据文件和逻辑备份备份表中的数据和代码。物理备份恢复速度快但与MySQL版本相关。逻辑备份恢复简单结果为ASCII文件可编辑但备份和恢复都需要MySQL服务器进程参与。常用的备份工具有mysqldump是MySQL自带的逻辑备份工具可以导出为SQL脚本。比如mysqldump --all-databases -uroot all.sql备份所有数据库mysql -uroot all.sql恢复。二进制日志binlog记录所有更改数据的SQL语句是实现增量备份和主从复制的基础。开启binlog需要在配置文件中添加log-binmysql-bin。基于binlog可以实现基于位置或基于时间的精确恢复。Percona XtraBackup是开源的热备份工具能够在不停止MySQL服务的情况下进行备份支持InnoDB和XtraDB存储引擎备份过程中不会阻塞数据库的正常读写操作。MyDumper是多线程的备份和恢复工具能够充分利用系统资源大大提高备份和恢复的速度适合大型数据库的备份需求。备份策略的制定需要考虑可以容忍丢失多长时间的数据、恢复要在多长时间内完成、恢复时是否需要持续提供服务、恢复的对象是整个库还是单个表等。第九部分学习心得与建议通过系统学习我总结了几个关键点第一数据库设计要遵循范式但也要根据实际情况适当反范式。主键的选择很重要通常使用自增ID。第二数据类型的选择要慎重能用小的不用大的能用整型的不用字符串能用定长的不用变长。第三SQL查询要尽量简单复杂的逻辑尽量在应用层处理。多表连接时要注意性能问题。第四权限管理要严格遵循最小权限原则。不要在生产环境使用root用户。第五备份策略要完善定期测试备份的可用性。不要假设备份一定可用。第六学习数据库要理论与实践结合多动手操作多思考为什么。

更多文章