MySQL 入门学习资料

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:在线练习(零安装)

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、条件/排序/分组查询、多表连接、建索引、用事务。

下一步路线:

  1. 做 02-学习练习.md 的习题,动手巩固。
  2. 学 03-精通学习资料.md:索引底层 B+ 树、EXPLAIN 执行计划、事务隔离级别与锁、主从复制、备份恢复。
  3. 看 04-扩展学习资料.md:高可用架构、云数据库、框架 ORM 集成、安全运维。

学习建议:每一条 SQL 都亲手在 MySQL 里跑一遍,看真实返回结果,比看十遍都管用。

复制代码
编程资源
https://pan.quark.cn/s/7f7c83756948
更多资源
https://pan.quark.cn/s/bda57957c548
相关推荐
努力努力再努力wz24 分钟前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
这个DBA有点耶40 分钟前
测试全绿,上线三周数据没入账——那个95%的兼容度报告,漏掉的是边界
数据库·mysql·架构
1024奇点1 小时前
【仓颉语言入门 · 第二篇 第 15 课】
开发语言·数据库·ide·开源
疯狂学习GIS1 小时前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能
gf13211111 小时前
python_高德地图驾车时长查询
数据库·python·mysql
时间售卖铺1 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
秋风点枝2 小时前
数据库 01 · 体系结构与存储引擎
数据库·mysql
CodeGL2 小时前
15、Python 访问数据库
数据库·python
小此方2 小时前
Re:Mysql数据库基础篇(五):拒绝脏数据!一文吃透MySQL表的约束(主键、唯一键、外键与实战案例)
数据库·mysql
想做小南娘,发现自己是女生喵2 小时前
LAN Device Monitor 第二周学习文档
java·服务器·数据库