MySQL 数据库 & 数据表基础操作总结

一、前言

MySQL 是主流关系型数据库,日常开发、运维最基础的操作就是**数据库(库) 数据表(表)**的增删改查。本文分为两大模块:数据库操作数据表操作,包含完整语法、场景案例、字符集/校验规则、备份恢复、存储引擎、易错点总结。


第一部分:MySQL 数据库(库)操作

1.1 创建数据库

1.1.1 标准语法

sql 复制代码
CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT CHARACTER SET 字符集]
[DEFAULT COLLATE 校验规则];

语法解析

  1. [IF NOT EXISTS]可选,判断数据库不存在才创建,避免重复创建报错(生产必加)。
  2. CHARACTER SET:指定数据库字符集,决定数据库支持的文字(中文、英文、特殊符号等)。
  3. COLLATE:指定字符集校验规则,控制字符串比较、排序是否区分大小写。
  4. [] 代表可选参数,MySQL 关键字建议大写,增强可读性。

1.1.2 实战案例(经典示例)

案例1:最简单创建数据库(使用系统默认配置)
sql 复制代码
-- 创建数据库 test_db,使用MySQL默认字符集、校验规则
CREATE DATABASE test_db;

MySQL 5.7 默认字符集:utf8;MySQL 8.0 默认字符集:utf8mb4(推荐生产使用,支持emoji)。

案例2:指定字符集创建数据库
sql 复制代码
-- 创建数据库 db_utf8,指定字符集为 utf8
CREATE DATABASE db_utf8 DEFAULT CHARACTER SET utf8;
案例3:同时指定字符集 + 校验规则
sql 复制代码
-- 字符集utf8,校验规则utf8_general_ci(不区分大小写)
CREATE DATABASE db_ci DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 字符集utf8,校验规则utf8_bin(区分大小写)
CREATE DATABASE db_bin DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

1.2 字符集 & 校验规则 深度解析

1.2.1 常用查询指令

sql 复制代码
-- 查看当前数据库默认字符集
SHOW VARIABLES LIKE 'character_set_database';

-- 查看当前数据库默认校验规则
SHOW VARIABLES LIKE 'collation_database';

-- 查看MySQL所有支持的字符集
SHOW CHARSET;

-- 查看MySQL所有支持的校验规则
SHOW COLLATION;

1.2.2 两大核心校验规则对比(重点)

校验规则直接影响查询、排序结果,是高频易错点。

校验规则 特点 场景
utf8_general_ci 不区分大小写 用户名、普通文本查询(最常用)
utf8_bin 二进制比较,区分大小写 验证码、账号密码、敏感字符串

1.2.3 案例演示:大小写区分效果

步骤1:分别创建两个不同校验规则的库
sql 复制代码
-- 库1:不区分大小写
CREATE DATABASE db_ci COLLATE utf8_general_ci;
USE db_ci;
CREATE TABLE user(name VARCHAR(20));
INSERT INTO user VALUES ('a'),('A'),('b'),('B');

-- 库2:区分大小写
CREATE DATABASE db_bin COLLATE utf8_bin;
USE db_bin;
CREATE TABLE user(name VARCHAR(20));
INSERT INTO user VALUES ('a'),('A'),('b'),('B');
步骤2:查询测试
sql 复制代码
-- 切换到不区分大小写库,查询 name='a'
USE db_ci;
SELECT * FROM user WHERE name = 'a';
-- 结果:同时查出 a 和 A

-- 切换到区分大小写库,查询 name='a'
USE db_bin;
SELECT * FROM user WHERE name = 'a';
-- 结果:仅查出小写 a
步骤3:排序测试
sql 复制代码
-- 不区分大小写排序:a、A、b、B 混排
USE db_ci;
SELECT * FROM user ORDER BY name;

-- 区分大小写排序:先大写字母,后小写字母
USE db_bin;
SELECT * FROM user ORDER BY name;

