MySQL 数据库基础操作知识点整理

一、数据库的创建

1. 语法格式

sql 复制代码
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name

2. 参数说明

  • 大写单词为 SQL 关键字,实际编写不强制大小写,但规范建议大写
  • [] 表示可选项,编写时可省略
  • IF NOT EXISTS:仅当数据库不存在时执行创建,若已存在则不执行、不报错
  • CHARACTER SET / CHARSET:指定数据库的字符集,决定数据的存储编码格式
  • COLLATE:指定字符集的校验规则,决定数据比较、排序、查询时的编码比对规则

3. 创建案例

创建名为 db1 的数据库,使用默认字符集和校验规则:

sql 复制代码
CREATE DATABASE db1;

执行结果:

sql 复制代码
Query OK, 1 row affected (0.01 sec)

未指定时,MySQL 默认字符集为 utf8,默认校验规则为 utf8_general_ci。

创建使用 utf8 字符集的 db2 数据库:

sql 复制代码
CREATE DATABASE db2 CHARSET=utf8;

执行结果:

sql 复制代码
Query OK, 1 row affected (0.00 sec)

创建使用 utf8 字符集、utf8_general_ci 校验规则的 db3 数据库:

sql 复制代码
CREATE DATABASE db3 CHARSET=utf8 COLLATE utf8_general_ci;

执行结果:

sql 复制代码
Query OK, 1 row affected (0.01 sec)

创建完数据库后,可以通过 SHOW DATABASES; 查看当前已创建的所有数据库:

sql 复制代码
SHOW DATABASES;

执行结果:

sql 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

创建好的数据库会在 MySQL 配置文件指定的数据目录下新建同名目录文件,一个数据库对应 Linux 下的一个目录文件,默认路径为 /var/lib/mysql。删除数据库本质上就是删除该目录,因此尽量不使用 Linux 的 mkdirrmdir 指令来操作数据库目录,应始终通过 SQL 语句完成。

4. 底层存储原理

在 Linux 系统中,MySQL 数据库本质对应文件系统中的一个目录,默认存储路径为 /var/lib/mysql。创建数据库等价于在该路径下新建同名目录,目录内会生成一个 .opt 文件,用于记录该数据库的字符集和校验规则配置。不建议直接通过 Linux 命令创建 / 删除数据库目录,应通过 SQL 语句操作。

二、字符集与校验规则

1. 核心概念

创建数据库的时候,有两套配套的编码规则,必须一一对应:

  • 数据库字符集:定义数据存储时的编码格式,决定支持哪些语言文字
  • 数据库校验集:定义数据查询、比较、排序时的读取和比对规则

所有数据库操作都必须保证编码格式一致,否则会出现乱码或比对异常。数据库内的数据表会默认继承数据库的字符集和校验规则,无需重复设置。

2. 常用查看命令

查看当前数据库的默认字符集:

sql 复制代码
SHOW VARIABLES LIKE 'character_set_database';

查看当前数据库的默认校验规则:

sql 复制代码
SHOW VARIABLES LIKE 'collation_database';

查看 MySQL 支持的所有字符集:

sql 复制代码
SHOW CHARSET;

查看 MySQL 支持的所有字符集校验规则:

sql 复制代码
SHOW COLLATION;

3. 校验规则的实际影响

以 utf8 字符集的两种常见校验规则为例:

  • utf8_general_ci:不区分大小写(ci = case insensitive)
  • utf8_bin:区分大小写(bin = binary,按二进制值精确比对)

案例对比查询结果差异

  • 不区分大小写(utf8_general_ci):查询 name='a' 会同时返回 a 和 A
  • 区分大小写(utf8_bin):查询 name='a' 仅返回 a

排序结果差异

  • 不区分大小写排序:a, A, b, B(同字母大小写排在一起)
  • 区分大小写排序:A, B, a, b(按 ASCII 码值排序,大写字母码值更小)

三、数据库的管理操作

1. 查看所有数据库

sql 复制代码
SHOW DATABASES;

执行结果:

sql 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

2. 查看数据库的创建语句

注意:不是创建数据库,而是展示创建数据库时候的命令。

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

示例:

sql 复制代码
SHOW CREATE DATABASE db1;

执行结果:

sql 复制代码
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */     |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

补充:查看当前所在的数据库

sql 复制代码
SELECT DATABASE();

执行结果:

sql 复制代码
+------------+
| DATABASE() |
+------------+
| db1        |
+------------+
1 row in set (0.00 sec)

