数据库的基本操作
从这一章开始,我们正式动手写 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) | 负责"盖房子、拆房子"——创建、修改、删除数据库和表等结构 | CREATE、ALTER、DROP |
| DML | 数据操作语言(Data Manipulation Language) | 负责"往货架上放货、换货、扔货"——对表中的数据增、改、删 | INSERT、UPDATE、DELETE |
| DQL | 数据查询语言(Data Query Language) | 负责"找货"——从表中把想要的数据查出来 | SELECT |
| DCL | 数据控制语言(Data Control Language) | 负责"发门禁卡"——管理用户权限,谁能进仓库、能干什么 | GRANT、REVOKE |
💡 记忆技巧:定义(结构)→ 操作(数据)→ 查询(数据)→ 控制(权限)。本节学的都是 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 库名怎么起
- 只用小写字母、数字、下划线,以字母开头,如
school、shop_db、blog2026。 - 不要用中文、空格、连字符
-,也不要用 MySQL 的保留字(如order、select)做库名。 - Windows 上库名不区分大小写,Linux 上区分——统一小写就永远不会踩这个坑。
8.2 SQL 注释
写脚本时可以加注释(给人看的说明文字,MySQL 会忽略它们):
-- 这是单行注释(-- 后面要有一个空格)
# 这也是单行注释(MySQL 特有)
/* 这是
多行注释 */
CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4; -- 建库
养成写注释的习惯,几个月后回看自己的脚本会感谢现在的自己。
⚠️ 新手常见坑
- 用了
utf8而不是utf8mb4:存 emoji 或生僻字时报错/乱码。铁律:永远utf8mb4。 - 忘写分号
;:命令行里回车后光标变成->继续等待输入,这是 MySQL 在等你把语句写完。补一个;回车即可。 SHOW DATABASES少写 S:写成SHOW DATABASE会报语法错误。- 忘记
USE就去建表/查询:会报ERROR 1046 (3D000): No database selected(没有选中数据库)。先USE school;再操作。 - 随手 DROP:
DROP 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;
因为它会把整个库及其中所有表和数据彻底删除,执行时没有确认提示,也无法撤销恢复,误删生产库是灾难性事故。