mysql数据库的核心概念

MySQL 数据库的核心概念完全指南

本文档专门讲解 MySQL 里最基础、最重要的概念,用生活化的比喻和大量示例帮你建立清晰的知识框架,适合零基础新手反复阅读。


目录

  1. 为什么要学“概念”
  2. 数据库是什么
  3. 关系型数据库与 MySQL
  4. 核心层级:从大到小
  5. 数据库(Database)详解
  6. 表(Table)详解
  7. 行与列(Row & Column)详解
  8. 主键与唯一性
  9. 表与表之间的关系
  10. 数据类型(概念入门)
  11. SQL 与这些概念的关系
  12. 索引与约束(概念入门)
  13. 用一张图串起所有概念
  14. 常见疑问解答

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
第三层 学生名册、成绩单、课程表 studentsscorescourses
第四层 名册里的一行(一个学生) 行(Row)
第四层 名册上的“姓名”“学号” 列(Column)

下一节开始,我们逐层细讲:数据库 → 表 → 行与列


5. 数据库(Database)详解

5.1 数据库是什么(再说细一点)

  • 在 MySQL 里,数据库表的上层容器
  • 一个 MySQL 服务器上可以有很多个数据库;每个数据库里有很多张表
  • 可以把一个数据库理解成:一个应用或一个业务模块的“命名空间”,里面的表都归这个“项目”用。

5.2 数据库的“名字”

  • 每个数据库有一个名字,比如:schoolshopblog
  • 命名建议:英文、小写、见名知意,例如:
    • 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 表的“名字”

  • 每个表有一个表名,如:studentsscoresorders
  • 命名建议:英文、小写、复数形式表示“多行”的集合很常见,如 usersproducts

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 / 字段)

  • 是表的一个属性/维度,比如“姓名”“年龄”“班级”。
  • 在表里,列有:
    • 列名:如 nameage
    • 数据类型:如 VARCHAR(50)INT
    • 可选的约束:如“不能为空”“唯一”等(后面会提)。

示例students 表里的列有 idnamegenderageclass_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_idclasses.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)——加速查找

  • 索引相当于书的“目录”:不改变表里实际的数据,但能加快按某列(或几列)查询、排序的速度
  • 通常给经常出现在 WHEREORDER BYGROUP 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_infoorder_detailproduct_category。库也可以按业务拆成多个(如 user_dborder_db)。

Q6:“字段”和“列”是一个意思吗?

是的。列 = 字段 = Column行 = 记录 = Row。不同资料用词不同,说的都是同一件事。


附录:核心概念速记表

概念 一句话理解
数据库 表的上层容器,一个“项目”的数据集合
有固定列结构的表格,存多行数据
列/字段 表的一个属性,有名字和数据类型
行/记录 表里的一条数据
主键 唯一标识一行的列,不重复、非空
外键 引用另一张表主键的列,用来建关系
约束 对数据合法性的规则
索引 加快按某列查询的辅助结构
SQL 操作数据库、表、行的语言

把上面这些概念搞熟之后,再去看建表语句、SELECT/INSERT/UPDATE/DELETE,就会觉得“每句话都是在操作哪一层、哪张表、哪一列”。建议你边看文档边在 MySQL 里建一个 school 库、students 表,插几条行,用 SELECT * FROM students; 看看,概念就会更扎实。祝学习顺利。

发表评论