从零开始学习MySQL


太好啦~从零开始学 MySQL,我给你一套“小白也会的上手路线”:先会用,再理解,再能自己做项目。全程超简洁、一步一做,配小图标方便扫读。 🧭 学什么(先有全景) 🧱 基础:什么是数据库/表/行/列、数据类型、主键/外键 ✍️ CRUD:增删改查(INSERT/DELETE/UPDATE/SELECT) 🔗 关系:一对多/多对多、JOIN、聚合与分组...

太好啦~从零开始学 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 ... 确认命中行数,再把 SELECTDELETE 执行。


🔗 第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个常用查询模板(拿去就能改)

  1. 条件查询:WHERE price BETWEEN 30 AND 60
  2. 模糊查询:WHERE title LIKE '%Harry%'
  3. 去重列表:SELECT DISTINCT country FROM authors
  4. 限制条数:ORDER BY price DESC LIMIT 10
  5. 统计数量:SELECT COUNT(*) FROM books
  6. 多条件排序:ORDER BY author_id ASC, price DESC
  7. 计算列:SELECT price, price*0.9 AS discounted FROM books
  8. 子查询(in 列表):

    SELECT * FROM books
    WHERE author_id IN (SELECT id FROM authors WHERE country='Japan');
  9. 视图(保存常用查询):

    CREATE VIEW v_jp_books AS
    SELECT b.* FROM books b
    JOIN authors a ON a.id=b.author_id
    WHERE a.country='Japan';
  10. 分页(第2页,每页10条):LIMIT 10 OFFSET 10

⚙️ 第5天:数据类型/约束——“选对杯子装水”

  • 🔢 整型:INT / BIGINT(自增主键常用)
  • 💰 小数DECIMAL(p,s) 表示精确小数(金额用它,不用 FLOAT/DOUBLE)
  • 📅 时间:DATE / DATETIME(本地时间常用)/ TIMESTAMP(受时区影响)
  • 🔤 字符串VARCHAR(n);固定长度用 CHAR(n)
  • 🔒 约束NOT NULLUNIQUEDEFAULTCHECK(MySQL8支持)

⚡ 第6天:索引与性能(只记关键)

  • 🧭 索引=目录;让查询更快。
  • 常建:主键外键列高频筛选列(如 author_id(author_id, published_date) 组合索引)。
  • 看计划:

    EXPLAIN SELECT * FROM books WHERE author_id=1 AND price>50;

    目标:type 至少 range/refrows 越小越好,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 题)

  1. books 表按作者国家统计平均价格,取前 3 名?
  2. 列出没有任何图书的作者?
  3. 为 “作者+出版日” 做合适的组合索引并验证有效?
  4. 设计一个“下单”事务(扣库存不足时回滚)。
  5. 解释 utf8mb4 与排序规则 utf8mb4_0900_ai_ci 的意义。

🧯 常见坑(避开就顺)

  • 乱码:库/表/连接三处都用 utf8mb4;连接串加 useUnicode=true&characterEncoding=utf8(按驱动而定)。
  • 金额用 DECIMAL,不要 FLOAT。
  • 删除前先 SELECT 看命中;更新加 WHERE
  • 只建立必要索引,太多索引会拖慢写入。
  • 错误 ERROR 1045(用户/密码问题)→ 用 root 登录后 ALTER USER 重置 或检查 mysql.user 权限。

📦 送你一个“可复制项目”思路

“迷你书店”

  • 表:authorsbooksordersorder_itemsinventory
  • 需求:下单时检查库存→减库存→写订单→写明细(一个事务)
  • 报表:按月销售额、Top10 书、每位作者销售量

你只要说一声“要项目脚手架”,我就把建表SQL、测试数据、10条典型查询、性能索引建议一次发给你,照抄能跑。


数据库有很多,如何选择

为什么要减少糖和食盐的摄入?

评 论
请登录后再评论