一、先问一句:存数据用文件不行吗?
你可能会想:我把数据写进 data.txt,用的时候再用程序读出来,不就行了?
课件上直接给了四个"不行"的理由,我们一条条掰开讲。
1.1 文件的安全性问题
一个普通文件的权限是"谁登录了谁能看"。你没法精细控制到"张三能看工资,李四只能看姓名"。更麻烦的是:
- 程序崩溃时数据文件可能写了一半,直接坏掉;
- 两个人同时改同一个文件,后写的会把先写的覆盖掉(这叫并发问题);
- 有人误删就没了,没有"事务回滚"这种东西。
数据库怎么解决:账号密码 + 权限(grant/revoke)、事务、崩溃恢复、并发控制。这些都是文件没有的。
1.2 文件不利于数据查询和管理
假设 data.txt 里有 100 万行学生记录,你要找"所有山东理工大学的女生":
- 用文件:程序自己一行行读、一行行判断 → 慢,而且要写一堆代码;
- 用数据库:一句
SELECT * FROM student WHERE school='山东理工' AND gender='女';,毫秒级返回。
打个比方 :文件就像一麻袋写着字的纸条,数据库像一本带目录、带索引、带检索功能的账本。
1.3 文件不利于存储海量数据
文件系统能存很大,但你没法高效地按条件查。数据量一大,全表扫描一次要几分钟。
数据库有索引(书的目录),可以让"按学号找一个人"从"翻完一本书"变成"直接翻到第 37 页"。
1.4 文件在程序中控制不方便
同一个文件,你的 Python 程序、Java 后端、小程序各读各的,格式稍不一致就读错。而数据库是一个统一的中间层:谁连上来,看到的都是同一套数据、同一套规则。
二、数据库是什么
一句话:
数据库(Database)是为了更方便地管理数据,而设计出来的一套"专业存数据 + 专业管数据"的系统。
它存在哪?课件写了两个介质:
- 磁盘:断电不丢,这是主战场;
- 内存:快,但断电就没,通常用来做缓存(比如 Redis)。
课件里还有一句很实在的话:
数据库的水平是衡量一个程序员水平的重要指标。
因为写业务代码谁都会,但"这个表该怎么设计、索引该加在哪、为什么这个查询慢"------这些才是真功夫。
📌 本系列的统一比喻
把 MySQL 想成一栋写字楼:
- 写字楼 = 数据库服务器(跑着 MySQL 程序的那台机器)
- 楼里的公司 = 数据库 (一个项目一个库,比如
helloworld、mytest) - 公司里的表格 = 表 (
student、users) - 表格的列 = 字段 (
id、name、gender) - 表格的行 = 一条记录(张三那一行)
后面每一篇都用这个比喻,你会发现所有命令都能对上号。
三、市面上有哪几种数据库
课件列了六个,我们用"它是谁家的、适合干什么"来记:
| 数据库 | 出品方 | 特点 | 适合场景 |
|---|---|---|---|
| SQL Server | 微软 | 和 .NET 配合好(.Net 程序员的最爱) | 中大型项目、企业内部系统 |
| Oracle | 甲骨文 | 功能强、适合复杂业务逻辑;并发一般来说不如 MySQL | 大型项目、金融/电信 |
| MySQL | 甲骨文(原属 Sun) | 世界上最受欢迎的数据库,并发性好;不适合做复杂业务 | 电商、SNS、论坛,简单 SQL 处理效果好 |
| PostgreSQL | 加州大学伯克利分校 | 关系型;私用、商用、学术都能免费用、修改、分发 | 对数据严谨性要求高的项目 |
| SQLite | 开源 | 轻量 ,遵守 ACID;包含在一个相对小的 C 库里,设计目标是嵌入式,几百 K 内存就能跑 | 手机 App、桌面软件、小型工具 |
| H2 | 开源 | 用 Java 写的嵌入式数据库,本身只是一个类库,可以直接嵌进应用 | Java 单机应用、单元测试 |
怎么选? 一句话:
- 学校作业、小项目、要简单 → MySQL(本系列主角)
- 手机 App 里存点本地数据 → SQLite
- 银行、超大型系统 → Oracle / SQL Server
- Java 程序自带数据库 → H2
打个比方:MySQL 是"SUV",什么路都能开、油耗适中、修车铺到处都有;Oracle 是"重型卡车",拉得多但贵;SQLite 是"折叠自行车",揣包里就走。
四、装好之后:怎么连上去
4.1 安装(课件给了三条路,你选一条)
- CentOS 6.5 下编译安装 MySQL 5.6.14
- CentOS 7 通过
yum安装 MariaDB(MariaDB 是 MySQL 的分支,命令几乎一样) - Windows 下安装 MySQL 5.7
新手建议:Windows 装官方安装包,一路下一步,勾上 "Add to PATH"。装完打开
cmd就能用mysql命令。
4.2 连接服务器
打开命令行,输入:
mysql -h 127.0.0.1 -P 3306 -u root -p
回车后提示输入密码:
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.21-log MySQL Community Server (GPL)
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
看到 mysql> 就说明连上了,可以开始敲命令。
4.3 四个参数逐个拆
| 参数 | 含义 | 说明 |
|---|---|---|
-h 127.0.0.1 |
主机地址(host) | 不写默认连本地 |
-P 3306 |
端口号(Port) | 不写默认 3306 |
-u root |
用户名(user) | root 是超级管理员 |
-p |
提示输入密码 | 注意 -p 后面不要直接跟密码 (-p123456 也行,但会留在历史记录里,不安全) |
打个比方 :-h 是"去哪栋楼",-P 是"哪个门",-u 是"你是谁",-p 是"报口令"。
4.4 服务器管理(Windows)
课件的方法:Win + R → 输入 services.msc → 在服务列表里找到 MySQL → 右键可以停止 / 暂停 / 重启。
开发时经常要重启:改了配置、端口被占用、或者"莫名其妙连不上"的时候,先把服务重启一次。
五、服务器、数据库、表,到底谁套谁
课件这段话说得很清楚,我们翻译成人话:
所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库。一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
层级关系:
数据库服务器(一台机器 / 一个 MySQL 程序)
│
├── 数据库 A(比如:校园二手交易)
│ ├── 表 1:用户表 users
│ ├── 表 2:商品表 goods
│ └── 表 3:订单表 orders
│
└── 数据库 B(比如:失物招领)
├── 表 1:失物信息 lost_items
└── 表 2:留言 comments
为什么要分库? 就像一栋楼里为什么要有不同的公司:不同项目的表同名也不冲突 (你有一个 users,我也有一个 users,放在不同库里互不干扰)。
为什么要分表? 因为不同"实体"的数据,字段不一样。用户表关心姓名/手机号,商品表关心价格/库存,硬塞进一张表就乱套了。
六、动手:跑通第一条完整链路
课件给了一个完整案例,我们照着做一遍,并解释每一句在干什么。
6.1 创建数据库
create database helloworld;
意思是:开一家叫 helloworld 的公司 。 执行成功会提示
Query OK, 1 row affected。
6.2 使用数据库
use helloworld;
意思是:我现在走进这家公司,接下来操作的都是它的东西 。 如果不
use,后面建表会报错(不知道该建在哪个库里)。成功提示Database changed。
6.3 创建数据库表
create table student(
id int,
name varchar(32),
gender varchar(2)
);
意思是:在这家公司里挂一张叫 student 的表格,三列:
id:整数(学号)name:字符串,最多 32 个字符(姓名)gender:字符串,最多 2 个字符(性别,存"男"/"女"够用)
这里出现了两种数据类型 (下一层概念,04 篇细讲):int 是整数,varchar(32) 是"长度不固定的文字,最多 32 个字符"。
6.4 插入数据
insert into student (id, name, gender) values (1, '张三', '男');
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');
意思是:往表格里添三行 。格式是:
insert into 表名 (列1, 列2, 列3) values (值1, 值2, 值3);注意:文字要用单引号 包起来(
'张三'),数字不用。
6.5 查询数据
select * from student;
意思是:把 student 表的所有列、所有行都给我看 。
*代表"所有列"。
结果大概长这样:
+------+--------+--------+
| id | name | gender |
+------+--------+--------+
| 1 | 张三 | 男 |
| 2 | 李四 | 女 |
| 3 | 王五 | 男 |
+------+--------+--------+
3 rows in set (0.00 sec)
恭喜,你已经完成了数据库最核心的闭环:建库 → 进库 → 建表 → 写数据 → 读数据。后面三篇都是在这条链路上做扩展。
📌 关于"数据逻辑存储"
课件给了一张"数据逻辑存储"的示意图,想说的是:
从逻辑上看 ,数据是一层层的:库 → 表 → 行 → 列,就像套娃; 从物理上看 ,MySQL 最终会把它们变成磁盘上的一堆文件(比如 MyISAM 引擎下一个表就是三个文件,03 篇会讲)。
你写 SQL 时只面对逻辑结构,不用管磁盘怎么摆------这正是数据库替你干的活。
七、MySQL 的架构:为什么它在哪都能跑
MySQL 是一个可移植 的数据库,几乎能在当前所有的操作系统上运行:Unix/Linux、Windows、Mac、Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
翻译:同一套 MySQL,装在 Windows 和 Linux 上,用起来几乎没区别------你写的 SQL 拷过去照样能跑。
这对新手意味着什么?你现在在 Windows 上学的命令,以后放服务器上一样用。
八、SQL 的四大分类(背下来能省很多事)
SQL 不是一种语言,是一类语言,按用途分成四块:
| 分类 | 全称 | 干什么 | 代表指令 |
|---|---|---|---|
| DDL | Data Definition Language(数据定义语言) | 维护存储数据的结构(建库建表改表) | create、drop、alter |
| DML | Data Manipulation Language(数据操纵语言) | 对数据本身操作(增删改) | insert、delete、update |
| DQL | Data Query Language(数据查询语言) | 查数据(DML 里单独分出来的) | select |
| DCL | Data Control Language(数据控制语言) | 权限管理和事务 | grant、revoke、commit |
打个比方(继续用写字楼):
- DDL = 装修/改造:加隔断、改门牌、拆墙(改的是"房子本身")
- DML = 往柜子里放东西、拿东西、换东西(改的是"里面装的内容")
- DQL = 查"东西在哪一层哪个抽屉"(只看不动)
- DCL = 门禁卡管理:谁能进哪个房间、谁只能看不能碰
📌 记法:前三个是日常写代码最常用的,第四个是管理员/架构师用的。本系列四篇,主要在 DDL 打转(建库、建表、定类型),顺带用 DML/DQL 做演示。
九、存储引擎:数据库的"发动机"
9.1 什么是存储引擎
存储引擎是:数据库管理系统如何存储数据 、如何为存储的数据建立索引 、如何更新和查询数据等技术的实现方法。
人话版:同一张表,底下的"存法"可以不一样。
比如:
- 有的引擎把数据按插入顺序堆在一起(写入快,查起来慢);
- 有的引擎用 B+ 树组织(按主键查极快,还支持事务);
- 有的引擎把一张表拆成三个文件,各管结构、数据、索引。
9.2 MySQL 的核心:插件式存储引擎
MySQL 的核心就是插件式存储引擎,支持多种存储引擎。
"插件式"的意思是:换个引擎不用换数据库。就像同一辆车可以换不同发动机,油箱、方向盘、座椅都不用动。
show engines;
这条命令会列出你这份 MySQL 支持的所有引擎,以及当前默认是哪个(5.7 默认 InnoDB)。
9.3 最常听到的两个引擎
| 引擎 | 特点 | 适合 |
|---|---|---|
| InnoDB | 支持事务、支持外键、行级锁,现代项目默认用它 | 电商、金融、任何需要"要么全成功要么全失败"的场景 |
| MyISAM | 不支持事务,表级锁,查询快但写入会锁整张表;一个表对应三个文件 (.frm 结构 / .MYD 数据 / .MYI 索引) |
只读多、写入少的场景(日志、报表) |
📌 03 篇会现场演示:用 MyISAM 建一张表,去磁盘目录一看,真的多出三个文件。
十、本篇小结
- 文件存数据有四大硬伤:不安全、不好查、撑不住海量、程序里不好管;数据库就是来解决这些的。
- 数据库服务器(一栋楼) ⊃ 数据库(公司) ⊃ 表(表格) ⊃ 行/列。
- 连接:
mysql -h 主机 -P 端口 -u 用户 -p,-h/-P不写就默认本地和 3306。 - 最小闭环:
create database→use→create table→insert→select。 - SQL 分四类:DDL 改结构、DML 改数据、DQL 查数据、DCL 管权限。
- 存储引擎是"存法",MySQL 是插件式的,默认 InnoDB,入门最常对比的是 MyISAM。