目录
[1.1 创建数据库](#1.1 创建数据库)
[1.2 数据库字符集和校验集](#1.2 数据库字符集和校验集)
[1.2.1 查看 MySQL 支持的字符集和校验集](#1.2.1 查看 MySQL 支持的字符集和校验集)
[1.3 删除数据库](#1.3 删除数据库)
[1.4 查看数据库](#1.4 查看数据库)
[1.4.1 查看当前 MySQL Server 有哪些数据库](#1.4.1 查看当前 MySQL Server 有哪些数据库)
[1.4.2 查看数据库的字符集和校验集](#1.4.2 查看数据库的字符集和校验集)
[1.4.3 切换/选择数据库:](#1.4.3 切换/选择数据库:)
[1.4.4 查看当前所处的数据库:](#1.4.4 查看当前所处的数据库:)
[1.5 修改数据库](#1.5 修改数据库)
[1.6 数据库的备份和恢复](#1.6 数据库的备份和恢复)
[1.7 查看数据库的连接情况](#1.7 查看数据库的连接情况)
[2.1 创建数据表](#2.1 创建数据表)
[2.2 删除数据表](#2.2 删除数据表)
[2.3 查看数据表](#2.3 查看数据表)
[2.3.1 查看当前数据库中的所有数据表](#2.3.1 查看当前数据库中的所有数据表)
[2.3.2 查看数据表结构](#2.3.2 查看数据表结构)
[2.3.3 查看建表 SQL](#2.3.3 查看建表 SQL)
[2.3.4 查看表的详细状态](#2.3.4 查看表的详细状态)
[2.4 修改数据表](#2.4 修改数据表)
[2.4.1 向数据表中添加字段](#2.4.1 向数据表中添加字段)
[2.4.2 删除字段](#2.4.2 删除字段)
[2.4.3 修改字段类型/属性](#2.4.3 修改字段类型/属性)
[2.4.4 修改字段名和类型](#2.4.4 修改字段名和类型)
[2.4.5 修改表名](#2.4.5 修改表名)
本文内容概要
本文主要介绍 MySQL 中数据库与数据表的基本操作。通过本文的学习,需要掌握数据库和数据表的创建、删除、查看与修改操作;理解 MySQL 中字符集、校验规则以及存储引擎的基本概念与相关操作;掌握数据表字段的添加、删除、类型修改以及表名修改等操作,为后续学习 MySQL 中的数据增删查改以及 SQL 查询打下基础。
一、数据库的基本操作
1.1 创建数据库
|--------------------------------|---------------------------|
| SQL 语句 | Linux 文件系统 |
| 创建数据库:create database db_name; | 在 /var/lib/mysql 创建一个目录文件 |

如果创建已经存在的同名数据库,MySQL 会直接拦截此操作,不让用户执行。

对于上述情况,我们创建数据库时,可以带上 if not exists 选项,如果数据库不存在,则创建,如果数据库存在,MySQL 不会报错,但依旧不会创建它。

1.2 数据库字符集和校验集
数据库字符集:数据库存储数据的格式
数据库校验集:数据库读取数据的格式
对于任何一个数据库,它都有对应的字符集和校验集。
进入 /var/lib/mysql 路径下对应的数据库目录,即可查看该数据库的字符集和校验集。

在 MySQL 客户端中,也可以查看数据库的字符集和校验集。

1.2.1 查看 MySQL 支持的字符集和校验集
查看字符集

查看校验集

创建数据库时指定字符集和校验集


在 1.1 小节中,我们创建数据库时,并没有指定字符集和校验集,为什么创建好的数据库会自动带上字符集和校验集呢?
那是因为在 MySQL 配置文件**/etc/my.cnf**中,配置了创建数据库默认采用的字符集和校验集。

对于没有指定校验集,MySQL 会自动采用该字符集对应的校验集。
1.3 删除数据库
|------------------------------|---------------------------|
| SQL 语句 | Linux 文件系统 |
| 删除数据库:drop database db_name; | 在 /var/lib/mysql 删除一个目录文件 |

1.4 查看数据库
1.4.1 查看当前 MySQL Server 有哪些数据库
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
1.4.2 查看数据库的字符集和校验集
sql
mysql> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
1.4.3 切换/选择数据库:
sql
mysql> use test;
Database changed
1.4.4 查看当前所处的数据库:
sql
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
1.5 修改数据库
修改数据库的字符集和校验集

1.6 数据库的备份和恢复
cpp
mysqldump -P 3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径;
sql
source 数据库文件路径;
备份数据库:

cpp
cat mytest.sql
-- MySQL dump 10.13 Distrib 5.7.44, for Linux (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.7.44
/*!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 /;
/!40101 SET NAMES utf8 /;
/!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 */;
--
-- Current Database: test
CREATE DATABASE /!32312 IF NOT EXISTS/ test /*!40100 DEFAULT CHARACTER SET gbk */;
USE test;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE /;
/!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /;
/!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /;
/!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /;
/!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /;
/!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /;
/!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2026-09-30 15:21:23
mytest.sql 文件记录着对数据库的所有有效的历史操作,当还原数据库时,MySQL 服务端会将这些 SQL 语句重新执行一遍,完成数据库的还原。
还原数据库:

补充:如果备份的不是整个数据库,而是数据库的一张表:
sqlmysqldump -u root -p 数据库名 表名1 表名2 > 数据库备份存储的文件路径;同时备份多个数据库:
sqlmysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径;如果备份一个数据库时,没有带上 -B 选项,在恢复数据库时,需要先创建空数据库,然后进入该数据库,再使用 source 还原。
1.7 查看数据库的连接情况
sql
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 12 | root | localhost | test | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
作用:查看当前 MySQL 有哪些用户连接。如果查出某些用户不是合法用户,那么说明数据库被其他人入侵了。对于使用 MySQL 数据库出现卡顿、缓慢时,也可以通过该指令查看是否是因为数据库连接情况而导致的。
二、数据表的基本操作
2.1 创建数据表
create table 表名称 (字段 类型, 字段 类型) charset=字符集 collate=校验集 engine=存储引擎;
sql
mysql> create table person(name char(20), age int);
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person |
+----------------+
1 row in set (0.00 sec)
在创建数据表时,可以指定数据表的字符集、校验集、存储引擎。如果不指定字符集和校验集,数据表的字符集和校验集会继承数据库的字符集和校验集。对于存储引擎,它会采用 MySQL 数据库配置中的存储引擎。
查看 MySQL 支持的存储引擎:

不同的存储引擎在 Linux 文件系统中的差异
sql
mysql> create table test_InnoDB(id int) engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)
mysql> create table test_MyISAM(id int) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)
[root@iZ2zebg189x52z3hbfc0t4Z mysql]# ls test/
db.opt person.ibd test_InnoDB.ibd test_MyISAM.MYD
person.frm test_InnoDB.frm test_MyISAM.frm test_MyISAM.MYI
创建数据表的本质就是在 Linux 文件系统中创建普通文件。不同存储的数据表,它们创建普通文件的数量可能不同。
2.2 删除数据表
sql
drop table table_name;
sql
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person |
| test_InnoDB |
| test_MyISAM |
+----------------+
3 rows in set (0.01 sec)
mysql> drop table test_InnoDB;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table test_MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person |
+----------------+
1 row in set (0.00 sec)
删除数据表本质是在 Linux 文件系统中删除普通文件:
bash
[root@iZ2zebg189x52z3hbfc0t4Z mysql]# ls test/
db.opt person.frm person.ibd
2.3 查看数据表
2.3.1 查看当前数据库中的所有数据表
sql
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person |
+----------------+
1 row in set (0.00 sec)
2.3.2 查看数据表结构
sql
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
2.3.3 查看建表 SQL
sql
mysql> show create table person;
+--------+--------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+--------------------------------------------------------------------------------------------------------------------------+
| person | CREATE TABLE `person` (
`name` char(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+--------+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table person \G;
*************************** 1. row ***************************
Table: person
Create Table: CREATE TABLE person (
name char(20) DEFAULT NULL,
age int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
2.3.4 查看表的详细状态
sql
mysql> show table status like 'person';
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+----------------+----------+----------------+---------+
| person | InnoDB | 10 | Dynamic | 0 | 0 | 16384 | 0 | 0 | 0 | NULL | 2026-09-30 15:40:58 | NULL | NULL | gbk_chinese_ci | NULL | | |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+----------------+----------+----------------+---------+
1 row in set (0.00 sec)
2.4 修改数据表
sql
alter table 表名 操作;
2.4.1 向数据表中添加字段
sql
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)
mysql> alter table person add id int after age;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
2.4.2 删除字段
sql
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table person drop id;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2.4.3 修改字段类型/属性
sql
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> alter table person modify age varchar(40);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | varchar(40) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
2.4.4 修改字段名和类型
sql
mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| age | varchar(40) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table person change age id int;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc person;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2.4.5 修改表名
sql
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person |
+----------------+
1 row in set (0.00 sec)
mysql> alter table person rename to employee;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| employee |
+----------------+
1 row in set (0.00 sec)