文章目录
- [1. 数据库和MySQL](#1. 数据库和MySQL)
- [2. 库的基本操作](#2. 库的基本操作)
- [3. 表的基本操作](#3. 表的基本操作)
1. 数据库和MySQL
数据库
数据库本质是一个长期保存业务数据的系统
后端服务里会产生这些数据:
- 用户注册信息
- 用户登录记录
- 商品订单
- 支付记录
- AI 聊天历史
- AI 调用日志
- 用户余额
- 模型调用 token 消耗
- 文件上传记录
这些数据不能放到内存里,因为:
- 程序重启,内存会丢
- 多台服务器之间不能共享本地内存
- 数据需要长期保存
- 数据需要被高效查询、修改、统计
- 数据需要保证一致性和可靠性
数据库就做到了后端系统的持久化保存
MySQL
而MySQL是一种具体的数据库管理系统 ,是一个服务端程序

-
mysqld是数据库的服务端
-
mysql是数据库的客户端
-
mysql是一种典型的客户端/服务端架构,提供了一套数据存储服务的网络服务

再通俗讲,MySQL管理数据库,数据库存东西:

表
表时数据库中组织数据的基本单元,可以把一张表想象成一个struct结构体,例如:
| id | username | age | created_at | |
|---|---|---|---|---|
| 1 | kunkun | kunkun@example.com | 20 | 2026-05-07 10:00:00 |
| 2 | gege | gege@example.com | 22 | 2026-05-07 10:05:00 |
行
一行就是一条具体的业务数据,对应着一个业务对象

这一行表示一个用户的所有详细信息
列
列表示这类业务对象的某个具体属性,也叫字段
比如用户有这些属性:
id:用户 IDusername:用户名email:邮箱age:年龄created_at:注册时间
2. 库的基本操作
数据库 database可以理解为一个业务项目的数据容器,里面可以有多张表

还是这张图
比如:
txt
MySQL 服务
└── ai_backend 数据库
├── users 表
├── conversations 表
├── messages 表
└── model_call_logs 表
可以对照到Linux的文件系统
text
/home/vect/ai_backend/
users
conversations
messages
查看所有数据库
sql
show databases; # 类似ls命令
创建数据库
sql
create database if not exists 数据库名 [选项];
如果不存在这个数据库就创建
字符集和编码集
- 数据库编码集:数据库未来存储数据的编码格式
- 数据库校验集:数据库读取时采用的编码格式
要保证操作时用的同一个编码格式
一般都是使用:
sql
create database if not exists ai_backend
default character set utf8mb4
default collate utf8mb4_unicode_ci;
使用数据库
sql
use 数据库名;
接下来就对这个数据库进行操作
查看当前正在使用哪个数据库
sql
select database();
删除数据库
sql
drop database if exists 数据库名;
注意:这是相当于rm -rf 目录,整个路径下的数据全部清空,一般不要删库
备份和恢复数据库
备份:
sql
mysqldump -P3306 -u root -p 密码 -B 数据库名1 数据库名2... > 新的路径
直接把所有有效操作的命令备份了!
只备份一个库里的几个表:
sql
mysqldump -P3306 -u root -p 密码 -B 数据库名 表一 表二... > 新的路径
还原:
sql
source 备份的文件.sql
如果在备份时,没有-B的选项,恢复数据库时,要先创建空的数据库,然后使用这个数据库,再使用source还原
库操作小结
| 需求 | SQL |
|---|---|
| 查看所有库 | show databases; |
| 创建库 | create database if not exists 库名; |
| 使用库 | use 库名; |
| 查看当前库 | select database(); |
| 删除库 | drop database if exists 库名; |
3. 表的基本操作
表是数据库里真正存业务数据的地方,建表就是把业务对象翻译成数据库结构,这也是面向对象的思想:
cpp
class User{
long long _id;
std::string _name;
std::string _email;
std::string _password;
}
sql
create table users (
id bigint primary key auto_increment,
username varchar(50),
email varchar(100),
password varchar(255)
);
唯一的区别就是class类是内存中的结构,table表是磁盘上的持久化数据集合
查看当前数据库下的所有表
sql
show tables;
创建表
sql
create table if not exists 表名 (
字段名 数据类型 约束,
字段名 数据类型 约束,
字段名 数据类型 约束
);
查看表结构
sql
desc 表名;
查看建表语句
sql
show create table 表名;
删除表
sql
drop table if exists 表名;
drop是彻底删除整张表,结构和数据全没了
而
sql
delete from 表名;
只是删除数据,表结构还在
修改表结构
添加字段
sql
alter table users
add 新字段名 类型 约束;
修改字段类型
sql
alter table 表名
modify 要修改的字段 新的类型;
修改字段名
sql
alter table 表名
change 旧字段名 新字段名 新类型 新约束;
删除字段
sql
alter table 表名
drop column 字段名;
删除字段会丢失这个字段里的所有数据
修改表名
sql
rename table 旧表名 to 新表名;
或者:
sql
alter table 旧表名 to 新表名;
done~