MySQL 数据库的核心概念完全指南
本文档专门讲解 MySQL 里最基础、最重要的概念,用生活化的比喻和大量示例帮你建立清晰的知识框架,适合零基础新手反复阅读。
目录
- 为什么要学“概念”
- 数据库是什么
- 关系型数据库与 MySQL
- 核心层级:从大到小
- 数据库(Database)详解
- 表(Table)详解
- 行与列(Row & Column)详解
- 主键与唯一性
- 表与表之间的关系
- 数据类型(概念入门)
- SQL 与这些概念的关系
- 索引与约束(概念入门)
- 用一张图串起所有概念
- 常见疑问解答
1. 为什么要学“概念”
- 概念决定了你怎么“想”数据:数据放在哪、怎么组织、怎么查。
- 先把 数据库 → 表 → 行、列 等搞清楚,后面写 SQL、建表、设计库都会轻松很多。
- 本文不要求你马上会写复杂 SQL,重点是:看懂结构、听懂术语、能想象出数据长什么样。
2. 数据库是什么
2.1 通俗理解
数据库就是专门用来存放“有结构”的数据的仓库。
- “有结构”指:数据不是乱堆的,而是按表来组织,每张表有列名和行,像 Excel 表格一样。
- “仓库”指:可以长期保存、多人共享、用程序或命令来存取。
2.2 和 Excel 的简单对比
| 对比项 | Excel 文件 | 数据库 |
|---|---|---|
| 存放单位 | 一个文件里多张工作表 | 一个数据库里多张表 |
| 数据量 | 通常几万行就卡 | 可到百万、千万行 |
| 多人同时用 | 容易冲突、不好控制 | 有“事务、锁”等机制 |
| 查询方式 | 手工筛选、公式 | 用 SQL 语句精确查询、统计 |
| 安全性 | 靠文件权限 | 有用户、权限、备份机制 |
所以:数据库 = 更专业、更强大的“结构化数据仓库”。
2.3 生活中的类比
- 一个学校:有学生名单、成绩单、课程表…… 这些“名单、成绩单、课程表”就像不同的表,它们合在一起,可以看作一个数据库,比如叫“教学管理库”。
- 一个超市:商品表、库存表、会员表…… 合起来可以叫“进销存数据库”。
一句话:数据库 = 一个“项目”或“系统”里,所有相关表的集合 + 管理这些表的一套机制。
3. 关系型数据库与 MySQL
3.1 什么是“关系型”
关系型数据库的意思是:数据用表(Table)来存,表与表之间可以通过某些列建立“关系”,从而一起使用。
例如:
- 学生表里有一列叫“班级编号”;
- 班级表里有一列叫“班级编号”;
- 通过“班级编号”就能把“学生”和“班级”关联起来,这就是“关系”。
这种用“表 + 关系”组织数据的数据库,就叫关系型数据库。
MySQL 就是其中一种软件(数据库管理系统),负责:建库、建表、存数据、查数据、管用户等。
3.2 和“非关系型”的简单区别(了解即可)
- 关系型(如 MySQL):表结构固定,强调表与表的关系,用 SQL 操作。
- 非关系型(如 MongoDB、Redis):有的不用表,用“文档”“键值”等形态存数据,适合特定场景。
新手阶段先把 MySQL + 表 + 关系 搞懂即可。
4. 核心层级:从大到小
MySQL 里,数据的组织是分层的,从大到小记这一句就行:
MySQL 服务器(一台机器上跑的一个程序)
↓
数据库(Database) ← 一个“项目”或“应用”的数据集合
↓
表(Table) ← 一张有列名、多行数据的表格
↓
行(Row / 记录) ← 一条一条的数据
列(Column / 字段) ← 每个属性(如姓名、年龄)
4.1 用“学校”来记
| 层级 | 在学校里的对应 | 在 MySQL 里的叫法 |
|---|---|---|
| 最大 | 整个学校 | MySQL 服务器 |
| 第二层 | 某个系统(如教学) | 数据库 school_db |
| 第三层 | 学生名册、成绩单、课程表 | 表 students、scores、courses |
| 第四层 | 名册里的一行(一个学生) | 行(Row) |
| 第四层 | 名册上的“姓名”“学号” | 列(Column) |
下一节开始,我们逐层细讲:数据库 → 表 → 行与列。
5. 数据库(Database)详解
5.1 数据库是什么(再说细一点)
- 在 MySQL 里,数据库是表的上层容器。
- 一个 MySQL 服务器上可以有很多个数据库;每个数据库里有很多张表。
- 可以把一个数据库理解成:一个应用或一个业务模块的“命名空间”,里面的表都归这个“项目”用。
5.2 数据库的“名字”
- 每个数据库有一个名字,比如:
school、shop、blog。 - 命名建议:英文、小写、见名知意,例如:
school—— 学校相关user_system—— 用户系统order_db—— 订单库
5.3 系统自带的数据库(不要乱删)
安装好 MySQL 后,会有几个系统数据库,用来存 MySQL 自己的配置、用户、权限等:
| 数据库名 | 作用简述 |
|---|---|
mysql |
用户、权限等 |
information_schema |
库、表、列等元信息 |
performance_schema |
性能相关数据 |
sys |
系统视图、辅助诊断 |
新手只要知道:自己建的表要放在自己建的数据库里,不要往这几个系统库里乱写、乱删。
5.4 示例:创建一个“学校”数据库
在 MySQL 里执行:
CREATE DATABASE school DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
school:数据库名字。DEFAULT CHARACTER SET utf8mb4:默认用 utf8mb4 存字符(支持中文、emoji 等)。COLLATE utf8mb4_unicode_ci:排序和比较规则(ci表示不区分大小写)。
然后“进入”这个数据库,后面的建表、查询都会在这个库里进行:
USE school;
再查看当前有哪些数据库、当前用的是哪个:
SHOW DATABASES;
SELECT DATABASE();
概念小结:数据库 = 表的上层容器,有名字、有字符集,用 USE 数据库名 来“当前使用”它。
6. 表(Table)详解
6.1 表是什么
表就是我们在数据库里真正放数据的地方,可以理解为:
- 一张有表头的表格;
- 表头就是列名(字段名);
- 每一行就是一条记录(一条数据)。
和 Excel 对比:Excel 里的一张“工作表”就非常像数据库里的一张“表”。
6.2 表的结构由“列”决定
表在创建时要先定义好有哪些列,以及每列的名字和数据类型。
例如“学生表”可以事先定义:
- 学号(整数)
- 姓名(字符串)
- 性别(字符串或单个字符)
- 年龄(整数)
- 班级(字符串)
- 生日(日期)
之后往表里“插入”的每一行,都必须符合这些列:不能多出没定义的列,也不能在“整数列”里塞一段文字(类型要匹配)。
6.3 表的“名字”
- 每个表有一个表名,如:
students、scores、orders。 - 命名建议:英文、小写、复数形式表示“多行”的集合很常见,如
users、products。
6.4 示例:创建一张“学生”表
在已经 USE school; 的前提下执行:
CREATE TABLE students (
id INT, -- 学号
name VARCHAR(50), -- 姓名
gender CHAR(1), -- 性别
age INT, -- 年龄
class_name VARCHAR(20) -- 班级
);
CREATE TABLE students:创建一张名叫students的表。- 括号里每一行:列名 数据类型,用逗号隔开。
- 这样我们就定义好了这张表的“结构”:5 列,名字和类型都固定了。
查看表结构(不关心具体数据,只看“有哪些列、什么类型”):
DESC students;
概念小结:表 = 有固定列结构的数据容器,表名 + 列定义 = 表的结构。
7. 行与列(Row & Column)详解
7.1 列(Column / 字段)
- 列是表的一个属性/维度,比如“姓名”“年龄”“班级”。
- 在表里,列有:
- 列名:如
name、age; - 数据类型:如
VARCHAR(50)、INT; - 可选的约束:如“不能为空”“唯一”等(后面会提)。
- 列名:如
示例:students 表里的列有 id、name、gender、age、class_name。
每一行在这些列上都会有一个值(可以是空,如果允许 NULL 的话)。
7.2 行(Row / 记录)
- 行就是表里一条具体的数据。
- 一行里包含:在每一列上的一个值,合起来就描述“一个学生”“一个订单”等。
示例:给 students 插入几行:
INSERT INTO students (id, name, gender, age, class_name) VALUES
(1, '张三', '男', 18, '高一1班'),
(2, '李四', '女', 17, '高一2班'),
(3, '王五', '男', 18, '高一1班');
插入后,表在逻辑上可以想象成:
| id | name | gender | age | class_name |
|---|---|---|---|---|
| 1 | 张三 | 男 | 18 | 高一1班 |
| 2 | 李四 | 女 | 17 | 高一2班 |
| 3 | 王五 | 男 | 18 | 高一1班 |
这里每一行就是一条记录(一个学生);每一列就是一个字段(一个属性)。
7.3 “单元格”
- 某一行、某一列交叉的位置,就是一个单元格,存一个值。
- 例如:第 2 行、
name列 的单元格的值是'李四'。
7.4 行和列谁先存在?
- 先有列(表结构):建表时就把列定义好。
- 后有行(数据):通过
INSERT往表里一行一行(或批量)插入。 - 所以:列 = 结构;行 = 数据。
8. 主键与唯一性
8.1 为什么需要“唯一标识”
表里会有很多行,我们经常需要精确指出“哪一行”,例如:
“把学号为 3 的学生的年龄改成 19”。
如果有多行在“学号”上的值都一样,就不知道改哪一行了。所以通常我们会要求:有一列(或几列组合)能唯一确定一行。
8.2 主键(Primary Key)
- 主键就是:用来唯一标识表中每一行的列(或列的组合)。
- 主键必须满足:
- 不能重复:两行的主键值不能相同;
- 不能为 NULL:每一行在主键列上都要有一个值。
常见做法:单独加一列 id,类型为整数,并设为自增(插入时不写 id,数据库自动从 1、2、3…… 递增),用这个 id 当主键。
示例:带主键的学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增
name VARCHAR(50),
gender CHAR(1),
age INT,
class_name VARCHAR(20)
);
之后插入时可以省略 id:
INSERT INTO students (name, gender, age, class_name) VALUES
('张三', '男', 18, '高一1班'),
('李四', '女', 17, '高一2班');
-- id 会自动变成 1、2、……
概念小结:主键 = 唯一标识一行的列(或列组合),一般用自增整数 id。
8.3 唯一(UNIQUE)
- 唯一表示:这一列(或列组合)的值不能重复,但可以为 NULL(多行都是 NULL 是否允许要看数据库规则)。
- 和主键的区别:主键只能有一个,且不能为 NULL;唯一可以有多个列,常用于“登录名、邮箱、手机号”等业务上不能重复的字段。
示例:用户名不能重复
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE, -- 用户名不能重复
password VARCHAR(100)
);
9. 表与表之间的关系
9.1 为什么会有多张表
实际系统里,我们会把不同“实体”放在不同表里,例如:
- 学生 →
students - 成绩 →
scores(谁、哪门课、多少分) - 班级 →
classes(班级编号、名称、班主任)
这样结构清晰,也避免重复存很多相同信息(比如每个学生都写一遍“高一1班、班主任王老师”)。
9.2 “关系”靠什么建立
表与表之间通过共同的列建立关系,例如:
students表有id(学号)和class_id(班级编号);classes表有id(班级编号)、name(班级名);- 通过
class_id和classes.id就能把“学生”和“班级”连起来。
这种“通过一列引用另一张表的主键”的列,通常叫外键(Foreign Key)。
概念上你只要知道:关系 = 用一列的值去对应另一张表的主键。
9.3 常见关系类型(了解)
- 一对一:A 表一行 只 对应 B 表一行(如:用户 ↔ 用户详情)。
- 一对多:A 表一行 对应 B 表多行(如:一个班级 ↔ 多个学生)。
- 多对多:需要中间表(如:学生 ↔ 选课 ↔ 课程)。
示例:学生与成绩(一对多)
- 学生表:
id,name, … - 成绩表:
id,student_id,subject,score
这里student_id存的是学生的id,表示“这条成绩属于哪个学生”。
一个学生可以有多条成绩记录,所以是“一对多”。
10. 数据类型(概念入门)
10.1 为什么要规定类型
每一列在建表时都要指定数据类型,这样:
- 数据库知道这列存的是数字、文字还是日期;
- 能正确比较、排序、做运算;
- 能节省空间、避免错误(例如不能在“年龄”列里存一段文章)。
10.2 常见类型概览
| 类型 | 含义 | 典型用途 |
|---|---|---|
| INT / BIGINT | 整数 | 学号、数量、id |
| DECIMAL(M,D) | 精确小数 | 金额、分数 |
| VARCHAR(n) | 可变长文字 | 姓名、地址 |
| CHAR(n) | 定长文字 | 固定长度编码 |
| TEXT | 长文本 | 文章内容 |
| DATE | 日期 | 生日 |
| DATETIME | 日期+时间 | 注册时间 |
示例:
年龄用 INT,姓名用 VARCHAR(50),价格用 DECIMAL(10,2),生日用 DATE。
具体每种类型的长度、范围可以在后续学 SQL 时再细查,这里先建立“列都有类型”的概念即可。
11. SQL 与这些概念的关系
11.1 SQL 是什么
SQL(Structured Query Language) 是和数据库“对话”的语言。
我们通过 SQL 告诉数据库:建哪个库、建哪张表、插哪些行、查哪些行、改哪些行、删哪些行。
11.2 概念与 SQL 的对应关系
| 概念 | 常见 SQL 示例(仅作对应理解) |
|---|---|
| 数据库 | CREATE DATABASE school; USE school; |
| 表 | CREATE TABLE students (...); |
| 列 | 在 CREATE TABLE 里写列名和类型 |
| 行(增) | INSERT INTO students VALUES (...); |
| 行(查) | SELECT * FROM students; |
| 行(改) | UPDATE students SET age=19 WHERE id=1; |
| 行(删) | DELETE FROM students WHERE id=1; |
所以:你学的“数据库、表、行、列”等概念,都会在写 SQL 时用上。
12. 索引与约束(概念入门)
12.1 约束(Constraint)——规则
约束就是给表或列加的规则,用来保证数据合理、一致,例如:
- 主键(PRIMARY KEY):唯一、非空;
- 非空(NOT NULL):这一列必须有值;
- 唯一(UNIQUE):这一列不能重复;
- 默认(DEFAULT):不写时用默认值;
- 外键(FOREIGN KEY):值必须来自另一张表的某列(通常是主键)。
概念上:约束 = 对“能存什么数据”的限制。
12.2 索引(Index)——加速查找
- 索引相当于书的“目录”:不改变表里实际的数据,但能加快按某列(或几列)查询、排序的速度。
- 通常给经常出现在
WHERE、ORDER BY、GROUP BY里的列建索引。 - 主键一般会自动带索引。
概念上:索引 = 为了查得更快而建的“辅助结构”。
13. 用一张图串起所有概念
下面用“学校”的例子,把层级和关系串起来(文字版结构图):
MySQL 服务器
│
└── 数据库:school
│
├── 表:students(学生)
│ 列:id(主键), name, gender, age, class_name
│ 行:(1, 张三, 男, 18, 高一1班)、(2, 李四, 女, 17, 高一2班)…
│
├── 表:scores(成绩)
│ 列:id(主键), student_id(对应 students.id), subject, score
│ 行:(1, 1, 语文, 85)、(2, 1, 数学, 92)…
│
└── 表:classes(班级)
列:id(主键), name, teacher
行:(1, 高一1班, 王老师)…
- 数据库 = school,里面有多张表。
- 每张表有列(结构)和行(数据)。
- 主键(如
id)唯一标识一行;外键(如student_id)把表与表关系起来。 - 用 SQL 对这些库、表、行进行增删改查;用约束保证数据合法,用索引提高查询速度。
14. 常见疑问解答
Q1:数据库和表,先有谁?
先有数据库,再在数据库里建表。顺序:建库 → USE 库 → 建表 → 插数据。
Q2:一张表最多能有多少行、多少列?
理论上可以很多,实际受磁盘、性能、数据类型等限制。新手不必纠结上限,先理解“表有很多行、每行有很多列”即可。
Q3:列名、表名可以用中文吗?
可以,但不推荐。推荐英文(或拼音)命名,兼容性、可读性、编程里都更方便。
Q4:主键一定要叫 id 吗?
不必须。只要满足“唯一、非空”,可以用学号、订单号等当主键。但很多表习惯用自增 id 作为主键,简单通用。
Q5:一个数据库里表太多会不会乱?
可以通过命名规范区分,例如:user_info、order_detail、product_category。库也可以按业务拆成多个(如 user_db、order_db)。
Q6:“字段”和“列”是一个意思吗?
是的。列 = 字段 = Column;行 = 记录 = Row。不同资料用词不同,说的都是同一件事。
附录:核心概念速记表
| 概念 | 一句话理解 |
|---|---|
| 数据库 | 表的上层容器,一个“项目”的数据集合 |
| 表 | 有固定列结构的表格,存多行数据 |
| 列/字段 | 表的一个属性,有名字和数据类型 |
| 行/记录 | 表里的一条数据 |
| 主键 | 唯一标识一行的列,不重复、非空 |
| 外键 | 引用另一张表主键的列,用来建关系 |
| 约束 | 对数据合法性的规则 |
| 索引 | 加快按某列查询的辅助结构 |
| SQL | 操作数据库、表、行的语言 |
把上面这些概念搞熟之后,再去看建表语句、SELECT/INSERT/UPDATE/DELETE,就会觉得“每句话都是在操作哪一层、哪张表、哪一列”。建议你边看文档边在 MySQL 里建一个 school 库、students 表,插几条行,用 SELECT * FROM students; 看看,概念就会更扎实。祝学习顺利。