Skip to content

关系型数据库 MySQL

MySQL 是非常适合零基础建立“数据表思维”的数据库之一。

如果你后面要做这些项目:

  • 用户系统
  • 订单系统
  • 题库系统
  • 博客系统
  • 商城系统

MySQL 基本都会出现。

本节目标

  • 理解为什么需要数据库
  • 理解数据库、表、行、列这些基础概念
  • 学会创建数据库和数据表
  • 学会最基础的增删改查
  • 理解字段类型、约束、索引、表关系和事务的基础意义

为什么需要数据库

如果你只把数据放在 Python 变量里,程序结束后数据通常就没了。

例如:

python
students = ["小明", "小红"]

这在脚本运行期间当然能用,但只要程序结束,这份数据通常不会自动长期保存。

数据库的作用,就是把数据稳定地保存下来,并让你后面还能继续:

  • 新增数据
  • 修改数据
  • 删除数据
  • 查询数据

所以数据库解决的是“数据持久化”和“数据管理”问题。

什么是关系型数据库

你可以先把关系型数据库理解成:

  • 用“表”的方式组织数据

它最常见的表达形式就是二维表结构。

例如一张学生表:

idnameagecity
1小明18北京
2小红19上海

这里:

  • 每一列表示某个字段
  • 每一行表示一条记录

四个最基础的概念

1. 数据库

可以理解成一个总仓库。

2. 表

数据库中的一个数据分类表。

3. 行

表中的一条记录。

4. 列

表中的一个字段。

这四个概念必须完全清楚,因为后面所有 SQL 操作都建立在它们之上。

第一步:创建数据库

sql
CREATE DATABASE study_db;

这条语句表示:

  • 创建一个名为 study_db 的数据库

第二步:选择数据库

sql
USE study_db;

这一步的作用很像你在文件系统里执行 cd 进入某个目录。

意思是:

  • 后面的表操作都在 study_db 里进行

第三步:创建数据表

sql
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)

表示城市是字符串字段。

第四步:插入数据

sql
INSERT INTO students (name, age, city)
VALUES ('小明', 18, '北京');

再插入一条:

sql
INSERT INTO students (name, age, city)
VALUES ('小红', 19, '上海');

插入的本质是:

  • 往表里新增一条记录

第五步:查询数据

查询全部数据

sql
SELECT * FROM students;

输出示例:

text
+----+------+-----+------+
| id | name | age | city |
+----+------+-----+------+
|  1 | 小明 |  18 | 北京 |
|  2 | 小红 |  19 | 上海 |
+----+------+-----+------+

查询部分字段

sql
SELECT name, age FROM students;

条件查询

sql
SELECT * FROM students WHERE age >= 18;

这表示只查出年龄大于等于 18 的学生。

第六步:更新数据

sql
UPDATE students
SET city = '深圳'
WHERE id = 1;

这表示:

  • 找到 id = 1 这一行
  • city 改成 深圳

第七步:删除数据

sql
DELETE FROM students WHERE id = 2;

这表示删除 id = 2 的记录。

为什么删除语句一定要小心

如果你写成:

sql
DELETE FROM students;

表示整张表的数据都会被删除。

所以删除操作一定要特别注意条件。

字段类型怎么理解

后面你会经常看到这些类型:

INT

整数。

适合:

  • 年龄
  • 数量
  • 状态编号

VARCHAR(50)

短字符串。

适合:

  • 姓名
  • 城市
  • 标题

TEXT

更长的文本。

适合:

  • 文章内容
  • 课程介绍

DATETIME

日期时间。

适合:

  • 创建时间
  • 发布时间

约束是什么

约束是为了保证数据质量。

常见约束有:

PRIMARY KEY

主键,唯一标识一条记录。

NOT NULL

不能为空。

UNIQUE

不能重复。

DEFAULT

默认值。

例如:

sql
status INT DEFAULT 1

表示如果不手动写 status,默认就是 1。

排序、限制和统计

这是查询阶段很常见的几个基础能力。

排序

sql
SELECT * FROM students ORDER BY age DESC;

表示按年龄从大到小排序。

限制结果数量

sql
SELECT * FROM students LIMIT 2;

表示只取前两条。

统计数量

sql
SELECT COUNT(*) FROM students;

表示统计学生总数。

分组和聚合

后面做统计类需求时会用到。

例如:

sql
SELECT city, COUNT(*) 
FROM students
GROUP BY city;

这表示:

  • 按城市分组
  • 统计每个城市有多少学生

索引是什么

你可以把索引理解成:

  • 书的目录

没有目录时,你要一页一页翻。
有目录时,可以更快定位。

数据库也是一样:

  • 没有索引,查询可能慢
  • 有索引,某些查询会更快

但索引不是越多越好,因为:

  • 新增和修改数据时也要维护索引

所以索引的核心是“为常用查询提速”,不是无脑多加。

表关系是什么

真实项目里通常不止一张表。

常见关系有:

一对多

例如:

  • 一个班级对应多个学生

多对多

例如:

  • 一个学生可以选多门课
  • 一门课也可以被多个学生选

一对一

例如:

  • 一个用户对应一份详细资料

MySQL 的强项之一,就是很适合处理这类表与表之间的关系。

事务为什么重要

事务特别适合这种场景:

  • A 扣钱
  • B 加钱

这两个动作要么一起成功,要么一起失败。

如果只成功一半,数据就错了。

事务的核心价值就是:

  • 保证一组操作的一致性

零基础阶段你先把它理解成“保护关键业务流程不出半截问题”就够了。

一个完整练习流程

你可以按下面顺序自己练一遍:

  1. 创建数据库 study_db
  2. 创建表 students
  3. 插入 3 条学生数据
  4. 查询全部数据
  5. 条件查询年龄大于等于 18 的学生
  6. 修改某个学生的城市
  7. 删除某条学生记录
  8. 再次查询确认结果

只要你把这套增删改查练熟,数据库就算真正入门了。

常见错误

1. 没有先 USE study_db

结果后面的表操作不在你以为的数据库中。

2. UPDATEDELETE 忘记写条件

这可能会把整张表的数据都改掉或删掉。

3. 字段类型选错

例如长文本却用了太短的 VARCHAR

4. 只会背语法,不理解表结构

数据库的核心不是“会写几条 SQL”,而是知道数据该怎么设计。

练习题

练习 1

创建一个 courses 表,包含:

  • 课程名
  • 价格
  • 讲师

练习 2

插入 3 条课程数据。

练习 3

查询价格大于某个值的课程。

练习 4

把某门课程的价格更新为新值。

练习 5

自己总结:

  • 数据库、表、行、列分别是什么
  • INSERTSELECTUPDATEDELETE 分别在做什么

本节小结

MySQL 最重要的价值,是帮你建立“用表管理数据”的思维方式。

你这一节最重要的收获应该是:

  • 理解数据库、表、行、列
  • 会创建数据库和数据表
  • 会最基础的增删改查
  • 知道字段类型、约束、索引、表关系和事务分别在解决什么问题

只要这层基础打牢,后面 Python 连接 MySQL 和 Django ORM 都会顺很多。

Built with VitePress.