关系型数据库 MySQL
MySQL 是非常适合零基础建立“数据表思维”的数据库之一。
如果你后面要做这些项目:
- 用户系统
- 订单系统
- 题库系统
- 博客系统
- 商城系统
MySQL 基本都会出现。
本节目标
- 理解为什么需要数据库
- 理解数据库、表、行、列这些基础概念
- 学会创建数据库和数据表
- 学会最基础的增删改查
- 理解字段类型、约束、索引、表关系和事务的基础意义
为什么需要数据库
如果你只把数据放在 Python 变量里,程序结束后数据通常就没了。
例如:
students = ["小明", "小红"]这在脚本运行期间当然能用,但只要程序结束,这份数据通常不会自动长期保存。
数据库的作用,就是把数据稳定地保存下来,并让你后面还能继续:
- 新增数据
- 修改数据
- 删除数据
- 查询数据
所以数据库解决的是“数据持久化”和“数据管理”问题。
什么是关系型数据库
你可以先把关系型数据库理解成:
- 用“表”的方式组织数据
它最常见的表达形式就是二维表结构。
例如一张学生表:
| id | name | age | city |
|---|---|---|---|
| 1 | 小明 | 18 | 北京 |
| 2 | 小红 | 19 | 上海 |
这里:
- 每一列表示某个字段
- 每一行表示一条记录
四个最基础的概念
1. 数据库
可以理解成一个总仓库。
2. 表
数据库中的一个数据分类表。
3. 行
表中的一条记录。
4. 列
表中的一个字段。
这四个概念必须完全清楚,因为后面所有 SQL 操作都建立在它们之上。
第一步:创建数据库
CREATE DATABASE study_db;这条语句表示:
- 创建一个名为
study_db的数据库
第二步:选择数据库
USE study_db;这一步的作用很像你在文件系统里执行 cd 进入某个目录。
意思是:
- 后面的表操作都在
study_db里进行
第三步:创建数据表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
city VARCHAR(50)
);这张表里:
id是主键AUTO_INCREMENT表示自动递增name不能为空
逐列理解字段定义
id INT PRIMARY KEY AUTO_INCREMENT
表示:
- 整数字段
- 主键
- 自动递增
name VARCHAR(50) NOT NULL
表示:
- 字符串字段
- 最大长度 50
- 不能为空
age INT
表示年龄是整数。
city VARCHAR(50)
表示城市是字符串字段。
第四步:插入数据
INSERT INTO students (name, age, city)
VALUES ('小明', 18, '北京');再插入一条:
INSERT INTO students (name, age, city)
VALUES ('小红', 19, '上海');插入的本质是:
- 往表里新增一条记录
第五步:查询数据
查询全部数据
SELECT * FROM students;输出示例:
+----+------+-----+------+
| id | name | age | city |
+----+------+-----+------+
| 1 | 小明 | 18 | 北京 |
| 2 | 小红 | 19 | 上海 |
+----+------+-----+------+查询部分字段
SELECT name, age FROM students;条件查询
SELECT * FROM students WHERE age >= 18;这表示只查出年龄大于等于 18 的学生。
第六步:更新数据
UPDATE students
SET city = '深圳'
WHERE id = 1;这表示:
- 找到
id = 1这一行 - 把
city改成深圳
第七步:删除数据
DELETE FROM students WHERE id = 2;这表示删除 id = 2 的记录。
为什么删除语句一定要小心
如果你写成:
DELETE FROM students;表示整张表的数据都会被删除。
所以删除操作一定要特别注意条件。
字段类型怎么理解
后面你会经常看到这些类型:
INT
整数。
适合:
- 年龄
- 数量
- 状态编号
VARCHAR(50)
短字符串。
适合:
- 姓名
- 城市
- 标题
TEXT
更长的文本。
适合:
- 文章内容
- 课程介绍
DATETIME
日期时间。
适合:
- 创建时间
- 发布时间
约束是什么
约束是为了保证数据质量。
常见约束有:
PRIMARY KEY
主键,唯一标识一条记录。
NOT NULL
不能为空。
UNIQUE
不能重复。
DEFAULT
默认值。
例如:
status INT DEFAULT 1表示如果不手动写 status,默认就是 1。
排序、限制和统计
这是查询阶段很常见的几个基础能力。
排序
SELECT * FROM students ORDER BY age DESC;表示按年龄从大到小排序。
限制结果数量
SELECT * FROM students LIMIT 2;表示只取前两条。
统计数量
SELECT COUNT(*) FROM students;表示统计学生总数。
分组和聚合
后面做统计类需求时会用到。
例如:
SELECT city, COUNT(*)
FROM students
GROUP BY city;这表示:
- 按城市分组
- 统计每个城市有多少学生
索引是什么
你可以把索引理解成:
- 书的目录
没有目录时,你要一页一页翻。
有目录时,可以更快定位。
数据库也是一样:
- 没有索引,查询可能慢
- 有索引,某些查询会更快
但索引不是越多越好,因为:
- 新增和修改数据时也要维护索引
所以索引的核心是“为常用查询提速”,不是无脑多加。
表关系是什么
真实项目里通常不止一张表。
常见关系有:
一对多
例如:
- 一个班级对应多个学生
多对多
例如:
- 一个学生可以选多门课
- 一门课也可以被多个学生选
一对一
例如:
- 一个用户对应一份详细资料
MySQL 的强项之一,就是很适合处理这类表与表之间的关系。
事务为什么重要
事务特别适合这种场景:
- A 扣钱
- B 加钱
这两个动作要么一起成功,要么一起失败。
如果只成功一半,数据就错了。
事务的核心价值就是:
- 保证一组操作的一致性
零基础阶段你先把它理解成“保护关键业务流程不出半截问题”就够了。
一个完整练习流程
你可以按下面顺序自己练一遍:
- 创建数据库
study_db - 创建表
students - 插入 3 条学生数据
- 查询全部数据
- 条件查询年龄大于等于 18 的学生
- 修改某个学生的城市
- 删除某条学生记录
- 再次查询确认结果
只要你把这套增删改查练熟,数据库就算真正入门了。
常见错误
1. 没有先 USE study_db
结果后面的表操作不在你以为的数据库中。
2. UPDATE 或 DELETE 忘记写条件
这可能会把整张表的数据都改掉或删掉。
3. 字段类型选错
例如长文本却用了太短的 VARCHAR。
4. 只会背语法,不理解表结构
数据库的核心不是“会写几条 SQL”,而是知道数据该怎么设计。
练习题
练习 1
创建一个 courses 表,包含:
- 课程名
- 价格
- 讲师
练习 2
插入 3 条课程数据。
练习 3
查询价格大于某个值的课程。
练习 4
把某门课程的价格更新为新值。
练习 5
自己总结:
- 数据库、表、行、列分别是什么
INSERT、SELECT、UPDATE、DELETE分别在做什么
本节小结
MySQL 最重要的价值,是帮你建立“用表管理数据”的思维方式。
你这一节最重要的收获应该是:
- 理解数据库、表、行、列
- 会创建数据库和数据表
- 会最基础的增删改查
- 知道字段类型、约束、索引、表关系和事务分别在解决什么问题
只要这层基础打牢,后面 Python 连接 MySQL 和 Django ORM 都会顺很多。