MySQL:数据库基础

一、先问一句:存数据用文件不行吗?

你可能会想:我把数据写进 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。
相关推荐
内存漫游1 小时前
Undo、Redo 与事务回滚
数据库
FluxDB1 小时前
用 Rust + GPUI 重做数据库客户端
数据库·mysql
烬羽1 小时前
PostgreSQL:AI 时代原生的"隐型"向量数据库 — 用 pgvector 给消息表加上长期记忆
数据库·人工智能·程序员
Yyyyyy~1 小时前
【Mysql】增删查改操作
数据库·mysql
钱栈up2 小时前
前端改了三页、后端也动了,用户说「完全没变化」——我在 116 库上找到的三个真凶
css·数据库
BBmmo2 小时前
MySQL 里大小写不同的邮箱,为什么会撞上唯一索引?
mysql
这个DBA有点耶2 小时前
索引建了查询却更慢——优化器选错索引与Index Merge的隐藏代价
数据库·架构·代码规范
云贝贝贝2 小时前
删了却没变小:PostgreSQL 死元组与表膨胀排查
数据库·postgresql
依晨照旧2 小时前
Langfuse 打爆两台机器:一条分位数 SQL,在 400G 表上扫了 8 分钟
数据库