ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MySQL新手避坑指南:从建表设计到增删改查的实战入门

2026/8/27 19:11:24 拓冰建站 浏览量
MySQL新手避坑指南:从建表设计到增删改查的实战入门 每日学习MySQL新手如何避开那些网上没人告诉你的坑很多刚接触数据库的朋友下载完 MySQL 之后第一反应是上网搜“MySQL 安装教程”“MySQL 数据库命令大全”然后照着敲一遍发现能跑就以为自己会了。等到真正做一个小项目发现自己连一张学生表都设计不明白字段该用什么类型、主键到底加不加、为什么 UPDATE 一个不留神就把整张表的数据改没了。这篇文章不打算给你堆砌一份“从入门到精通”的百科全书。我想做的是另一件事把 MySQL 新手从“知道很多命令”带到“能独立完成一张表的设计、增删改查、简单查询统计、遇到报错会自己排查”这个水平。读完这篇文章你至少能回答这几个问题MySQL 和 SQL 是什么关系为什么命令行能操作、Navicat 也能操作建表的时候主键、字段类型、长度到底怎么选INSERT、UPDATE、DELETE、SELECT 这四类语句真正容易踩坑的地方在哪里排序、分页、聚合统计、条件判断这些最常见的查询需求怎么写才不容易错安装之后连不上数据库、端口被占用、Navicat 报 2059 错误这些经典问题怎么处理全程我会用一个“学生成绩管理”的最小案例串下来它不是玩具而是真实项目里最常见的一类表结构。你可以照着敲也可以拿自己的业务数据改一改。1. 先搞清楚你学的到底是个什么东西新手学 MySQL第一个困惑往往不是语法而是概念。MySQL 是一个关系型数据库管理系统。这句话有点长拆开看就三件事它是用来存数据的软件数据按照“表”的形式组织。“关系型”的意思是表和表之间可以建立关联比如学生表和成绩表通过学生 ID 关联起来。它是一个服务端程序客户端工具命令行、Navicat、Workbench、Java 程序通过网络连接它来读写数据。日常我们说的“会 MySQL”其实包含了三层能力第一层是会用客户端工具比如能连上数据库、能执行 SQL、能看到查询结果这是操作层。第二层是能设计数据库表也就是知道一张业务表应该有哪些字段、字段用什么类型、表之间怎么关联这是设计层。第三层是能保障数据库稳定安全地运行比如备份、权限控制、死锁排查、性能优化这是运维层。对于新手最重要的不是去背 MySQL 有多少种存储引擎、事务隔离级别有几种而是先把第一层和第二层跑通。你不需要一开始就成为 DBA但你要能给自己写的 Java 项目、Python 项目设计一张靠谱的表。MySQL 还涉及到另一个常见概念SQL。SQL 是结构化查询语言它是操作关系型数据库的标准语言。MySQL 只是实现这套语言的一种数据库产品。所以你会发现学会了 MySQL 的 SQL 语法以后用 Oracle、PostgreSQL、SQL Server迁移成本并不高核心就是那几条语句的方言细节不一样。2. 建表之前先建立“实体字段”的设计思维很多新手数据库学得稀里糊涂不是因为 SQL 语法难而是因为缺少建表思维。也就是说拿到一个业务需求不知道应该建几张表、每张表里有哪些字段。这里先记住一个非常朴素的方法先找“实体”再找“属性”。实体就是你要管理的核心对象属性就是描述这个对象的信息。比如学生成绩管理核心实体就是“学生”和“成绩”。学生有姓名、年龄、性别、班级成绩有学生、课程、分数、考试时间。按照这个思路我们设计两张表student存放学生基础信息。score存放每次考试的成绩通过 student_id 关联到 student。为什么成绩不直接存一个字段塞进 student 表因为一个学生有多门课、多次考试如果都放在一行里表结构会非常啰嗦而且后续统计每个学生平均分、按课程分组查询都会变得很痛苦。这就是关系型数据库“拆表”的意义把不同变化频率的数据分开存放通过外键关联把它们重新组合起来。下面是第一次建表会用到的具体设计。需要说明的是我下面给出的字段类型和长度是基于 MySQL 8.0 的常见用法实际开发中请结合业务需求来确定不要无脑照抄。为了演示我们准备一个学生表和一个成绩表。学生表 student 建议至少包含这些字段id 作为主键name 存姓名age 存年龄gender 存性别class_name 存班级created_at 存记录创建时间。成绩表 score 建议包含id 作为主键student_id 关联 student 表的 idcourse_name 存课程名score 存分数exam_time 存考试时间。主键的概念这里说一下主键是表中每一行数据的唯一标识。比如 student 表里id1 的只能有一个不能有两行都是 id1。主键有两个作用一是保证数据不重复二是方便快速查找。真实项目里一般用一个自增整数做主键也可以用雪花算法生成的长整数但新手阶段用一个自增的 INT 或 BIGINT 最直观。字段类型方面新手最常用到的有这些INT / INTEGER整数用来存年龄、数量、ID。BIGINT更大的整数当数据量可能很大时用。VARCHAR(n)可变长度字符串n 是最大字符数适合姓名、班级、课程名。CHAR(n)定长字符串适合长度固定的类型比如性别、状态码。DECIMAL(m, d)精确小数适合金额、分数。m 是总位数d 是小数位。例如 DECIMAL(5, 2) 表示最大 999.99。FLOAT / DOUBLE浮点数适合精度要求不高的场景但涉及金额和精确分数时慎用。DATE日期只存年月日适合考试日期。DATETIME日期时间存年月日时分秒适合创建时间、更新时间。TEXT长文本适合存大段描述。新手最常犯的错误是不管什么数据都无脑用 VARCHAR。比如年龄用 VARCHAR分数用 VARCHAR时间用 VARCHAR。这样设计最大的问题是后续做统计、排序、比较大小的时候非常容易出错。数字就是数字日期就是日期类型选对了后面省很多事。3. 环境准备Windows 下安装 MySQL 8.0 的完整流程这一节先解决“数据库装上了但不知道启动没启动”的问题。下面以 Windows 环境为例讲 MySQL 8.0 的安装过程。第一步下载安装包。进入 MySQL 官网的下载页面选择 MySQL Community Server 或 MySQL Installer for Windows。MySQL Installer 是一个向导式的安装程序新手用这个最省心。下载的时候注意选择对应操作系统版本一般选 64 位的 MSI 安装包。第二步安装类型选择。MySQL Installer 会提供多种安装类型Developer Default 会安装开发需要的全套组件包括 MySQL Server、MySQL Workbench、示例等Server only 只安装数据库服务端。新手如果只想快点跑起来选 Server only 就够了。如果还想用一个图形化工具连接数据库后面单独装一个 Navicat 或者 MySQL Workbench 都可以。第三步设置端口和认证方式。安装过程中会要求你选择端口默认是 3306一般不需要改。如果本机已经装了老版本 MySQL3306 被占用可以改成 3307 等。认证方式方面MySQL 8.0 默认使用 caching_sha2_password一些老版本的图形化客户端可能不支持会出现连接报错。如果你坚持用新版客户端保持默认即可如果你要连接老版本工具就选择“Use Legacy Authentication”这项。不过从长远看更建议升级客户端而不是降低数据库的认证标准。第四步设置 root 密码。root 是 MySQL 的超级管理员账号密码一定要设置得复杂一些而且记牢。这是你连数据库的凭证丢了很麻烦。安装完成后是否立即启动服务勾选即可。第五步验证安装是否成功。打开 Windows 的“服务”确认 MySQL 服务处于“正在运行”状态。也可以打开命令行执行下面的命令mysql -u root -p输入刚才设置的密码如果出现 mysql 提示符说明安装成功。如果你看到“mysql 不是内部或外部命令”这个报错说明 MySQL 的 bin 目录没有加到系统环境变量 PATH 里。解决方法是右键“此电脑”-“属性”-“高级系统设置”-“环境变量”把 MySQL 安装目录下的 bin 文件夹路径追加到 PATH 中然后重新打开命令行窗口。这里最值得提醒的是安装过程中如果看到“Start service 失败”或者安装到 “check requirements” 卡住多数情况是系统缺少 VC 运行库或者本机已经有一个 MySQL 服务在占用端口。解决思路是先去“服务”里看看有没有 MySQL 开头的服务如果已经存在就用它附带的命令行工具如果端口被占用用netstat -ano | findstr 3306查看是谁占用了 3306。找不到原因的时候不要反复删装先检查日志文件安装日志和 MySQL 错误日志都会给出具体线索。4. 用命令行创建数据库和数据表安装好数据库之后接下来的操作推荐先用命令行跑一遍再用图形化工具辅助。命令行会让你清楚地看到每一条 SQL 是怎么执行的图形化工具很多时候帮你自动补全了细节反而不利于理解。打开命令行连接 MySQL 后先创建一个数据库。CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;数据库创建之后使用这个数据库USE school_db;然后创建学生表。这是新手第一次接触完整建表语句。CREATE TABLE student ( id BIGINT AUTO_INCREMENT COMMENT 主键ID, name VARCHAR(32) NOT NULL COMMENT 姓名, age INT COMMENT 年龄, gender CHAR(1) DEFAULT 0 COMMENT 性别0未知1男2女, class_name VARCHAR(64) COMMENT 班级, created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id) ) COMMENT 学生基础信息表;说明几个关键点AUTO_INCREMENT 是自增每次插入新数据时不需要手动指定 id数据库会自动生成 1、2、3 这样的值。NOT NULL 表示这个字段不能为空。DEFAULT 用来指定默认值。PRIMARY KEY 指定主键。COMMENT 给字段加注释好习惯后面维护的人会感谢你。接下来创建成绩表。CREATE TABLE score ( id BIGINT AUTO_INCREMENT COMMENT 主键ID, student_id BIGINT NOT NULL COMMENT 学生ID关联student表, course_name VARCHAR(64) NOT NULL COMMENT 课程名称, score DECIMAL(5, 2) COMMENT 分数, exam_time DATE COMMENT 考试日期, PRIMARY KEY (id) ) COMMENT 考试成绩表;成绩表里有一个字段叫 student_id它用来关联学生表。但注意我在上面的建表语句里没有加外键约束。很多新手会觉得外键必须有但在真实项目中很多团队刻意不使用物理外键而是只在应用层维护逻辑关联。原因很简单物理外键会增加写入时的校验开销并且让数据迁移变得非常困难。从学习角度你可以先知道外键是什么但不要把这个当成必须遵守的规矩。如果你在 MySQL Workbench 中操作也可以在左侧的 SCHEMAS 面板看到刚创建的 school_db 数据库展开里面的 Tables能看到 student 和 score 两张表。要快速用命令行新建数据表只要在 MySQL 的命令行或者 Workbench 的 Query 标签页中执行上面的 SQL 即可。5. 数据写入INSERT 语句的常见误区表建好了接下来最基础的操作就是往表里写数据。插入单行数据INSERT INTO student (name, age, gender, class_name) VALUES (张三, 20, 1, 计算机2201);插入多行数据MySQL 的写法是一次 VALUES 后面跟多组数据INSERT INTO student (name, age, gender, class_name) VALUES (李四, 21, 1, 计算机2201), (王五, 20, 2, 计算机2202), (赵六, 22, 0, 软件2201);插入成绩数据INSERT INTO score (student_id, course_name, score, exam_time) VALUES (1, MySQL数据库, 88.50, 2025-01-10), (1, Java程序设计, 92.00, 2025-01-15), (2, MySQL数据库, 75.00, 2025-01-10);关于 INSERT新手最容易出现两个问题。第一个问题自增主键到底要不要写答案是不要写。因为表结构里 id 是 AUTO_INCREMENT你在 INSERT 语句里列出字段的时候把 id 省略掉就好。如果你硬要写 id比如写成 (1, 张三, ...)那就要保证这个值没有冲突否则会报主键重复。更常见的错误是有些人写 INSERT 语句时字段列表和 VALUES 不对应比如字段有 5 个VALUES 只给了 4 个值或者顺序不一致就会报 Column count doesnt match value count at row 1。第二个问题字符串、日期、数字的写法。字符串和日期要加单引号数字不用加。这个规则看似简单但在复制代码的时候很容易出错。很多初学者会把数字也加上引号比如 20。这个在 MySQL 里不一定报错因为 MySQL 做了隐式转换但长期来看不是好习惯而且会让索引失效的风险变大。6. 查询与更新SELECT、UPDATE、DELETE 的“保命原则”这一节是新手最容易出问题的地方也是面试常考、日常开发里最影响线上安全的部分建议仔细看。先看最简单的查询-- 查询student表全部数据 SELECT * FROM student; -- 查询指定字段 SELECT id, name, class_name FROM student; -- 带条件的查询 SELECT id, name, class_name FROM student WHERE class_name 计算机2201;接下来是 UPDATE。记住一句话UPDATE 操作永远要带上 WHERE 条件除非你确实要更新全表。-- 把id1的学生年龄改成21 UPDATE student SET age 21 WHERE id 1; -- 把计算机2201班所有学生年龄加1 UPDATE student SET age age 1 WHERE class_name 计算机2201;更新的语法本身不复杂复杂的是理解它的风险。MySQL 执行 UPDATE 的时候如果 WHERE 条件没有命中任何行它不会报错只是影响行数为 0。但如果 WHERE 条件写错了比如漏写了 WHERE那么整张表的记录都会被更新。这种事故在开发环境里最多是数据变乱在生产环境里就是严重事故。所以很多团队要求执行 UPDATE 和 DELETE 之前先写一个等价的 SELECT 看看会命中哪些数据确认无误后再修改。DELETE 的原则和 UPDATE 一样必须带 WHERE。-- 删除id5的学生 DELETE FROM student WHERE id 5; -- 删除张三的所有成绩 DELETE FROM score WHERE student_id 1;如果你执行DELETE FROM student;没有任何 WHEREMySQL 会清空整张表。这里还有一个新手容易混淆的地方DELETE 和 TRUNCATE 都能清空表但它们不一样。DELETE 是一条一条删除记录可以回滚但表中的自增计数器不会重置TRUNCATE 是直接重建表速度更快自增计数器会重置但一般不建议在业务表上随意使用。7. 排序与分页ORDER BY 和 LIMIT 的配合数据量少的时候查询全部数据没问题。但真实场景里数据量一大就必须排序、分页。排序用 ORDER BY 语句。-- 按分数从高到低排序 SELECT student_id, course_name, score FROM score ORDER BY score DESC; -- 按分数从低到高排序 SELECT student_id, course_name, score FROM score ORDER BY score ASC;新手容易搞混的地方是ASC 表示升序从小到大DESC 表示降序从大到小。记住 DESC 就是“降”的开头字母。默认如果不写是 ASC。分页用 LIMIT 语句。LIMIT 有两种常见写法-- 写法一只限制返回的行数 SELECT * FROM student LIMIT 10; -- 写法二跳过前面 2 行返回接下来 5 行 SELECT * FROM student LIMIT 2, 5;写法二里LIMIT 2, 5的意思是从第 3 行开始跳过前 2 行最多返回 5 行。在真实项目里分页一般是用页码和每页条数来计算的。假设当前是第 page 页每页显示 pageSize 条那么-- 第1页每页10条跳过0条 SELECT * FROM score ORDER BY id LIMIT 0, 10; -- 第3页每页10条跳过20条 SELECT * FROM score ORDER BY id LIMIT 20, 10;偏移量的公式就是 (page - 1) * pageSize。排序和分页结合的时候有一点要特别注意如果 ORDER BY 的字段存在重复值分页查询的结果在不同页之间可能会出现重复或遗漏。解决方法是在 ORDER BY 中加上一个唯一字段作为辅助排序比如ORDER BY score DESC, id ASC。这样每一页的数据边界就是确定的。8. 修改表结构ALTER TABLE 与 UPDATE 的区别很多人在网上搜“mysql数据库修改结构”就会搜到 ALTER TABLE 这个关键字。它的作用是修改表本身的结构而不是修改表里的数据。查询现有表结构DESC student;给 student 表添加一个字段ALTER TABLE student ADD COLUMN phone VARCHAR(20) COMMENT 联系电话;修改字段的类型和默认值ALTER TABLE student MODIFY COLUMN phone VARCHAR(30) COMMENT 联系电话;修改字段名ALTER TABLE student CHANGE COLUMN phone mobile VARCHAR(30) COMMENT 手机号;删除字段ALTER TABLE student DROP COLUMN mobile;这里要分清两组操作ALTER TABLE操作的是表结构比如增加字段、删除字段、修改字段类型。UPDATE操作的是表数据比如把某一行的某个字段值改掉。新手只有在做项目的时候才会真正理解为什么需要 ALTER TABLE。比如产品经理说学生信息要加一个手机号字段你不能把原来的表删了重建因为里面已经有数据了。正确做法就是 ALTER TABLE 增加一列。增加列的时候如果表里已经有大量数据新列最好设置默认值否则可能因为已有行没有该字段值而导致执行时间较长。另一个常见场景是把某个字段误删了。这时候如果你有建表脚本可以直接根据脚本重新建表。所以这里也建议每设计一张表都保存一份.sql文件放到项目目录里方便后期维护。9. 常用查询与统计聚合函数、CASE WHEN、LIKE前面学了单表的基本增删改查现在进入稍微进阶一点的内容统计查询和条件判断。这些内容在面试和实际项目中都很常见。先看聚合函数。最常用的聚合函数有几个COUNT 统计行数、SUM 求和、AVG 求平均、MAX 取最大值、MIN 取最小值。-- 统计学生总数 SELECT COUNT(*) AS student_count FROM student; -- 统计每个班级的学生人数 SELECT class_name, COUNT(*) AS student_count FROM student GROUP BY class_name; -- 查询成绩表里的最高分、最低分、平均分 SELECT MAX(score) AS max_score, MIN(score) AS min_score, AVG(score) AS avg_score FROM score;GROUP BY 的作用是按某个字段分组。分组的难点在于SELECT 后面的非聚合字段一般都要出现在 GROUP BY 中。如果你 SELECT class_name, COUNT(*) 但 GROUP BY 只写 idMySQL 可能会报错或者在一些模式下直接允许但结果是随机的。所以写聚合查询时先想清楚最终要按什么维度看数据。再看条件统计。比如统计每个学生的平均分同时把成绩按及格和不及格分类SELECT student_id, AVG(CASE WHEN score 60 THEN score ELSE NULL END) AS avg_pass_score, COUNT(CASE WHEN score 60 THEN 1 ELSE NULL END) AS fail_count FROM score GROUP BY student_id;CASE WHEN 是 SQL 里最常用的条件表达式它类似编程语言里的 if-else。上面的语句中如果分数大于等于 60就取这个分数参与平均值计算否则置为 NULL。聚合函数会忽略 NULL所以这个写法可以求“及格科目的平均分”。LIKE 用来模糊匹配。常见场景是搜索姓名包含某个关键字的学生SELECT * FROM student WHERE name LIKE 张%; SELECT * FROM student WHERE name LIKE %三%;注意%表示任意长度的字符_表示单个字符。LIKE 使用时前导通配符%张会导致索引失效所以数据量大时要谨慎。新手阶段只需要知道这个规则不必深究索引优化。10. MySQL 存储过程与触发器新手需要掌握到什么程度关于存储过程和触发器先讲一个判断新手阶段会看、会写简单的就够了不必花大量时间深入研究。很多中小团队的新项目已经偏向于“业务逻辑放在代码里数据库只做存储”因为存储过程的调试比较麻烦版本控制也不如代码方便。但完全不了解也不行原因有两点第一老项目里很可能有用到存储过程和触发器的地方你要能看懂第二面试中偶尔会问到。存储过程是一个预编译的 SQL 语句集合。比如创建一个存储过程按班级统计学生人数DELIMITER $$ CREATE PROCEDURE count_student_by_class(IN class_name_param VARCHAR(64)) BEGIN SELECT class_name, COUNT(*) AS student_count FROM student WHERE class_name class_name_param GROUP BY class_name; END$$ DELIMITER ;调用存储过程CALL count_student_by_class(计算机2201);上面代码中出现的 DELIMITER 是新手最容易看不懂的地方。MySQL 默认用分号作为一条语句的结束符但存储过程内部也会用到分号。如果不把结束符临时改成 $$MySQL 会在第一个分号处就停止解析导致语法错误。所以DELIMITER $$的作用是临时把语句结束符改成 $$等存储过程定义完了再改回分号。触发器是当某个表发生 INSERT、UPDATE、DELETE 时自动执行的一段逻辑。比如记录成绩表插入日志DELIMITER $$ CREATE TRIGGER trg_score_insert AFTER INSERT ON score FOR EACH ROW BEGIN INSERT INTO score_log (student_id, course_name, score, op_time) VALUES (NEW.student_id, NEW.course_name, NEW.score, NOW()); END$$ DELIMITER ;触发器里 NEW 表示新插入的行OLD 表示被更新或删除前的行。触发器的缺点是隐蔽性太强排查问题的时候你可能根本不知道还有一段逻辑在背后自动运行。所以真实项目中触发器的使用场景要比存储过程少得多。11. 常见问题与排查思路新手在安装和使用 MySQL 的过程中会遇到一些经典问题。下面整理成了表格方便快速对照排查。问题现象可能原因排查方向解决方案命令行输入 mysql 提示不是内部或外部命令MySQL bin 目录未加入环境变量 PATH检查环境变量配置将 MySQL 安装目录下的 bin 路径添加到 PATH安装过程中卡在 Start service 或 check requirements缺少 VC 运行库或本机已有 MySQL 服务存在查看安装日志在服务中确认是否已有 MySQL安装 VC 运行库或先停止旧服务再重新安装Navicat 连接 MySQL 8.0 报 2059 错误客户端不支持 caching_sha2_password 认证插件查看认证方式配置升级客户端版本或在安装时选择旧版认证方式也可以通过 SQL 调整 root 用户认证插件端口 3306 被占用导致服务无法启动本机已有进程占用 3306执行 netstat -ano | findstr 3306 查看占用进程修改 MySQL 端口或结束占用端口的进程查询中文乱码数据库、表、客户端的字符集不一致检查 SHOW VARIABLES LIKE character_set%统一使用 utf8mb4 字符集重新建立连接执行 UPDATE 或 DELETE 影响大量行WHERE 条件漏写或写错先使用 SELECT 统计受影响数据检查 WHERE 条件是否准确回滚事务或从备份恢复操作前必须加 WHERE 条件插入数据时提示主键冲突显式插入了已存在的 id 值查询表当前最大 id避免手动指定自增主键或调整自增起始值如果你遇到的是连接层面的错误第一步永远是确认 MySQL 服务是否真的在运行而不是先去检查用户密码。Windows 下可以打开服务管理器Linux 下使用 systemctl status mysql 或 service mysql status 查看。服务没起来的时候其他一切连接配置都是白费。12. 新手每日学习计划与最佳实践最后一部分给你一个可执行的每日学习路线不是说一口气学会而是按天推进。第一天安装 MySQL解决环境问题。只用命令行完成连接、创建数据库、创建一张学生表。第二天学习 INSERT 和 SELECT。把各种字段类型都插入一遍熟悉查询的 WHERE 条件怎么写。第三天学习 UPDATE 和 DELETE。重点练习带 WHERE 的更新和删除理解影响行数的含义。第四天学习 ORDER BY 和 LIMIT做分页查询。用成绩表练习按分数排序、分页展示。第五天学习聚合函数和 GROUP BY统计每个班级人数、每个学生的平均分。第六天学习 ALTER TABLE 修改表结构把一张已经存在的表改成符合需求的表。第七天用一张学生表 一张成绩表独立完成一个完整的小练习插入数据、查询数据、更新成绩、删除学生、统计平均分。每天不需要练太久30 到 60 分钟足够。关键是每天都要动手敲不要只看不练。再补充几条写 SQL 的习惯建议建表语句一定要写 COMMENT。字段注释能让你在三个月后重新打开表的时候不用靠猜来回忆字段含义。生产环境执行 UPDATE 和 DELETE 之前先用 SELECT 查出将要影响的行确认无误后再执行。如果公司有权限管理系统开发账号不应该有生产库的直接写权限。所有 SQL 文件保存为 .sql 文件放到项目目录里统一管理。数据库结构也是代码的一部分需要版本记录。密码和连接信息不要写在代码里。如果你在使用 Java 项目或 Python 项目连接 MySQL至少把数据库连接信息放到配置文件中而不是硬编码。13. 到这里MySQL 入门已经不算“新手”了如果上面这些内容你都上手操作过一遍那么你对 MySQL 的认知已经超过了大多数“背了几个命令”的入门者。你知道了表要怎么设计知道了增删改查怎么用知道了聚合查询怎么做也知道了最常见的几种连接报错怎么排查。下一步值得继续投入的方向有三个第一个是索引。为什么查询会慢、什么时候加索引、什么时候索引会失效这是从“能用”到“好用”的关键一步。第二个是事务。一个操作中多条 SQL 要么全部成功、要么全部失败这个能力在订单、转账、库存这类业务里很重要。第三个是 JDBC 或 Python 连接数据库。把 MySQL 的能力集成到你熟悉的编程语言里做一个带数据库操作的完整小项目这才是真正把数据库用起来的开始。不要着急去啃那些厚厚的 MySQL 原理书先用起来遇到问题再回头找答案。数据库这个东西动手越多理解越深。建议收藏这篇文章把一个一个例子在你自己电脑上敲一遍比看十遍教程都管用。