结果说明

  • 数据库名两侧的反引号 `````:用于规避数据库名与 SQL 关键字冲突
  • /*!40100 ... */:不是普通注释,是 MySQL 版本条件语法 ------ 当 MySQL 版本高于 4.01 时,才执行内部的语句,类似编程语言的条件编译。

3. 修改数据库

语法格式:

sql 复制代码
ALTER DATABASE db_name
[alter_specification [, alter_specification] ...]
alter_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name

修改操作仅支持修改数据库的字符集和校验规则,无法修改数据库名。

示例:将 mytest 数据库字符集改为 gbk

sql 复制代码
ALTER DATABASE mytest CHARSET=gbk;

执行结果:

sql 复制代码
Query OK, 1 row affected (0.00 sec)

验证修改结果:

sql 复制代码
SHOW CREATE DATABASE mytest;

执行结果:

sql 复制代码
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| mytest   | CREATE DATABASE `mytest` /*!40100 DEFAULT CHARACTER SET gbk */   |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

4. 删除数据库

语法格式:

sql 复制代码
DROP DATABASE [IF EXISTS] db_name;

示例:

sql 复制代码
DROP DATABASE db3;

执行结果:

sql 复制代码
Query OK, 0 rows affected (0.01 sec)

验证删除结果:

sql 复制代码
SHOW DATABASES;

执行结果:

sql 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
  • IF EXISTS:仅当数据库存在时执行删除,不存在则不报错
  • 删除效果:数据库从 MySQL 中消失,对应磁盘目录被级联删除,库内所有表和数据一并删除,操作不可逆,需谨慎使用

四、数据库备份与恢复

1. 逻辑备份(mysqldump 工具)

mysqldump 是 MySQL 自带的客户端工具,必须在操作系统终端(Shell/CMD)执行,不能在 MySQL 命令行内运行。这个命令在我们下载 MySQL 的时候就安装好了的。备份本质是导出所有建库、建表、插入数据的 SQL 语句,保存为 .sql 文件。注意:这个备份不止备份了数据库里面的数据,还备份了我们以往对该数据库的有效操作,一起备份形成了一个 .sql 文件,在进行恢复的时候就把这个 .sql 文件里面记录的操作再执行一遍。

常用备份场景

备份单个完整数据库(带 -B 参数):

bash 复制代码
mysqldump -P3306 -u root -p密码 -B 数据库名 > 备份文件路径.sql

示例:

bash 复制代码
mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql

执行结果(终端无额外输出,备份文件已生成):

bash 复制代码
# 查看备份文件内容(部分)
D:\> type D:/mytest.sql | head -20
-- MySQL dump 10.13  Distrib 8.0.33, for Win64 (x86_64)
--
-- Host: localhost    Database: mytest
-- ------------------------------------------------------
-- Server version	8.0.33
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
/!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
/!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
/!50503 SET NAMES utf8mb4 /;
/!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;
/!40103 SET TIME_ZONE='+00:00' /;
/!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;
/!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;
/!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' /;
/!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

备份数据库中的指定表:

bash 复制代码
mysqldump -u root -p密码 数据库名 表名1 表名2 > 备份文件路径.sql

同时备份多个数据库:

bash 复制代码
mysqldump -u root -p密码 -B 数据库名1 数据库名2 > 备份文件路径.sql

-B 参数的区别

  • 带 -B:备份文件中包含 CREATE DATABASE 语句,恢复时无需提前建库
  • 不带 -B:备份文件不含建库语句,恢复前必须先手动创建空数据库并切换到该库

2. 数据恢复

在 MySQL 命令行中执行:

sql 复制代码
SOURCE 备份文件的绝对路径;

示例:

sql 复制代码
SOURCE D:/mytest.sql;

执行结果:

sql 复制代码
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
...
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
...
恢复完成后,查看数据库确认
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mytest             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

恢复本质是依次执行备份文件中的所有 SQL 语句,重建库、表和数据。

3. 物理备份方式

由于数据库本质是磁盘目录,也可以直接拷贝数据库目录到目标路径完成备份 / 恢复,属于物理层面的备份。生产环境更推荐使用 mysqldump 等逻辑备份方式,兼容性和可控性更强。

五、查看数据库连接状态

sql 复制代码
SHOW PROCESSLIST;

执行结果:

sql 复制代码
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time  | State                  | Info             |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
|  5 | root            | localhost | db1  | Query   |     0 | init                   | SHOW PROCESSLIST |
|  6 | event_scheduler | localhost | NULL | Daemon  | 12345 | Waiting on empty queue | NULL             |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
2 rows in set (0.00 sec)

该命令可以查看当前所有连接到 MySQL 的客户端信息,包括连接 ID、用户名、客户端地址、正在执行的命令、运行时长等。可用于:

  • 排查异常连接,判断数据库是否被非法访问
  • 数据库性能变慢时,可通过该命令查看是否有长耗时的异常连接占用资源
相关推荐
IvorySQL9 小时前
PG 日报|新增 VACUUM 全维度统计信息补丁迭代
数据库·人工智能·postgresql·ivorysql
白露与泡影11 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
赵渝强老师12 小时前
【赵渝强老师】使用Oracle可传输的表空间迁移数据
数据库·oracle
IpdataCloud13 小时前
跨区服玩家延迟高怎么办?用IP离线库自动分配到最近服务器
数据库·tcp/ip·github·php·ip
wuqingshun31415914 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖15 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
蓝胖子酱16 小时前
在 Electron 中用 electron-store 实现加密存储与自定义格式文件
前端·javascript·数据库
snow@li17 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Devlive 开源社区17 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql