太好啦~从零开始学 MySQL,我给你一套**“小白也会的上手路线”**:先会用,再理解,再能自己做项目。全程超简洁、一步一做,配小图标方便扫读。
🧭 学什么(先有全景)
- 🧱 基础:什么是数据库/表/行/列、数据类型、主键/外键
- ✍️ CRUD:增删改查(INSERT/DELETE/UPDATE/SELECT)
- 🔗 关系:一对多/多对多、JOIN、聚合与分组
- 🧰 实战:建库、建表、导入数据、写 10 个常用查询
- 🧩 进阶:索引与性能(EXPLAIN)、事务与锁、字符集与排序规则
- 🛡️ 运维:用户与权限、备份与恢复
🚀 第0步:环境就绪(任选一种)
- 💻 图形界面:安装 MySQL 8.x + MySQL Workbench(或 DBeaver),勾选默认的 InnoDB 引擎。
-
🐳 Docker(懂一点命令行就行):
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8 - ✅ 连上后,能看到
Server version: 8.x即成功。
编码统一用 utf8mb4 / utf8mb4_0900_ai_ci(MySQL8 推荐),避免中文乱码。
🧒 第1天:像搭乐高一样理解数据库
- 📦 库(database)=文件夹;表(table)=Excel表;行=一条记录;列=字段。
- 🗝 主键:每行的身份证(唯一、非空);外键:把两张表“扣”在一起。
-
🧪 先动手:创建一个“书店”数据库
-- 创建库 CREATE DATABASE IF NOT EXISTS bookstore DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE bookstore; -- 作者表 CREATE TABLE authors ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, country VARCHAR(50) ); -- 书表(作者一对多) CREATE TABLE books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, price DECIMAL(10,2) NOT NULL, published_date DATE, author_id INT NOT NULL, CONSTRAINT fk_books_author FOREIGN KEY (author_id) REFERENCES authors(id) ON UPDATE CASCADE ON DELETE RESTRICT );
✍️ 第2天:会“增删改查”(CRUD)
-- 增(INSERT)
INSERT INTO authors (name, country) VALUES
('Haruki Murakami','Japan'),('J.K. Rowling','UK');
INSERT INTO books (title, price, published_date, author_id) VALUES
('Kafka on the Shore', 68.00, '2002-09-12', 1),
('Norwegian Wood', 55.00, '1987-09-04', 1),
('Harry Potter 1', 45.00, '1997-06-26', 2);
-- 查(SELECT)
SELECT * FROM authors;
SELECT title, price FROM books WHERE price > 50 ORDER BY price DESC;
-- 改(UPDATE)
UPDATE books SET price = price * 0.9 WHERE author_id = 1;
-- 删(DELETE)
DELETE FROM books WHERE title = 'Harry Potter 1';
小提示:DELETE 很危险,先用 SELECT ... WHERE ... 确认命中行数,再把 SELECT 改 DELETE 执行。
🔗 第3天:表怎么“联动”(JOIN + 聚合)
-- 1) 内连接:查书名+作者名
SELECT b.title, a.name AS author
FROM books b
JOIN authors a ON b.author_id = a.id;
-- 2) 左连接:列出所有作者以及有/没有书
SELECT a.name, b.title
FROM authors a
LEFT JOIN books b ON b.author_id = a.id;
-- 3) 聚合:每位作者有几本书、均价多少
SELECT a.name,
COUNT(b.id) AS book_count,
ROUND(AVG(b.price), 2) AS avg_price
FROM authors a
LEFT JOIN books b ON b.author_id = a.id
GROUP BY a.id, a.name
ORDER BY book_count DESC;
记忆:JOIN=先配对,再挑列;GROUP BY=先分组,再算数(COUNT/AVG/SUM/MAX/MIN)。
🧰 第4天:10个常用查询模板(拿去就能改)
- 条件查询:
WHERE price BETWEEN 30 AND 60 - 模糊查询:
WHERE title LIKE '%Harry%' - 去重列表:
SELECT DISTINCT country FROM authors - 限制条数:
ORDER BY price DESC LIMIT 10 - 统计数量:
SELECT COUNT(*) FROM books - 多条件排序:
ORDER BY author_id ASC, price DESC - 计算列:
SELECT price, price*0.9 AS discounted FROM books -
子查询(in 列表):
SELECT * FROM books WHERE author_id IN (SELECT id FROM authors WHERE country='Japan'); -
视图(保存常用查询):
CREATE VIEW v_jp_books AS SELECT b.* FROM books b JOIN authors a ON a.id=b.author_id WHERE a.country='Japan'; - 分页(第2页,每页10条):
LIMIT 10 OFFSET 10
⚙️ 第5天:数据类型/约束——“选对杯子装水”
- 🔢 整型:INT / BIGINT(自增主键常用)
- 💰 小数:DECIMAL(p,s) 表示精确小数(金额用它,不用 FLOAT/DOUBLE)
- 📅 时间:DATE / DATETIME(本地时间常用)/ TIMESTAMP(受时区影响)
- 🔤 字符串:VARCHAR(n);固定长度用 CHAR(n)
- 🔒 约束:
NOT NULL、UNIQUE、DEFAULT、CHECK(MySQL8支持)
⚡ 第6天:索引与性能(只记关键)
- 🧭 索引=目录;让查询更快。
- 常建:主键、外键列、高频筛选列(如
author_id、(author_id, published_date)组合索引)。 -
看计划:
EXPLAIN SELECT * FROM books WHERE author_id=1 AND price>50;目标:
type至少range/ref,rows越小越好,Extra尽量避免Using filesort/Using temporary。 - 经验:左前缀原则(组合索引按最常用过滤顺序建);避免在列上做函数(会失去索引)。
🔒 第7天:事务与并发(存钱取钱要么都成功,要么都失败)
-- 一个事务示例
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id=1;
UPDATE accounts SET balance = balance + 100 WHERE id=2;
COMMIT; -- 出错就 ROLLBACK
- ACID:原子性/一致性/隔离性/持久性
-
隔离级别(默认 InnoDB
REPEATABLE READ):- READ COMMITTED(脏读无)
- REPEATABLE READ(幻读抑制 via Next-Key)
- SERIALIZABLE(最安全最慢)
- 原则:一个业务=一个事务,出错就回滚。
🧹 维护三件套(随用随会)
-
👤 创建用户+授权(最小权限)
CREATE USER 'app'@'%' IDENTIFIED BY 'StrongPass#1'; GRANT SELECT,INSERT,UPDATE,DELETE ON bookstore.* TO 'app'@'%'; FLUSH PRIVILEGES; -
💾 备份/恢复
mysqldump -u root -p bookstore > bookstore.sql mysql -u root -p < bookstore.sql -
📦 导入CSV(Workbench /
LOAD DATA都行)LOAD DATA LOCAL INFILE '/path/books.csv' INTO TABLE books FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (title, price, published_date, author_id);
🧭 30天超简路线(每天30–40分钟)
- 第1周:建库建表、练 CRUD、写 10 个查询模板
- 第2周:练 JOIN/聚合/视图;做 3 个业务题(“统计”/“排行榜”/“分页搜索”)
- 第3周:索引 + EXPLAIN;把慢查询提速(加索引/改写 WHERE)
- 第4周:事务 + 权限 + 备份;做一个小项目(下单→扣库存→出报表)
🧪 小测(自检 5 题)
books表按作者国家统计平均价格,取前 3 名?- 列出没有任何图书的作者?
- 为 “作者+出版日” 做合适的组合索引并验证有效?
- 设计一个“下单”事务(扣库存不足时回滚)。
- 解释
utf8mb4与排序规则utf8mb4_0900_ai_ci的意义。
🧯 常见坑(避开就顺)
- 乱码:库/表/连接三处都用
utf8mb4;连接串加useUnicode=true&characterEncoding=utf8(按驱动而定)。 - 金额用 DECIMAL,不要 FLOAT。
- 删除前先 SELECT 看命中;更新加
WHERE。 - 只建立必要索引,太多索引会拖慢写入。
- 错误
ERROR 1045(用户/密码问题)→ 用 root 登录后ALTER USER重置 或检查mysql.user权限。
📦 送你一个“可复制项目”思路
“迷你书店”:
- 表:
authors、books、orders、order_items、inventory - 需求:下单时检查库存→减库存→写订单→写明细(一个事务)
- 报表:按月销售额、Top10 书、每位作者销售量
你只要说一声“要项目脚手架”,我就把建表SQL、测试数据、10条典型查询、性能索引建议一次发给你,照抄能跑。