跳到主要内容

2.1 数据库的基本操作

从这一章开始,我们正式动手写 SQL 了!本节先从最基础的"数据库"操作学起:怎么创建、查看、切换、删除一个数据库。我们还会创建一个贯穿全书的示例数据库 school(学校库),后面所有章节的例子都在它里面进行。

📖 本节导读

  • 了解 SQL 语句的四大分类:DDL、DML、DQL、DCL,各自负责什么
  • 学会用 CREATE DATABASE 创建数据库,理解为什么字符集要选 utf8mb4
  • 掌握查看数据库(SHOW DATABASES)、切换数据库(USE)、查看当前库(SELECT DATABASE()
  • 学会用 DROP DATABASE 删除数据库,并牢记它的危险性

一、SQL 语句的四大分类

SQL(Structured Query Language,结构化查询语言)就是我们和数据库"对话"的语言。按照用途,SQL 语句通常分为四大类。你可以把数据库想象成一个大仓库:

分类全称一句话解释常见关键字
DDL数据定义语言(Data Definition Language)负责"盖房子、拆房子"——创建、修改、删除数据库和表等结构CREATEALTERDROP
DML数据操作语言(Data Manipulation Language)负责"往货架上放货、换货、扔货"——对表中的数据增、改、删INSERTUPDATEDELETE
DQL数据查询语言(Data Query Language)负责"找货"——从表中把想要的数据查出来SELECT
DCL数据控制语言(Data Control Language)负责"发门禁卡"——管理用户权限,谁能进仓库、能干什么GRANTREVOKE

💡 记忆技巧:定义(结构)→ 操作(数据)→ 查询(数据)→ 控制(权限)。本节学的都是 DDL 中最简单的一部分——对"数据库"本身的操作。

在动手之前,请先按照上一节的方法连接到 MySQL,看到 mysql> 提示符就可以开始了。

二、创建数据库:CREATE DATABASE

2.1 最简单的写法

CREATE DATABASE school;

执行后如果看到类似下面的输出,说明创建成功:

Query OK, 1 row affected (0.01 sec)

Query OK 表示语句执行成功。此时 MySQL 里就多了一个名叫 school 的数据库——你可以把它理解为一个"文件夹",以后我们建的表都放在这个文件夹里。

2.2 IF NOT EXISTS:避免重复创建报错

如果 school 已经存在,再执行一次上面的语句就会报错:

ERROR 1007 (HY000): Can't create database 'school'; database exists

加上 IF NOT EXISTS(如果不存在才创建)就安全了——库已存在时只给一个警告,不会报错中断:

CREATE DATABASE IF NOT EXISTS school;
Query OK, 1 row affected, 1 warning (0.00 sec)

在写建库脚本时,强烈建议养成加 IF NOT EXISTS 的习惯,这样脚本可以反复执行而不会出错。

2.3 指定字符集:为什么用 utf8mb4 而不是 utf8

字符集决定了数据库能存哪些文字。就像不同的输入法支持的字库不同,字符集选错了,某些字符就会存不进去甚至变成乱码。

创建 school 库的标准完整写法(也是我们全书统一使用的写法):

CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4;
  • DEFAULT CHARACTER SET utf8mb4 表示:这个库里的表默认都用 utf8mb4 字符集。

为什么是 utf8mb4 而不是 utf8

这是一个非常经典的坑。MySQL 里的 utf8 其实是一个"残缺版"的 UTF-8(官方叫 utf8mb3),每个字符最多只用 3 个字节存储。而真正完整的 UTF-8 编码,一个字符最多需要 4 个字节——比如常见的 emoji 表情(😂、👍)、部分生僻汉字,都是 4 字节字符。

  • utf8:用户发一个 😂,插入数据时直接报错或变乱码。
  • utf8mb4(mb4 = most bytes 4,最多 4 字节):完整支持所有 Unicode 字符,包括 emoji。

所以记住一条铁律:在 MySQL 里,永远用 utf8mb4,不要用 utf8。从 MySQL 8.0 开始,默认字符集已经是 utf8mb4 了,但显式写出来是个好习惯,可以避免因服务器配置不同而踩坑。

三、查看所有数据库:SHOW DATABASES

SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)

可以看到我们刚创建的 school。其余四个是 MySQL 自带的系统库,新手请不要动它们

  • information_schema:记录所有数据库、表的"元信息"(相当于仓库的总台账)
  • mysql:存放用户、权限等核心信息
  • performance_schema / sys:性能监控相关

注意 DATABASES 是复数(查看的是"多个库"的列表),别少写了 S。

四、切换数据库:USE

创建了库还不够,操作表之前要先"走进"这个库。USE 命令就是告诉 MySQL:"我接下来的操作都是针对这个库的":

USE school;
Database changed

看到 Database changed 就表示切换成功了。这就像你在电脑上双击进入了某个文件夹,之后新建的文件都会放在这个文件夹里。

USE 后面不需要加引号,直接写库名即可。它也是少数可以不写分号的命令之一,但建议统一都写分号。

五、查看当前所在的数据库:SELECT DATABASE()

工作一会儿后忘了自己在哪个库?用这条语句看一下:

SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| school |
+------------+
1 row in set (0.00 sec)

如果还没执行过 USE,结果会显示 NULL(空),表示当前没有选中任何库。DATABASE() 是一个函数(可以理解为一个"会返回结果的小工具"),后面章节我们还会见到很多类似的函数。

六、查看建库语句:SHOW CREATE DATABASE

想知道某个库当初是用什么语句、什么字符集创建的?

SHOW CREATE DATABASE school;
+----------+-----------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------------------------------------------+
| school | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ |
+----------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

可以确认 school 的字符集确实是 utf8mb4。输出里的 COLLATE utf8mb4_0900_ai_ci 是"排序规则",即比较字符大小的规则(比如排序时'a'和'A'算不算相等),新手先用默认值即可。

七、删除数据库:DROP DATABASE(危险操作!)

DROP DATABASE 库名;

⚠️ 这是本节最危险的命令,没有之一。

DROP DATABASE 会把整个数据库连同里面所有的表、所有的数据一起彻底删除,而且:

  • 没有确认提示——回车即执行,不会问你"确定吗?"
  • 没有回收站——删了就是删了,无法用命令撤销

同样地,删除时可以加 IF EXISTS,库不存在时只警告不报错:

DROP DATABASE IF EXISTS test_db;

我们可以做个安全的小实验——先建一个专门用来删的库,再删掉它:

CREATE DATABASE IF NOT EXISTS test_db;
DROP DATABASE IF EXISTS test_db;
Query OK, 0 rows affected (0.01 sec)

千万不要school 库或任何有用的库执行 DROP DATABASE。在真实工作中,误删数据库是可能"删库跑路"上新闻的事故级操作,删除前一定要三思并做好备份。

八、补充:库名的命名规则与 SQL 注释

8.1 库名怎么起

  • 只用小写字母、数字、下划线,以字母开头,如 schoolshop_dbblog2026
  • 不要用中文、空格、连字符 -,也不要用 MySQL 的保留字(如 orderselect)做库名。
  • Windows 上库名不区分大小写,Linux 上区分——统一小写就永远不会踩这个坑。

8.2 SQL 注释

写脚本时可以加注释(给人看的说明文字,MySQL 会忽略它们):

-- 这是单行注释(-- 后面要有一个空格)
# 这也是单行注释(MySQL 特有)
/* 这是
多行注释 */
CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4; -- 建库

养成写注释的习惯,几个月后回看自己的脚本会感谢现在的自己。

⚠️ 新手常见坑

  1. 用了 utf8 而不是 utf8mb4:存 emoji 或生僻字时报错/乱码。铁律:永远 utf8mb4
  2. 忘写分号 ;:命令行里回车后光标变成 -> 继续等待输入,这是 MySQL 在等你把语句写完。补一个 ; 回车即可。
  3. SHOW DATABASES 少写 S:写成 SHOW DATABASE 会报语法错误。
  4. 忘记 USE 就去建表/查询:会报 ERROR 1046 (3D000): No database selected(没有选中数据库)。先 USE school; 再操作。
  5. 随手 DROPDROP DATABASE 不可恢复,敲下回车前请默念三遍库名确认。

📝 小结

语句作用
CREATE DATABASE IF NOT EXISTS 库名 DEFAULT CHARACTER SET utf8mb4;创建数据库(推荐完整写法)
SHOW DATABASES;查看所有数据库
USE 库名;切换到某个数据库
SELECT DATABASE();查看当前所在数据库
SHOW CREATE DATABASE 库名;查看某个库的建库语句和字符集
DROP DATABASE 库名;删除数据库(危险!不可恢复)
  • SQL 分四类:DDL(定结构)、DML(改数据)、DQL(查数据)、DCL(管权限)。
  • 本节我们已经创建好了贯穿全书的 school 库,下一节将在其中创建数据表。

✍️ 练习题

1. 创建一个名为 mytest 的数据库,要求:重复执行不报错,字符集为 utf8mb4。

参考答案
CREATE DATABASE IF NOT EXISTS mytest DEFAULT CHARACTER SET utf8mb4;

2. 写出:查看所有数据库、切换到 mytest、确认当前所在库,这三步的完整语句。

参考答案
SHOW DATABASES;
USE mytest;
SELECT DATABASE();

3. 如何查看 mytest 库创建时使用的字符集?

参考答案
SHOW CREATE DATABASE mytest;

在输出的 Create Database 一列中查看 DEFAULT CHARACTER SET 后面的值。

4. 判断题:MySQL 中的 utf8 就是标准的 UTF-8 编码,可以存储 emoji 表情。

参考答案

错。MySQL 的 utf8 是每字符最多 3 字节的"残缺版"(utf8mb3),无法存储 emoji 等 4 字节字符。要用 utf8mb4 才是完整的 UTF-8。

5. 删除练习用的 mytest 库(注意:只删这个练习库!),并说明为什么 DROP DATABASE 要格外小心。

参考答案
DROP DATABASE IF EXISTS mytest;

因为它会把整个库及其中所有表和数据彻底删除,执行时没有确认提示,也无法撤销恢复,误删生产库是灾难性事故。