
简介这是一份面向MySQL与SQL初学者的系统学习资料包内容覆盖从环境搭建、SQL基础查询、运算符、单行与聚合函数、多表查询、子查询到存储过程、触发器、事务、索引与性能优化等完整知识链路适合计算机专业学生、后端开发入门者及相关从业者系统自学。压缩包共41个文件包含20个PDF教程、19个SQL示例脚本和2个Markdown说明整包约21.88MBPDF按章节拆解知识点SQL脚本对应实战练习Markdown提供学习指引与项目说明结构清晰便于按序学习。已有217人浏览学习。其中PDF讲解通俗覆盖MySQL环境搭建、数据类型、约束、视图、存储过程等内容SQL脚本覆盖排序分页、单行函数、日期函数、流程函数、多表查询、增删改、触发器、变量与游标等可直接运行验证配套的mysql-study.sql综合练习可帮助读者从理论顺利过渡到实战是一份适合入门和巩固的实用资料。 其实我一开始真没想到一个“mysql学习资料”的项目标题最后能关联出这么多方向来安装配置、存储过程、面试题、执行计划、行转列、锁表、Workbench、Navicat、Docker部署……零零总总几十个热搜词。但反过来看这恰恰说明MySQL这个领域的学习路径非常固定大家搜索的问题都集中在几个核心痛点上。我这些年从5.5时代一路用到8.0帮人排查过数不清的MySQL问题今天干脆把这些资料和踩坑经验整理成一条完整的学习路线新手照着走能入坑老手也能从中翻出几个平时不太注意的细节。这篇文章适合刚准备学数据库的零基础新手也适合已经工作但MySQL功底不扎实的后端开发。我会以MySQL 8.0为主毕竟是目前最稳定的长期支持版本把安装部署、日常操作、故障排查、面试进阶这四块讲透每一节都会附上我实际操作中的思路和教训。1. 先把环境跑起来安装配置的选型与坑我把MySQL安装放在第一位是因为绝大多数新手在安装这一步就卡住了。热搜词里“mysql安装教程”“mysql安装配置教程”“mysql下载官网”“mysql安装启动服务报错”这些词能同时上榜说明这个问题不是个例。MySQL的安装方式很多但实际操作中我最推荐的就三种Windows下用MSI安装包、Linux下用官方Yum仓库或通用二进制包、本地开发用Docker。这三种方式覆盖了90%以上的场景。1.1 Windows安装的常见误区Windows用户正常会去官网下载MSI安装包但有两个细节容易出错。第一是下载页面的版本选择现在官网默认推荐的是8.0系列而免费版本叫MySQL Community Server千万别下成企业版。第二是安装过程中会要求设置root密码8.0默认的认证插件是caching_sha2_password这个后面连接工具时会遇到问题我在第四部分会细说。安装完以后第一件事是配置环境变量把C:\Program Files\MySQL\MySQL Server 8.0\bin加到Path里。很多人装完以后在cmd里输入mysql -u root -p提示找不到命令就是因为没配环境变量。另外Windows用户经常遇到服务启动报错最常见的原因是3306端口被占用我遇到过被Oracle、旧版MySQL、甚至万恶的Hyper-V保留端口占用的案例。1.2 Linux安装避开两个坑Linux上安装MySQLUbuntu用apt install mysql-server快速装完CentOS/RHEL则推荐先加官方Yum仓库再安装因为系统自带的源里MySQL版本往往过旧。这里有个8.0时代的特殊提醒MySQL官方仓库会同时提供8.0 LTS版本和9.x Innovation版本。我个人的建议是生产环境老老实实用8.09.x那种Innovation版本是尝鲜用的别在生产上折腾。Linux安装后最重要的一步是初始化很多新手跳过这一步直接启动服务结果连不上。通常需要执行mysqld --initialize-insecureroot无密码初始化或mysqld --initialize生成临时密码然后再启动服务。临时密码会写在日志文件里路径一般是/var/log/mysql/error.log里面有类似[Note] A temporary password is generated for rootlocalhost: xxxxxxxx的提示。1.3 Docker安装的几个实用参数Docker安装MySQL确实是最省事的方式之一但很多人不知道初始密码怎么拿。用下面的命令启动容器后初始密码需要从容器日志里捞docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDmy-secret-pw \ -v /my/own/datadir:/var/lib/mysql \ mysql:8.0如果没设置MYSQL_ROOT_PASSWORD环境变量MySQL会随机生成一个初始密码用docker logs mysql8查看日志里面会有[Note] A temporary password is generated for rootlocalhost: xxxxxxxx这样的记录。另外容器使用时记得加上--character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci参数否则默认字符集是latin1存中文全是乱码。这里我踩过一个大坑用Docker部署MySQL后从宿主机连接时报Host xxx is not allowed to connect to this MySQL server。这是因为MySQL默认只允许localhost连接。解决方法是进入容器执行授权命令ALTER USER root% IDENTIFIED WITH mysql_native_password BY yourpassword; FLUSH PRIVILEGES;注意从MySQL 8.0开始mysql_native_password插件默认是关闭的但为了兼容旧工具连接用上面的命令是完全可以的。2. 核心基础命令、存储过程与常用查询写法环境跑通后接下来就是实打实地写SQL了。“mysql数据库命令大全”“mysql存储过程”“mysql排序”“mysql 行转列”“mysql中int5”这些热搜词说明大家都在找常用的语法和用法。我不是让你背命令手册而是挑出最常被问到、最实用的几块讲透。2.1 增删改查和排序这些细节容易被忽略日常开发中最常见的查询写法无外乎SELECT、JOIN、WHERE、GROUP BY、ORDER BY、LIMIT。但细节往往决定成败。比如排序SELECT * FROM users ORDER BY create_time DESC, id DESC;多字段排序时只有当第一个字段相同时第二个字段才生效。另外MySQL 8.0中中文字段排序默认按utf8mb4的排序规则走所以ORDER BY name可能不是按拼音排如果要按拼音排序要用ORDER BY CONVERT(name USING gbk)。这个细节在面试中经常被问在实际项目中更是经常踩坑。再比如热搜词“mysql中int5”这个看着简单但很多人不知道MySQL中整数类型有TINYINT1字节、SMALLINT2字节、INT4字节、BIGINT8字节的区别。INT 5如果超过INT的最大值2147483647会直接报错或转为浮点数。所以在设计表时数据量可能大的字段直接上BIGINT不要省。2.2 存储过程与触发器分隔符是关键存储过程在传统企业系统里用得很多面试也爱问。热搜词“mysql存储过程”“mysql中触发器中分隔符”指向的是同一个常见问题写存储过程或触发器时为什么一定要用DELIMITER修改分隔符原因很简单MySQL默认用分号;作为语句结束符而存储过程内部又包含多条以分号结尾的SQL语句。如果不修改分隔符MySQL在读到第一条分号时就会认为整个语句结束了导致报错。正确的写法是这样的DELIMITER $$ CREATE PROCEDURE GetUser(IN userId INT) BEGIN SELECT * FROM users WHERE id userId; END$$ DELIMITER ;注意最后要把分隔符改回来否则后续的普通SQL语句你都得用$$结尾了。触发器的逻辑类似但要注意的是触发器内部的SQL不能对本表做同样的操作否则会无限递归。2.3 行转列没有PIVOT就用条件聚合热搜词“mysql 行转列”出现频率很高。初学者可能不太理解什么叫行转列我举个例子一张成绩表里有学生名、科目、成绩三列你想查成每个学生一行、科目作为列名的格式这就是行转列。Oracle有PIVOTSQL Server也有但MySQL没有这个语法最常用的方法是CASE WHEN加聚合函数SELECT student_name, MAX(CASE WHEN subject 语文 THEN score END) AS chinese, MAX(CASE WHEN subject 数学 THEN score END) AS math, MAX(CASE WHEN subject 英语 THEN score END) AS english FROM scores GROUP BY student_name;这里的MAX其实只是用来配合GROUP BY取非NULL值的技巧。如果科目较多或者不固定还可以用GROUP_CONCAT配合动态SQL拼出来但那种方式比较复杂新手先把条件聚合写熟练就够了。3. 线上救火必备MySQL常见故障与排查思路整理掌握了基础操作以后真正让你成长的是线上故障排查。“mysql密码忘记了怎么办”“error 2002 (HY000)”“mysql锁表”“mysql执行计划”这些热搜词反映的正是工作中最常见的问题类型。我把它们总结成了一张速查表并且详细说下排查思路。3.1 最经典的连接报错error 2002 (HY000)这个报错我帮人排查过无数次典型的完整提示是ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock (2)。看到这个别慌按照顺序检查三件事MySQL服务是否启动了用systemctl status mysqld或service mysql status查看没启动的话先启动。socket文件路径是否一致客户端连接时默认找/var/run/mysqld/mysqld.sock但MySQL实际生成socket的位置可能不同查看my.cnf里的socket配置。路径对不上时要么改配置文件要么在客户端连接时显式指定mysql -u root -p -h 127.0.0.1 -P 3306。服务进程是否异常退出查看/var/log/mysql/error.log数据目录权限不对、磁盘空间不足都可能导致服务起不来。这里有个容易混淆的点用-h localhost和-h 127.0.0.1是有本质区别的。前者走socket连接后者走TCP连接。Socket连不上但TCP可以的话优先检查socket路径反之则应该检查端口监听。3.2 密码忘了怎么办跳过授权表法忘记密码这件事几乎每个人都遇到过热搜词里有“mysql密码忘记了怎么办”。最可靠的办法是启动时跳过授权表然后修改密码。步骤虽然简单但有一点必须强调# 1. 停止MySQL服务 systemctl stop mysqld # 2. 以跳过授权表的方式启动注意这里要加符号否则会阻塞终端 mysqld_safe --skip-grant-tables # 3. 无密码进入 mysql -u root # 4. 清空并重新设置密码 FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY newpassword;提示MySQL 8.0中skip-grant-tables模式下一些操作可能会受限所以一定要先执行FLUSH PRIVILEGES再修改密码。另外这种方式启动的MySQL非常不安全修完密码后一定要正常重启MySQL服务不要开着跳过授权表的状态直接上线。3.3 锁表和死锁先查进程再动手“mysql锁表”是后端开发提问率极高的话题。遇到表锁造成的业务阻塞第一步是看哪些连接在等锁SHOW PROCESSLIST;重点看State列有没有Waiting for table metadata lock或Waiting for table level lock看Info列里在跑什么语句。如果定位到某个会话在持有锁用KILL 会话ID杀掉即可。我遇到过的最常见的锁表场景有三种长事务不提交导致行锁一直持有、DDL操作等待元数据锁、大批量UPDATE没有走到索引导致行锁升级为表锁。要避免锁问题最实用的建议是增删改语句尽量走索引事务范围尽量小大的批量操作放到业务低峰期执行DDL用ALTER TABLE ... ALGORITHMINPLACE的方式减少锁等待。3.4 EXPLAIN执行计划这几个字段是重点热搜词里“mysql explain详解”单独出现说明大家知道执行计划重要但不知道怎么用。我平时查看执行计划只看五个关键字段type、key、rows、Extra、possible_keys。type字段的值从好到差依次是system const eq_ref ref range index ALL。如果看到ALL全表扫描而且表数据量大那就是该加索引的信号。rows字段是一个估算值表示扫描行数越小越好。Extra字段如果出现Using filesort意味着排序没有用到索引大数据量下会很慢出现Using temporary则说明用到了临时表这类SQL需要重点优化。具体还可以使用EXPLAIN ANALYZEMySQL 8.0.18来看每条执行步骤的实际耗时。4. 工具链与面试进阶把“会一个软件”变成“懂一种技术”MySQL学到这个阶段很多人会发现自己陷入一个瓶颈日常会用但答不上来原理性的问题。热搜词里的“mysql面试题”“mysql workbench使用教程”“navicat连接mysql”“mysql排序”变得很典型——要么在补工具技能要么在刷面试题。4.1 Workbench和Navicat到底用哪个比较好经常有人纠结到底该用哪个客户端我的看法是不用太纠结。MySQL官方的Workbench免费、跨平台和MySQL版本同步更新适合零基础用户和教学场景。Navicat功能更全面支持多种数据库界面也更友好但收费。如果你在连接时遇到Authentication plugin caching_sha2_password cannot be loaded的错误提示根本原因就是MySQL 8.0默认的认证插件和工具版本不兼容。解决方法是把该用户的认证方式改回mysql_native_password我在第一部分已经给过命令。4.2 常见的MySQL面试题核心都在数据结构和一致性上面试题看起来五花八门但核心考点就几类索引结构、事务隔离级别、锁机制、日志模块。最常问的B树索引本质是让InnoDB能在几层磁盘IO内定位到目标数据事务隔离级别直接对应并发场景下的脏读、不可重复读、幻读问题Redo log和Binlog的区别则决定了崩溃恢复和数据一致性方案的实现逻辑。我建议把热点面试题当成一个个小项目去学习比如“order by是怎么执行的”“count(*)、count(1)、count(id)哪个快”“主键用自增ID还是UUID”……每一个都值得自己动手建表验证一下比背八股文强一百倍。4.3 几个容易被忽略但有很高价值的进阶知识点除了上述内容实际上做项目时还有几个容易被忽略的知识点字面量字符集utf8mb4与utf8的坑、行列转换刚才讲过的、唯一约束和重复数据处理、小表驱动大表等等。热搜词里的“mysql设置唯一已经有重复数据库”是一个非常经典的生产环境翻车场景你给字段新增唯一约束但现有数据中已经有一堆重复值直接执行ALTER TABLE ADD UNIQUE必然报错。处理方法是先查出重复数据并去重再添加约束-- 查看哪些字段存在重复 SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) 1; -- 通过临时表的方式保留一条 DELETE u1 FROM users u1 INNER JOIN users u2 WHERE u1.id u2.id AND u1.email u2.email; -- 再添加唯一约束 ALTER TABLE users ADD UNIQUE KEY uk_email (email);另外“mysql自动忽略大小写”这个问题在Linux上和Windows上答案完全不同。Linux上MySQL的表名是大小写敏感的而Windows和macOS默认不敏感。这跟操作系统文件系统有关MySQL的lower_case_table_names参数控制表名大小写Linux下默认是0敏感Windows下默认是1不敏感。跨平台迁移时这点特别容易踩坑——在Windows上开发的项目部署到Linux后如果SQL中的表名大小写和建表时不统一就会直接报Table doesnt exist。4.4 把MySQL和Java项目串起来才是真本事热搜词里出现了“java对mysql的搜索语句”“javaweb项目完整案例mysql”“docker 安装mysql”等词这些其实和MySQL本身没直接关系但工作场景里Java后端和MySQL是分不开的。最基础的一点是JDBC连接串的写法String url jdbc:mysql://localhost:3306/testdb?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8mb4; String username root; String password password; Connection conn DriverManager.getConnection(url, username, password);注意8.0版本的驱动类名是com.mysql.cj.jdbc.Driver旧版教程里的com.mysql.jdbc.Driver已经废弃了。而且JDBC URL后面最好加上serverTimezone和characterEncoding参数否则会有时区报错和中文乱码问题。如果你用MyBatis-Plus或Spring Data JPA这些问题框架都帮你处理了但理解底层连接原理仍然很有必要。5. 一份现成的学习顺序和避坑建议以上把安装、基础、运维、工具和面试全部串起来讲了一遍。最后整理一下给按这套资料学习的朋友一份可以直接照做的顺序先搞定安装Windows直接MSI安装包Mac用brew install mysql云服务器推荐用Docker方式哪个环境先能用起来算哪个。刷SQL基础重点练习SELECT、JOIN、子查询、GROUP BY和排序这些是日常开发使用率最高的语法。深入原理看InnoDB存储引擎搞懂事务和索引再做EXPLAIN字段的专项分析。做项目刷题把MySQL作为后端存储做一个小型项目同时开始刷面试题加深理解。我个人在这几年实操中有个很深的体会MySQL的学习没有必要追求把文档通读一遍遇到问题再去查文档比从第一页看到最后一页的效率高得多。但有三件事必须亲自动手做第一自己建几张表把增删改查和关联查询练熟第二把常见报错连接不上、锁表、权限问题的排查流程过一遍第三把EXPLAIN的几个核心字段通过实际SQL验证一遍。把它们做完MySQL的基本功就算扎实了。本文还有配套的精品资源点击获取