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_nameprice
行(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
相关推荐
A15362552 小时前
2026 电商物流系统推荐:多渠道仓配履约数字化选型指南
大数据·数据库·人工智能
tianyu2342 小时前
MySQL字符串处理函数完全指南:从入门到实战
mysql·字符串·函数·截取
天空之外1362 小时前
Docker安装MySQL 8.4 LTS、Docker安装Redis 7.4.x、Docker安装MinIO
java·mysql·docker
ClouGence3 小时前
CloudDM:开源免费!一站式数据库访问、SQL审核、权限与脱敏管控平台
数据库·sql·开源
(轻舟已过万重山)3 小时前
第39章 评估迭代:上线只是开始,迭代才是关键
大数据·数据库·人工智能
oradh3 小时前
Oracle参数文件(PFILE与SPFILE)维护操作总结
数据库·oracle·oracle参数·spfile·pfile
l1t4 小时前
kryonix提交的DuckDB 统一并优化标量执行器基础设施 - #24564 PR
开发语言·数据库·数据仓库·sql
鸽芷咕4 小时前
【金仓数据库征文】从 Oracle 到金仓:一次零误差的数据库国产化迁移实录
数据库·oracle
0566465 小时前
RAG 向量检索:从“查字“到“查意“
数据库·人工智能·学习·oracle
bug嘛我经常写5 小时前
dbf文件UTF-8转GBK编码,以及两编码文件互转
数据库·python