MySQL 入门学习资料
配套资料:
02-学习练习.md------ 每个章节配套上机练习 + 参考答案03-精通学习资料.md------ 事务、锁、索引底层、执行计划、复制、备份恢复、调优04-扩展学习资料.md------ 高可用架构、云数据库、框架集成、安全运维、学习路线
编程资源
https://pan.quark.cn/s/7f7c83756948
更多资源
https://pan.quark.cn/s/bda57957c548
0. 前言:为什么学 MySQL
MySQL 是最流行的**关系型数据库管理系统(RDBMS)**之一,在 Web 应用、后台服务中几乎是事实标准:
- 开源、免费(社区版采用 GPL),生态成熟,资料多、坑少。
- 支持标准 SQL,学会 MySQL 再学 PostgreSQL / SQL Server 成本很低。
- 几乎每种后端语言(Java / PHP / Python / Go / Node)都有成熟的驱动与 ORM。
- 云厂商(阿里云 RDS、腾讯云 CDB、AWS RDS/Aurora)都提供托管 MySQL。
关系型数据库的核心思想:数据以二维表 的形式存储,表与表之间通过关系(外键 / 业务字段)关联。
1. 数据库与 RDBMS 基础概念
数据库(Database):按数据结构组织、存储和管理数据的仓库,由若干张相互关联的表组成。
RDBMS 的核心术语(面试与日常都会用到):
| 术语 | 含义 |
|---|---|
| 表(Table) | 数据的矩阵,类似一张 Excel 表 |
| 列(Column) | 同一类数据的集合,如 user_name、price |
| 行(Row) | 一条完整记录,如一个用户、一笔订单 |
| 主键(Primary Key) | 唯一标识一行,不能重复、不能为 NULL |
| 外键(Foreign Key) | 关联另一张表的主键,建立表间关系 |
| 复合键(Composite Key) | 多个列组合成唯一标识,常见于联合索引 |
| 索引(Index) | 类似书的目录,加速查询 |
| 冗余(Redundancy) | 重复存储数据,降低写入性能但提升安全性/查询速度 |
| 参照完整性 | 外键引用的记录必须真实存在,保证数据一致 |
类比记忆:数据库 = 文件夹,表 = Excel 文件,行 = 一行数据,列 = 一列字段,主键 = 行号且不能重复。
2. 环境安装与连接
2.1 三种安装方式(任选其一)
方式 A:Docker(推荐,干净、易卸载)
bash
docker run --name mysql-dev -e MYSQL_ROOT_PASSWORD=root123 -p 3306:3306 -d mysql:8.0
docker exec -it mysql-dev mysql -uroot -proot123
方式 B:本地安装
- Windows:下载 MySQL Installer 一路下一步。
- macOS:
brew install mysql && brew services start mysql - Linux(Ubuntu):
sudo apt install mysql-server
方式 C:在线练习(零安装)
- 菜鸟教程在线 SQL:https://www.jyshare.com/front-end/7768/
- 适合先看语法、不想装环境时快速验证。
2.2 连接数据库
bash
mysql -h 127.0.0.1 -P 3306 -u root -p
参数说明:-h 主机,-P 端口,-u 用户,-p 提示输入密码。
3. 数据库与表的基本操作
3.1 创建 / 查看 / 删除数据库
sql
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW DATABASES;
USE shop; -- 切换当前数据库
DROP DATABASE shop; -- 危险!会删除整个库
团队规范:永远用
utf8mb4,而不是utf8(MySQL 的utf8只支持 3 字节,存不了 emoji 和部分生僻字)。
3.2 创建表
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
age TINYINT UNSIGNED,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.3 修改表结构(ALTER)
sql
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN username VARCHAR(60) NOT NULL;
ALTER TABLE users DROP COLUMN phone;
3.4 删除表
sql
DROP TABLE users;
4. 数据类型
| 类别 | 常用类型 | 说明 |
|---|---|---|
| 整数 | TINYINT SMALLINT INT BIGINT |
按需选最小够用的,省空间 |
| 小数 | DECIMAL(10,2) FLOAT DOUBLE |
金额必须用 DECIMAL,避免浮点误差 |
| 字符串 | CHAR(n) VARCHAR(n) TEXT |
CHAR 定长(如手机号),VARCHAR 变长 |
| 日期 | DATE TIME DATETIME TIMESTAMP |
DATETIME 无时区,TIMESTAMP 受时区影响 |
| 布尔 | TINYINT(1) |
MySQL 无真布尔,用 0/1 表示 |
| JSON | JSON |
8.0+ 支持,可建虚拟列索引 |
选型口诀:金额
DECIMAL、手机号CHAR(11)、长文本TEXT、时间用DATETIME。
5. 增删改查(CRUD)
5.1 插入(INSERT)
sql
INSERT INTO users (username, email, age) VALUES ('alice', 'alice@x.com', 28);
-- 一次插多行
INSERT INTO users (username, email, age) VALUES
('bob', 'bob@x.com', 31),
('carol', 'carol@x.com', 25);
5.2 查询(SELECT)
sql
SELECT * FROM users;
SELECT username, age FROM users;
SELECT DISTINCT age FROM users; -- 去重
5.3 更新(UPDATE)
sql
UPDATE users SET age = 29 WHERE username = 'alice';
致命陷阱 :
UPDATE忘了WHERE会更新全表!执行前先SELECT确认范围。
5.4 删除(DELETE)
sql
DELETE FROM users WHERE username = 'bob';
同样:没有
WHERE= 清空整张表 。DELETE逐行删可回滚;TRUNCATE TABLE直接清空不可回滚。
6. 条件查询(WHERE)
sql
SELECT * FROM users WHERE age >= 18;
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
SELECT * FROM users WHERE username IN ('alice', 'carol');
SELECT * FROM users WHERE email LIKE '%@x.com'; -- % 任意字符
SELECT * FROM users WHERE email LIKE 'a_'; -- _ 单个字符
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE age > 18 AND username LIKE 'a%';
SELECT * FROM users WHERE age < 18 OR age > 60;
运算符优先级:NOT > AND > OR,不确定就用括号。
7. 排序与分页
sql
SELECT * FROM users ORDER BY age DESC; -- 降序
SELECT * FROM users ORDER BY age DESC, created_at; -- 多列排序
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;-- 第 3 页(每页10)
SELECT * FROM users ORDER BY id LIMIT 20, 10; -- 等价写法
分页公式:
LIMIT (page-1)*size, size。
8. 聚合与分组
sql
SELECT COUNT(*) FROM users;
SELECT AVG(age), MAX(age), MIN(age) FROM users;
SELECT age, COUNT(*) AS cnt FROM users GROUP BY age;
SELECT age, COUNT(*) AS cnt FROM users GROUP BY age HAVING cnt > 1;
WHERE在分组前 过滤行,HAVING在分组后过滤组,且能使用聚合函数。
9. 多表连接(JOIN)
示例:orders 表通过 user_id 关联 users。
sql
-- 内连接:只返回两表都匹配的行
SELECT o.id, u.username, o.amount
FROM orders o
INNER JOIN users u ON o.user_id = u.id;
-- 左连接:保留左表全部,右表无匹配则为 NULL
SELECT u.username, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 右连接 / 全外连接(MySQL 无 FULL JOIN,可用 UNION 模拟)
SELECT ... FROM a LEFT JOIN b ... UNION SELECT ... FROM a RIGHT JOIN b ...;
-- UNION:合并两个查询结果(列数/类型一致,自动去重)
SELECT name FROM t1 UNION SELECT name FROM t2;
记忆:INNER 取交集,LEFT 保左全,RIGHT 保右全。
10. 约束(数据完整性)
sql
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL CHECK (amount >= 0),
status VARCHAR(20) DEFAULT 'pending',
UNIQUE KEY uk_order_no (order_no),
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
);
| 约束 | 作用 |
|---|---|
PRIMARY KEY |
唯一且非空,标识一行 |
FOREIGN KEY |
关联父表,保证参照完整性 |
UNIQUE |
值不重复(允许 NULL) |
NOT NULL |
不能为空 |
DEFAULT |
默认值 |
CHECK |
自定义条件(8.0 开始强制生效) |
11. 索引
sql
CREATE INDEX idx_age ON users(age);
CREATE UNIQUE INDEX idx_username ON users(username);
-- 联合索引(最左前缀原则:能命中 (a) 和 (a,b),不能命中 (b))
CREATE INDEX idx_name_age ON users(username, age);
SHOW INDEX FROM users;
DROP INDEX idx_age ON users;
索引加速查询,但拖慢写入、占空间。高频查询列、连接列、排序列 才建索引;区分度低的列(如性别)不要建。
12. 视图与临时表
sql
-- 视图:虚拟表,封装复杂查询
CREATE VIEW vip_users AS
SELECT id, username FROM users WHERE age > 30;
SELECT * FROM vip_users;
-- 临时表:会话结束自动销毁
CREATE TEMPORARY TABLE tmp_top LIKE users;
13. 常用函数
sql
-- 字符串
SELECT CONCAT(first, ' ', last) AS full_name FROM t;
SELECT UPPER(name), LENGTH(name), SUBSTRING(name,1,3) FROM t;
-- 数值
SELECT ROUND(3.14159, 2), CEIL(2.1), FLOOR(2.9), ABS(-5);
-- 日期
SELECT NOW(), CURDATE(), DATE_ADD(NOW(), INTERVAL 7 DAY), DATEDIFF('2026-01-01', NOW());
-- 流程控制
SELECT username,
CASE WHEN age < 18 THEN '未成年'
WHEN age < 60 THEN '成年'
ELSE '老年' END AS stage
FROM users;
14. 事务基础(ACID)
事务保证一组操作要么全成功、要么全失败。
sql
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交
-- ROLLBACK; -- 出错时回滚
ACID 含义:
- 原子性(Atomicity):操作不可分割。
- 一致性(Consistency):数据从一个一致态到另一个一致态。
- 隔离性(Isolation):并发事务互不干扰。
- 持久性(Durability):提交后数据永久保存。
15. 导入导出与防 SQL 注入
bash
# 导出
mysqldump -u root -p shop > shop.sql
# 导入
mysql -u root -p shop < shop.sql
SQL 注入(高危):
sql
-- 危险:拼接用户输入
"SELECT * FROM users WHERE username = '" + input + "'"
-- 若 input = ' OR '1'='1 则条件恒真,泄露全表
正确做法 :使用参数化查询 / 预编译语句 (PDO、MyBatis #{}、ORM 等),绝不拼接 SQL。
16. 入门小结与下一步
你已经能独立完成:装环境、建库建表、CRUD、条件/排序/分组查询、多表连接、建索引、用事务。
下一步路线:
- 做
02-学习练习.md的习题,动手巩固。 - 学
03-精通学习资料.md:索引底层 B+ 树、EXPLAIN 执行计划、事务隔离级别与锁、主从复制、备份恢复。 - 看
04-扩展学习资料.md:高可用架构、云数据库、框架 ORM 集成、安全运维。
学习建议:每一条 SQL 都亲手在 MySQL 里跑一遍,看真实返回结果,比看十遍都管用。
编程资源
https://pan.quark.cn/s/7f7c83756948
更多资源
https://pan.quark.cn/s/bda57957c548