【MySQL】库的操作
SQL 是语言;MySQL 是实现了 SQL 的数据库软件
本篇文章会穿插sql命令相关知识讲解
上一篇我们认识了 MySQL,了解了数据库、数据表以及客户端和服务器端的基本概念。本篇继续往下走:在真正创建数据表之前,我们先要有一个数据库。
可以把数据库理解成一个用于组织和管理相关数据的逻辑空间。比如,学校系统可能需要保存学生、课程和成绩等信息,我们可以先创建一个 school 数据库,再在其中创建不同的数据表
本篇文章会围绕一个练习数据库展开,依次学习创建、查看、选择、修改和删除数据库,并进一步认识字符集、校验规则以及数据库备份与恢复。为了避免误操作,本文使用专门的练习库 test_school,不操作已有的重要数据库。
文章目录
- 【MySQL】库的操作
-
- [一、 创建数据库](#一、 创建数据库)
-
- [1、 进入mysql](#1、 进入mysql)
- [2、 创建数据库](#2、 创建数据库)
- [3、 字符集与校验规则](#3、 字符集与校验规则)
- 4、字符集和校验规则展示
- 5、创建时指定字符集和校验规则
- [二、 查看和选择数据库](#二、 查看和选择数据库)
- [三、 数据库的修改与删除](#三、 数据库的修改与删除)
- [四、 数据库的备份与恢复](#四、 数据库的备份与恢复)
- [五、 本篇常用命令速查](#五、 本篇常用命令速查)
一、 创建数据库
1、 进入mysql
打开 CentOS 终端后,最开始看到的是 Linux shell 提示符 。像mysql -u root -p、ls、cd、cat 这样的命令属于 Linux 命令,要在这里输入
mysql登录指令
bash
mysql -u root -p
-u 指定用户名,root 是用户名 ;-p 表示随后提示输入密码 。输入密码时屏幕通常不显示字符,这是正常的
输入登录命令并成功进入 MySQL 后,通常会看到 mysql> 。这表示你已经进入 MySQL 客户端,可以输入SQL语句了
查看mysql版本
bash
SELECT VERSION();
SELECT 是查询关键字;VERSION() 是 MySQL 提供的函数,用来返回服务器版本;圆括号表示调用函数;分号结束语句
SQL 关键字通常不区分大小写,所以 SELECT VERSION();和selectversion();通常都能执行。


一条 SQL 可以写在一行,也可以为了好读拆成多行 ;只要语法正确,并且最后用分号结束即可。;分号表示这个指令已经写完了。 
2、 创建数据库
数据库是组织数据的逻辑空间 。创建数据库,就相当于先准备一个专门存放某一类业务数据的"容器" 。本篇统一使用 test_school 作为练习数据库名称。
创建数据库的基本语法
bash
CREATE DATABASE 数据库名;
CREATE 是创建关键字;DATABASE 代表数据库;后面填写你想要设置的数据库名称

这表示数据库创建成功。这里的"1 row affected"是 MySQL 对执行结果的提示,不代表数据库里已经有一条学生记录。此时我们只是创建了数据库,还没有创建表或插入数据。
为了避免重复创建,可以加入(推荐):IF NOT EXISTS
IF NOT EXISTS 意思是"如果不存在" 。它告诉 MySQL:只有当这个名字的数据库不存在时才创建;如果已经存在,就跳过创建,避免因为重复而报错。

1 warning警告,代表 test_school 数据库已经存在,所以没有新建,只是给一个提醒
3、 字符集与校验规则
创建数据库时,除了名字,还可以设置字符集和校验规则。
什么是字符集?
计算机底层保存的是二进制数据,而我们希望存储和读取的是中文、英文、数字以及各种符号。字符集规定字符如何编码 。数据库、客户端和应用程序的编码设置需要配合,否则可能出现乱码。
我们常用字符集是utf8mb4 ,在 MySQL 中,utf8mb4 能够完整支持 Unicode 字符,包括常见中文、英文以及许多扩展字符和 emoji。
打个比方:客户端用 utf8mb4 把汉字"种"转成 E4 B8 AD,数据库也是 utf8mb4,存入后读出这串字节,还原成汉字"中",就不乱码了。
什么是校验规则(Collation)?
校验规则(排序规则)主要决定字符串比较和排序时采用什么规则。例如,比较两个字符串时是否区分大小写、是否区分重音,以及排序时如何判断先后顺序。它不是另一套字符编码,而是建立在字符集之上的比较规则。
名称末尾常见的 _ci 表示不区分大小写 (case-insensitive);_cs 表示区分大小写 (case-sensitive);_bin 表示按二进制值比较。不同版本支持的规则名称可能不同。
4、字符集和校验规则展示
查看 MySQL 支持的字符集
bash
SHOW CHARACTER SET;
SHOW 是查看关键字;CHARACTER SET 代表字符集

查看 utf8mb4 对应的校验规则
bash
SHOW COLLATION LIKE 'utf8mb4%';
SHOW COLLATION:查看校验规则;LIKE 'utf8mb4%':只筛选以 utf8mb4 开头的校验规则

后缀含义:
- ci = case insensitive:大小写不敏感,A 和 a 视为相等
- bin = binary:二进制比较,严格区分大小写,按字节直接对比
简单来说,排序规则决定字符怎么比较、怎么排序,而字符集只决定字符怎么转二进制存储。
5、创建时指定字符集和校验规则

- CREATE DATABASE test_school_charset:创建名为 test_school_charset 的数据库
- DEFAULT CHARACTER SET utf8mb4:指定这个库默认字符集是 utf8mb4,负责文字转二进制存储
- DEFAULT COLLATE utf8mb4_general_ci:指定这个库默认排序规则,大小写不敏感,用于比较、排序
数据库的默认字符集和校验规则会作为之后创建表时的默认设置;如果创建表或字段时另外指定了字符集或校验规则,则可以覆盖继承的默认值。
二、 查看和选择数据库
创建数据库之后,我们需要知道它是否存在 ,并告诉 MySQL 接下来要在哪个数据库中执行操作
查看当前 MySQL 中的数据库
bash
SHOW DATABASES;

SHOW DATABASES(注意要加s) 用于查看当前账号有权限看到的数据库。information_schema、mysql、performance_schema、sys:系统自带库,存 MySQL 本身的元数据、权限、性能信息,不能删除。
选择数据库:USE
bash
USE test_school;

USE 的作用是切换当前会话正在使用的数据库。之后如果创建表时没有写明数据库名,MySQL 就会默认在当前选中的数据库中操作。
查看当前正在使用的数据库
bash
SELECT DATABASE();

如果还没有选择数据库,SELECT DATABASE() 通常会返回 NULL。这个函数可以帮助我们确认当前操作对象,避免误把表建到其他数据库中。
三、 数据库的修改与删除
修改数据库的默认字符集和校验规则
数据库创建之后,也可以修改它的默认字符集和校验规则。例如:
bash
ALTER DATABASE test_school
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
ALTER DATABASE:修改已有数据库的配置
这条命令只改库的默认规则,库里已经存在的表,编码不会自动跟着变;只有之后新建的表才会继承这套字符集
删除数据库:DROP DATABASE
当某个练习数据库不再需要时,可以使用 DROP DATABASE 删除。删除数据库是具有破坏性的操作,会删除该数据库及其包含的表等对象和数据,因此执行前一定要确认数据库名称。
bash
DROP DATABASE test_school_charset;

Query OK, 0 rows affected 代表数据库已经删掉了
删除后可以执行 SHOW DATABASES;,确认它已经不在列表中。

更安全地处理不存在的数据库
bash
DROP DATABASE IF EXISTS test_school_charset;
IF EXISTS 表示只有数据库存在时才执行删除;如果数据库不存在,则不会因为找不到数据库而报错。它适合用于清理练习环境,但仍然不能代替删除前的核对。
重要提醒:不要对 mysql、information_schema、performance_schema、sys 等系统数据库执行删除操作,也不要把 DROP DATABASE 随意用于存有真实数据的数据库。
四、 数据库的备份与恢复
1、数据库备份
数据库中保存的可能是重要业务数据。如果误操作、程序故障或系统故障导致数据丢失,备份可以帮助我们恢复。因此,除了会创建和管理数据库,还应该了解最基本的备份与恢复方法。
啥是数据库备份呢?
原来的数据库 :test_school里面可能有学生表、成绩表、课程表等
数据库的备份文件 :test_school_backup.sql,是一个保存了数据库结构和数据的 SQL 文件
如果原数据库出了问题,就可以利用备份文件重新建立数据库
注意 :.sql 文件不是数据库本身 ,而是记录了如何创建数据库、表以及恢复数据等内容的 SQL 语句。
退出 MySQL 客户端
bash
EXIT;

mysqldump 是 Linux 命令行中的备份工具,不是在 mysql> 提示符下执行的 SQL 命令。因此,先从 MySQL 客户端退出;回到 Linux shell 提示符后,再执行下面的备份命令。
使用 mysqldump 备份数据库
bash
mysqldump -u root -p test_school > test_school_backup.sql
mysqldump 是数据库备份工具;-u root 指定登录用户;-p 表示按提示输入密码;test_school 是要备份的数据库名称;> 表示把导出的 SQL 内容写入右侧备份文件 test_school_backup.sql。
可以用 ls -l test_school_backup.sql 检查备份文件是否生成。

备份文件中通常包含创建表和插入数据等 SQL 语句。它是文本形式的逻辑备份,不是直接复制 MySQL 正在使用的内部数据文件。
2、恢复数据库
现在我们假设原来的数据库出了问题,需要通过备份文件恢复。先创建一个新的空数据库,再把备份文件里的内容导入进去
回到 MySQL 客户端:
bash
mysql -u root -p
进入 mysql> 后执行:
bash
CREATE DATABASE test_school_restore
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
EXIT;
然后回到 Linux shell,执行导入:
bash
mysql -u root -p test_school_restore < test_school_backup.sql
test_school_restore要恢复到哪个数据库;<从文件中读取内容;test_school_backup.sql备份文件。
这里要特别注意: >:把内容写进文件,常用于备份。 <:从文件读取内容,常用于恢复。

再进入mysql,检查恢复结果

USE test_school_restore; 选择 test_school_restore 作为当前操作的数据库。
SHOW TABLES; 查看当前数据库里面有哪些表。当然我们本来的test_school里啥都没有,所以备份也是empty
备份文件不一定包含所有东西
bash
MySQL
└── test_school
├── student 表
├── course 表
└── score 表
现在执行:
bash
mysqldump -u root -p test_school > test_school_backup.sql
把 test_school 数据库的内容导出到一个 SQL 文件里 。
这个 SQL 文件里面,可能保存了:
- 创建 student 表的语句。
- 创建 course 表的语句。
- 创建 score 表的语句。
- 向这些表插入数据的语句。
但是,它不一定包含创建 test_school 数据库的语句 。
也就是说,备份文件可能保存了数据库里面的东西,却没有保存数据库这个容器本身的创建命令 。
所以恢复之前要先创建目标数据库,把备份文件中的内容导入到test_school_restore 这个新数据库里。
五、 本篇常用命令速查
| 操作 | 命令 |
|---|---|
| 创建数据库 | CREATE DATABASE test_school; |
| 避免重复创建 | CREATE DATABASE IF NOT EXISTS test_school; |
| 查看数据库列表 | SHOW DATABASES; |
| 查看创建语句 | SHOW CREATE DATABASE test_school; |
| 选择数据库 | USE test_school; |
| 查看当前数据库 | SELECT DATABASE(); |
| 查看字符集 | SHOW CHARACTER SET; |
| 查看校验规则 | SHOW COLLATION LIKE 'utf8mb4%'; |
| 修改默认字符集 | ALTER DATABASE test_school DEFAULT CHARACTER SET utf8mb4; |
| 修改默认校验规则 | ALTER DATABASE test_school DEFAULT COLLATE utf8mb4_general_ci; |
| 删除数据库 | DROP DATABASE test_school; |
| 安全检查式删除 | DROP DATABASE IF EXISTS test_school; |
| 备份数据库(Linux shell) | mysqldump -u root -p test_school > test_school_backup.sql |
| 恢复数据库(Linux shell) | mysql -u root -p test_school_restore < test_school_backup.sql |