📌 易错点:团队协作、项目迁移时,库/表校验规则不一致会导致查询结果异常,统一规范很重要。

1.3 查看数据库

1.3.1 查看所有数据库

sql 复制代码
SHOW DATABASES;

1.3.2 查看数据库创建语句(查看字符集、校验规则)

sql 复制代码
SHOW CREATE DATABASE 数据库名;

-- 示例
SHOW CREATE DATABASE db_utf8;
结果解析
  1. 数据库名外层 ````` 反引号:用于区分数据库名和MySQL关键字,如果库名是关键字必须加。
  2. /*!40100 ... */:不是普通注释,代表MySQL版本大于4.01时执行内部语句

1.4 修改数据库

仅支持修改字符集校验规则,无法修改数据库名(低版本MySQL不支持直接改名)。

1.4.1 语法

sql 复制代码
ALTER DATABASE 数据库名
[DEFAULT CHARACTER SET 新字符集]
[DEFAULT COLLATE 新校验规则];

1.4.2 实战案例

sql 复制代码
-- 将 db_utf8 字符集修改为 gbk
ALTER DATABASE db_utf8 DEFAULT CHARACTER SET gbk;

-- 同时修改字符集+校验规则
ALTER DATABASE db_ci DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

📌 补充知识点:修改数据库字符集不会同步修改已有数据表,已有表需要单独修改。

1.5 删除数据库

1.5.1 语法

sql 复制代码
DROP DATABASE [IF EXISTS] 数据库名;
  • IF EXISTS:数据库存在才删除,避免不存在时报错。

1.5.2 案例 & 风险提示

sql 复制代码
-- 安全删除数据库(推荐)
DROP DATABASE IF EXISTS test_db;

⚠️ 高危操作

  1. 删除数据库会级联删除库内所有数据表、数据、索引,无法恢复(无备份前提下)。
  2. 生产环境严禁随意执行 DROP DATABASE,删除前务必备份。

1.6 数据库备份与恢复(运维必备)

备份恢复使用 mysqldump 工具,在系统命令行执行(不是MySQL客户端内)。

1.6.1 整库备份

语法
bash 复制代码
mysqldump -u用户名 -p密码 -B 数据库名 > 备份文件路径.sql
示例
bash 复制代码
# 备份 db_utf8 库到 D 盘
mysqldump -uroot -p123456 -B db_utf8 > D:/mysql_backup/db_utf8.sql
  • -B:代表备份整个数据库,恢复时无需手动建库。

1.6.2 单表/多表备份

bash 复制代码
# 仅备份库中某几张表(不加 -B)
mysqldump -uroot -p123456 数据库名 表名1 表名2 > 备份路径.sql

1.6.3 多库同时备份

bash 复制代码
# 一次性备份多个数据库
mysqldump -uroot -p123456 -B 库1 库2 库3 > D:/all_db.sql

1.6.4 数据恢复(MySQL客户端内执行)

sql 复制代码
-- 导入sql文件完成恢复
SOURCE D:/mysql_backup/db_utf8.sql;

1.6.5 备份易错点总结

  1. 不带 -B 备份的文件:恢复前必须手动创建空数据库 ,并进入该库再执行 source
  2. 路径不要包含中文、空格,否则恢复失败。
  3. 大数据库建议分表备份,避免单文件过大。

1.7 查看MySQL连接状态

排查数据库卡顿、非法连接常用指令:

sql 复制代码
SHOW PROCESSLIST;

字段说明

  • Id:连接ID
  • User:登录用户
  • Host:客户端地址
  • db:当前操作的数据库
  • Command:执行的操作(Sleep=空闲连接,Query=正在执行SQL)

用途:发现陌生IP、陌生用户连接,说明数据库可能被入侵;连接数过多会导致数据库卡顿。


第二部分:MySQL 数据表(表)操作

数据表隶属于数据库,操作表前必须先进入对应数据库

sql 复制代码
USE 数据库名;

2.1 创建数据表

2.1.1 标准语法

sql 复制代码
CREATE TABLE 表名 (
    字段名1 数据类型 [字段约束/注释],
    字段名2 数据类型 [字段约束/注释],
    ...
)
[DEFAULT CHARACTER SET 字符集]
[COLLATE 校验规则]
[ENGINE 存储引擎]
[COMMENT '表注释'];

语法解析

  1. 字段:列名 + 数据类型(必填)。
  2. COMMENT:字段/表注释,提升可读性(开发规范必加)。
  3. 字符集/校验规则:不指定则继承所在数据库配置
  4. ENGINE:指定表的存储引擎(MySQL核心,下文详解)。

2.1.2 经典实战案例

创建一张用户信息表,包含常用字段、注释、存储引擎:

sql 复制代码
-- 先进入数据库
USE db_utf8;

-- 创建用户表 user_info
CREATE TABLE user_info (
    id INT COMMENT '用户ID,整型',
    username VARCHAR(30) COMMENT '用户名',
    password CHAR(32) COMMENT '密码,MD5加密后32位',
    age TINYINT COMMENT '年龄',
    create_time DATE COMMENT '账号创建日期'
)
ENGINE = InnoDB
DEFAULT CHARACTER SET utf8
COMMENT = '系统用户信息表';

2.2 存储引擎简介(重点)

MySQL 主流两大存储引擎:InnoDBMyISAM,创建表时通过 ENGINE 指定。

2.2.1 文件存储区别

数据表会在 MySQL 数据目录生成对应文件:

  1. MyISAM (老版本默认)
    • xxx.frm:表结构文件
    • xxx.MYD:数据文件
    • xxx.MYI:索引文件
  2. InnoDB (MySQL5.5+ 默认,生产首选)
    • xxx.frm:表结构文件
    • xxx.ibd:数据+索引合并文件

2.2.2 引擎对比 & 选型

存储引擎 事务支持 行锁/表锁 外键 适用场景
InnoDB ✅ 支持事务 行锁 ✅ 支持外键 电商、后台系统、需要事务的业务(生产首选
MyISAM ❌ 不支持事务 表锁 ❌ 不支持外键 纯查询、静态数据、日志表(读写少)

2.3 查看表结构

2.3.1 精简查看(常用)

sql 复制代码
DESC 表名;
-- 等价写法
DESCRIBE 表名;

2.3.2 字段含义说明

执行 DESC user_info 后展示字段:

  1. Field:字段名
  2. Type:字段数据类型
  3. Null:是否允许为空(YES/NO)
  4. Key:索引类型
  5. Default:字段默认值
  6. Extra:额外属性(自增、备注等)

2.3.3 查看完整建表语句

sql 复制代码
SHOW CREATE TABLE 表名;

2.4 修改数据表结构(高频操作)

实际开发中经常新增字段、修改字段、删除字段、重命名表/字段,统一使用 ALTER TABLE

2.4.1 新增字段 ADD

语法:ALTER TABLE 表名 ADD 字段名 数据类型 [注释] [位置];

  • 位置:AFTER 已有字段(指定在某个字段后),默认追加到最后。
sql 复制代码
-- 给 user_info 新增 头像路径 字段,放在 create_time 后面
ALTER TABLE user_info 
ADD avatar VARCHAR(100) COMMENT '头像文件路径' AFTER create_time;

2.4.2 修改字段类型/约束 MODIFY

只修改字段类型、长度、是否为空,不修改字段名。

sql 复制代码
-- 将 username 字段长度从30修改为50
ALTER TABLE user_info MODIFY username VARCHAR(50) COMMENT '用户名';

⚠️ MODIFY 会完全覆盖字段的旧定义(包括 NULL/NOT NULL、DEFAULT、COMMENT 等),必须在新语句中重新声明所有需要的属性。

2.4.3 修改字段名 + 类型 CHANGE

必须同时写新字段名 + 完整数据类型

sql 复制代码
-- 将 username 改名为 nick_name,类型保持不变
ALTER TABLE user_info CHANGE username nick_name VARCHAR(50) COMMENT '昵称';

2.4.4 删除字段 DROP

⚠️ 高危操作:删除字段会清空该列所有数据,谨慎使用!

sql 复制代码
-- 删除 age 字段
ALTER TABLE user_info DROP COLUMN age;

2.4.5 修改表名 RENAME

sql 复制代码
-- 将 user_info 重命名为 sys_user
ALTER TABLE user_info RENAME TO sys_user;
-- TO 可以省略,等价写法
ALTER TABLE sys_user RENAME user_info;
RENAME TABLE user_info TO sys_user;

2.5 删除数据表

2.5.1 语法

sql 复制代码
-- 安全删除(推荐,表不存在不报错)
DROP TABLE [IF EXISTS] 表名1, 表名2;

-- 直接删除
DROP TABLE 表名;

2.5.2 示例 & 注意事项

sql 复制代码
-- 单表删除
DROP TABLE IF EXISTS user_info;

-- 一次性删除多张表
DROP TABLE IF EXISTS table_a, table_b;

⚠️ 易错点:删除表 = 清空表结构 + 所有数据,删除前务必确认、备份。


三、整体易错点 & 开发规范总结

3.1 数据库操作规范

  1. 建库统一加上 IF NOT EXISTS,删库统一加上 IF EXISTS,避免批量脚本报错。
  2. 生产环境优先使用 utf8mb4 字符集(支持emoji、全量中文)。
  3. 校验规则业务统一:通用业务用 utf8_general_ci,密码/验证码用 utf8_bin
  4. 禁止线上直接执行 DROP DATABASE,删除前必须备份。

3.2 数据表操作规范

  1. 所有字段、表必须加 COMMENT 注释,方便后期维护。
  2. 生产表默认使用 InnoDB 存储引擎。
  3. 修改/删除字段前,先在测试环境验证,避免线上数据丢失。
  4. 操作表前务必执行 USE 数据库名;,防止操作错库。

3.3 备份恢复规范

  1. 重要数据库定时自动备份,保留多份历史备份文件。
  2. 备份文件名带上时间,例如 db_20260610.sql
  3. 跨版本迁移数据库,优先使用 mysqldump 方式迁移。

四、附录:常用指令速查表

功能 SQL 指令
创建库 CREATE DATABASE 库名 CHARSET utf8;
查看所有库 SHOW DATABASES;
进入库 USE 库名;
修改库字符集 ALTER DATABASE 库名 CHARSET gbk;
删除库 DROP DATABASE IF EXISTS 库名;
创建表 CREATE TABLE 表名(...);
查看表结构 DESC 表名;
新增字段 ALTER TABLE 表名 ADD 字段 类型;
删除字段 ALTER TABLE 表名 DROP 字段;
删除表 DROP TABLE IF EXISTS 表名;
查看连接 SHOW PROCESSLIST;
相关推荐
倔强的石头1061 小时前
《Kingbase护城河》——数据库卡顿急救手册:会话状态深度解析与“僵尸进程”排查实战
数据库
焦虑的说说2 小时前
mysql为什么回表会慢
mysql·面试
程序边界2 小时前
KES Plus深度体验:当数据库开始“越界“做开发平台
数据库
Amnesia0_02 小时前
MYSQL索引
数据库·mysql
一只fish2 小时前
DB-Engines Ranking 2026年6月数据库排行
数据库
Tipriest_2 小时前
没有nvidia的卡上装sogou拼音的特殊处理
运维·服务器·mysql
啾啾Fun2 小时前
【向量数据库】Milvus:为大规模、高性能而生的企业级向量数据库
数据库·milvus
骑士雄师2 小时前
18.2 PostgreSQL 的安装
数据库·postgresql
海南java第二人11 小时前
Nebula Graph 实战:基于图数据库存储 CMDB 实体关系
数据库·图数据库·nebula