
1. 从笔记标题说起前两节到底该学到什么程度这篇笔记是 2026 年 3 月 2 日整理出来的记录的是 MySQL 学习第一章的前两节内容。你没看错就是很多教程里最容易被跳过的那部分第一节讲数据库基础第二节讲 SQL 入门。但我的真实体会是MySQL 越往后学越得回来吃透这两节否则后面连报错都看不懂。先说明白这篇文章的适用人群刚下载完 MySQL、还没能把一条创建表的语句从脑子里自然写出来的人或者以前学过 MySQL但一直在安装、连接、建表这些事上反复折腾的人。前两节不要求你写出高性能 SQL也不要求背索引原理但必须达到一个标准——你能闭着眼睛讲清楚一张表里每个字段为什么这么设计能独立完成从建库到插入第一条数据的完整过程。如果你恰好卡在这个阶段这篇文章可以省掉你大量查资料的力气。我会把我踩过的坑、反复确认过的概念、以及真正值得记下来的操作全部写进去当作第一份能直接翻看的学习笔记。1.1 第一节留给我的核心印象不是背定义而是理解“二维表”第一节最容易让人误解的地方就是它的标题看起来像文科内容。数据库、数据库管理系统、关系型数据库这些词堆在一起不少人的做法是背下来就完事。但真正决定你后面能不能顺利学下去的关键是理解“关系”这两个字。关系型数据库里的“关系”指的就是一张二维表不是人和人之间的关系也不是对象之间的关系。表里有行、有列每一行是一条记录每一列是一个字段。这个模型说出来非常简单但你后面学的主键、外键、索引、JOIN 连接全部是在这个二维表上生长出来的。举个例子学生表里有一行“张三”这行数据有姓名、学号、性别、出生日期几个字段班级表里有“软件 1 班”。如果我想表达“张三在软件 1 班”就不能靠把班级信息塞进学生表而是要让学生表里有一个字段指向班级表的主键。这个“外键指向主键”的思路就是关系型数据库解决数据重复和数据不一致的基本手段。第一节课不用真的建外键但必须从概念上接受它表与表之间通过重复出现的字段产生联系而不是通过某种隐性的对象关系。我建议你把第一节里所有概念都放到这个框架里去理解数据库是存放表的容器表是二维结构行是记录列是字段主键是唯一标识一行数据的字段外键是用来关联另一张表主键的字段。把这几句话用自己的话写一遍基本就过关了。1.2 第二节真正的门槛SQL 的四大分类和 MySQL 的干活方式第二节开始接触 SQL这时候最容易出现的状态是以为 SQL 就是“增删改查”四个词。严格来说增删改查只是 DML 的一部分SQL 至少分成四类DDL 数据定义语言负责建库、建表、改表结构DML 数据操作语言负责插入、修改、删除DQL 数据查询语言核心就是 SELECTDCL 数据控制语言负责权限和用户管理。前两节真正要滚瓜烂熟的是 DDL 和 DML 里的基础部分DCL 只要知道有这种分类就行。很多教材把分类列成一个表格就结束了但实际操作里你会反复用到这个分类来判断报错原因。比如你写了DROP TABLE student;这是 DDL 还是 DML如果没意识到 DROP 是 DDL就不容易理解“为什么它自动提交、想回滚都回滚不了”。这种认知会直接影响后面学事务时的心态。第二节还有个容易忽略的点是 MySQL 的工作方式 MySQL 是一个服务端程序真正干活的是 mysqld 进程而我们平时打开的 mysql 命令行只是客户端。客户端把 SQL 发给服务端服务端解析、优化、执行再把结果返回。这个“连接”的概念会贯穿始终后面学连接池、主从复制时都是在服务端和客户端这件事上展开。学习笔记里我特意记了一句话安装 MySQL 装的是服务端打开命令行看到mysql只是客户端连上了服务端。这两个东西是分开的启动失败、连接失败、命令行找不到命令很多时候就是因为只关注了其中一个。2. 安装与连接为什么很多人学了两节就停在这里前两节本身不难真正劝退人的是安装和连接这一步。我见过很多朋友第一天装 MySQL第二天就放弃了原因不是 SQL 难而是error 2002、Access denied、SSL 连接报错一个接一个。这很正常因为教材默认你已经装好了环境而现实是你连服务端都没起来。2.1 安装前先决定版本与安装方式版本方面我只推荐 MySQL 8.0 及以上的社区版。5.7 已经进入生命周期末端而且 8.0 的默认字符集、身份认证方式都更接近现在生产环境的用法。与其装一个老了快十年的版本不如一开始就按主流环境来。安装方式按操作系统分三类Windows 直接到官网下载 MySQL Installer选 Server only 那一类走完向导就行但要注意安装过程中会让你设置 root 密码这个密码一定要记别随手填一个。Linux 上 Debian/Ubuntu 系用apt install mysql-serverCentOS 系用dnf install mysql-server如果是在 Docker 里练习可以用官方镜像快速跑一个实例。我平时练习最常用的一条 Docker 命令是这样docker run --name mysql8 \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -d mysql:8.0需要注意这只是方便本地练习不能直接用去生产环境。真正的部署要考虑数据卷、端口映射、时区、配置文件和密码策略。安装完之后先确认服务端真的在跑。Windows 可以用服务管理器看 MySQL80 的状态Linux 上执行sudo systemctl status mysql看到active (running)再继续往下走。这一步很多人会跳过结果命令行里敲mysql -u root -p直接报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock。这个错误十次里有八次是服务端没启动不是密码错了。2.2 root 初始密码、socket 错误、SSL 提示三连坑怎么走连接命令是mysql -u root -p回车后输入密码。但不同安装方式下 root 的初始密码差别很大。Windows 安装器会让你自己设置密码Linux 包管理器安装完往往要先看日志。比如 CentOS 上 RPM 方式安装 MySQL 后临时密码通常会写在/var/log/mysqld.log里用grep temporary password /var/log/mysqld.log能找到。 Ubuntu 上刚装完时 root 可能走的是auth_socket认证直接用sudo mysql能进入不需要密码进去后再用 SQL 改密码ALTER USER rootlocalhost IDENTIFIED BY 你自己设置的强密码;这里要特别提醒MySQL 8.0 默认密码策略要求足够强的密码长度、大小写、数字、特殊字符都可能有要求。有人设置了一个简单密码结果被拒绝就以为是安装出问题其实只是密码策略太严。如果想调整策略可以执行SHOW VARIABLES LIKE validate_password%;查看当前规则测试环境再考虑放宽。SSL 连接错误也很常见。MySQL 8.0 客户端默认会尝试加密连接如果服务端证书不完整或者你是通过某些老客户端连接就会得到 SSL 相关错误。正确做法是先确认服务端 SSL 状态SHOW VARIABLES LIKE %ssl%;测试环境可以临时调整连接参数但正式环境不建议关闭 SSL。不要看到 SSL 报错就直接加一串禁用参数那样也只是把问题掩盖了。连接工具方面Navicat 有官方试用版不想折腾就用 DBeaver免费、跨平台、支持 MySQL 8.0足够前两节的练习。记住一句话数据库是服务端客户端工具只是操作入口连不上先查服务端状态不要急着怀疑工具坏了。3. 建库建表实操把第一章前两节的语法变成手感连接上 MySQL 之后千万别急着敲一堆看似高级的命令。前两节的重点是建库、建表这是我目前认为性价比最高的实操内容因为它能一次性把字符集、数据类型、约束、默认值这些基础全部串起来。3.1 创建数据库时优先想清楚字符集大多数教材示例只会写CREATE DATABASE school;但实际项目里几乎都要指定字符集。字符集直接决定你要不要面对中文乱码。MySQL 8.0 的默认字符集已经是 utf8mb4但在脚本里显式写出来更清晰CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;utf8mb4兼容完整的 Unicode包括 emoji 这些四字节字符而旧的utf8在 MySQL 里只能存最多三字节字符。utf8mb4_unicode_ci是排序规则它决定了查询时字符串怎么比较和排序。学习阶段记住这一点就够建库时用 utf8mb4排序规则跟着选同系列的unicode_ci基本不会踩坑。建完库之后用USE school;切换当前数据库再用SELECT DATABASE();确认当前库名。这个习惯很重要很多人连接后没USE直接建表结果表建到了别的库里最后到处找不到。3.2 建表语句逐段拆解数据类型、约束、默认值建表语句是前两节最大的一个坎。我建议先不要背整条语法而是把语句拆成三块表名和字段列表、每个字段的类型和属性、表级约束。下面是我当天建的一张学生表每一行都值得解释CREATE TABLE student ( id INT NOT NULL AUTO_INCREMENT COMMENT 自增主键, student_no VARCHAR(20) NOT NULL COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, gender TINYINT NOT NULL DEFAULT 0 COMMENT 性别 0-未知 1-男 2-女, birthday DATE DEFAULT NULL COMMENT 出生日期, phone VARCHAR(20) DEFAULT NULL COMMENT 手机号, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_student_no (student_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表;字段类型的选择是第一个难点。id用INT因为整数足够student_no用VARCHAR(20)因为学号是字符串且长度变化不大name用VARCHAR(50)中文姓名一般够用gender用TINYINT因为性别如果只用 0、1、2 三个值没必要用INTbirthday用DATE只存日期create_time用DATETIME能同时记录日期和时分秒。这里有一个关键词必须记住DEFAULT 0。热词列表里经常出现“mysql 设置默认值为 0”说的就是这个场景。性别字段没有输入时默认值为 0表示未知。默认值不是随便写的它决定了业务上“未填写”的语义。数据类型表格整理一下方便复习类型用途注意事项INT整数INT(5) 的 5 只影响显示宽度不影响取值范围BIGINT较大整数主键用 INT 还是 BIGINT 根据数据量预估VARCHAR(n)变长字符串n 是字符数不是字节数按业务最大长度设置CHAR(n)定长字符串适合长度固定的字段如手机号、身份证DECIMAL(p,s)精确小数金额必须用 DECIMAL不要用 FLOAT/DOUBLEDATE日期只存年月日DATETIME日期和时间配合 DEFAULT CURRENT_TIMESTAMP 很常用TEXT长文本尽量少用正文类内容才考虑3.3 表设计里值得抄走的规范前两节不要求会设计很复杂的表但可以从第一张表开始养成三个习惯。第一每个表必须有主键而且主键要满足“不为空、唯一、稳定”。最常见的主键是自增整数idAUTO_INCREMENT让 MySQL 自动生成递增数字省去业务自己生成。第二尽量加COMMENT注释。字段名一时间看不出来含义很正常表结构如果是给别人维护的注释就是最低成本的文档。第三字符集在建表时也要显式指定。继承数据库默认字符集通常没问题但关键表写清楚能避免以后迁移或复制配置时出现意外。约束方面前两节至少需要掌握五种PRIMARY KEY主键约束、NOT NULL非空约束、UNIQUE KEY唯一键、DEFAULT默认值、FOREIGN KEY外键约束。外键约束可以只了解概念因为生产环境里外键的使用相对谨慎更多是应用层保证一致性。4. 动手把数据加进去DML 基础操作要按这个顺序练建完表不等于学会 MySQL。真正有手感的一刻是你第一次往表里插入一行数据再用 SELECT 把它查出来。基础 DML 的顺序建议是先 insert再 select最后 update 和 delete。4.1 insert 和 select 是验证表结构是否合理的最快方式插入数据用 INSERT INTO 语句。可以直接指定字段列表不推荐的简写是省略字段名直接写值一旦表结构改了数据就容易对不上。INSERT INTO student (student_no, name, gender, birthday, phone) VALUES (20260001, 张三, 1, STR_TO_DATE(2026-03-02, %Y-%m-%d), 13800000000);这里用到了STR_TO_DATE也就是热词里常出现的“mysql 将字符串转为日期”。如果你想把一个字符串变成 DATE 类型字段需要的日期可以直接写2026-03-02MySQL 在大多数情况下会自动转换但显式用STR_TO_DATE更稳尤其是在批量导入外部数据时。插入之后马上验证SELECT * FROM student;轻微的数据量下SELECT *用于快速查看没问题。不过从第一天开始就建议养成只查必要字段的习惯SELECT id, name, gender FROM student;比SELECT *更能逼自己想清楚“我要什么”。4.2 update、delete 与排序分页先建立 SQL 执行顺序的意识改数据用 UPDATE删数据用 DELETE。这两条语句有一个必须养成的肌肉记忆先写 WHERE再执行。没有 WHERE 条件的 UPDATE 会把整张表的数据全部改掉DELETE 同理。第一次接触这些操作时强烈建议先跑一遍SELECT * FROM student WHERE id 1;确认要改的就是这行再写UPDATE student SET phone 13900000000 WHERE id 1;删除时也一样先 SELECT 确认范围再执行 DELETE。基础查询里排在最前面的实战功能是排序和分页SELECT id, name, create_time FROM student ORDER BY create_time DESC LIMIT 10;这条语句的意思是按创建时间从新到旧排序只取前 10 行。LIMIT 是 MySQL 里最常用的分页手段但它的语法和 SQL 标准里写法有差异自己练习时用LIMIT 10最简单。以后遇到LIMIT 10 OFFSET 20这种写法知道是跳过前 20 行再取 10 行就可以了。在学习第一章前两节时不需要背执行计划但可以记一个执行顺序的概念写 SQL 时字段在最前面但 MySQL 真正执行时是先确定数据来自哪张表再过滤条件再排序最后才决定返回哪些字段和行数。这一点如果不建立后面学 WHERE 条件优化、索引、分组时很容易被绕晕。5. 我建议你现在先别碰的东西以及个人排错心得前两节学完之后最容易出现的错觉是“接下来可以去研究存储过程、主从复制、连接池了”。我在这个阶段也动过这个念头最后发现完全是在浪费精力。学习要分阶段有些知识点现在碰只会增加挫败感。5.1 哪些 MySQL 高频知识点必须往后放热词里有一大串看起来很膨胀的内容数据库连接池、MySQL 存储过程、主从复制、事务处理、锁原理、索引优化。这些确实都很重要但它们的共同特点是都依赖更深的架构和并发理解。比如连接池解决的是“客户端频繁创建连接太慢”的问题你如果连服务端连接的基本流程都不清楚学连接池就是在背名词。存储过程本质是把一段 SQL 逻辑封装在数据库里重复执行但你先得能把普通 SQL 写对。锁原理和事务处理更是会牵涉到 InnoDB 的隔离级别前两节的表都还建不利索的时候去研究行锁表锁只会一头雾水。我把这些知识点统一记成了“后置清单”它们不是不重要而是等基础扎实之后再逐项攻克。这个阶段真正应该反复练的是独立建库、建表、插入数据、查询、修改、删除以及用字符集和约束解决实际问题。5.2 我踩过且几乎每个人都会踩的四个错误第一个错误是执行 SQL 时忘记选数据库。明明建了 school 库结果没执行USE school;直接CREATE TABLE student把表建进了默认数据库。解决方法是建表前先看一眼当前库SELECT DATABASE();。第二个错误是修改 root 密码后下次连不上。原因可能不是密码错了而是 MySQL 服务端还没重启或客户端连的是另一个端口。先sudo systemctl status mysql确认服务状态再用mysql -u root -p连接。如果提示Access denied再判断是密码问题还是认证插件问题。第三个错误是 Windows 安装器里明明设了密码命令行却一直提示密码不对。这种情况往往是因为安装过程只初始化了服务没有真正启动或者你输入密码时开了中文输入法。把输入法切到英文重新输一次。第四个错误是客户端工具里的 SSL 报错被忽略。很多人图省事直接关闭 SSL结果以后部署到服务器时发现安全基线过不了。正确的态度是先用服务端变量确认 SSL 配置测试环境再决定是否放宽正式环境保持默认。5.3 第一章前两节过关的自测清单我给自己的过关标准列了一张清单你也可以照着测一遍能说出 MySQL 是服务端程序mysql 命令是客户端能区分 DDL、DML、DQL、DCL能独立创建一个 utf8mb4 的数据库能设计一张包含主键、非空、默认值、唯一键的简单表能往表里插入数据并用SELECT ... WHERE查出来能写出带ORDER BY和LIMIT的查询遇到连接错误时懂得先看服务端状态而不是反复改密码。这张清单全部通过后再去碰索引、事务、连接池这些内容节奏就对了。我目前给自己定的后续路线是先把单表查询练到不看文档也能写然后进入多表关联和索引基础。后面验证过有效的内容再回来补充分享。