返回首页

02|数据库与表的基本操作

适用版本:MySQL 8.0.x

学习 MySQL 时,很多人最先想学的是查询语句,比如 SELECTWHEREORDER BY。但在真正写查询之前,你得先有“可被查询的数据结构”。也就是说,数据库和表的创建、查看、修改、删除,才是所有 SQL 操作的起点。

如果把 MySQL 比作一个仓库系统,那么数据库像是仓库分区,表像是分类货架,字段像是每个货架上的标签。你如果连仓库和货架都还没搭好,后面再谈查数据、改数据,其实是无从下手的。

这篇文章专门讲清楚 MySQL 里最基础也最常用的一类内容:数据库(Database)和表(Table)的基本操作。目标不是死记命令,而是建立一套清晰的操作顺序:先选库、再建表、再查看结构、再演进表结构,最后再谨慎删除。


一、为什么数据库与表的基本操作很重要

初学者常把这部分当成“纯命令记忆”,其实它很重要,原因主要有三个。

1. 所有业务数据最终都要落到表结构里

你写用户系统、订单系统、内容系统,本质上都要先回答这些问题:

  • 数据放在哪个数据库里?
  • 需要几张表?
  • 每张表有哪些字段?
  • 表和表之间如何拆分职责?

这些都属于数据库与表设计的基本功。

2. 后续所有 SQL 能力都建立在表结构之上

你后面会学习:

  • 查询
  • 索引
  • 事务
  • 关联查询
  • 聚合统计

但这些能力都离不开一个前提:表结构存在且设计合理

3. 线上很多问题并不是查询语法问题,而是结构管理问题

比如:

  • 表字段命名混乱
  • 类型选错
  • 约束缺失
  • 改表风险评估不足
  • 测试库和正式库结构不一致

所以这部分虽然基础,却非常“工程化”。


二、先分清几个概念:实例、数据库、表

很多初学者一上来就把这些概念混在一起,后面执行命令时容易犯迷糊。

1. MySQL 实例

实例可以理解成一个正在运行的 MySQL 服务进程。它监听某个端口,等待客户端连接。

例如你本机的:

  • 主机:127.0.0.1
  • 端口:3306

就是一个 MySQL 实例的接入方式。

2. 数据库(Database / Schema)

数据库是实例中的逻辑划分单位。一个实例里可以有多个数据库。

例如:

  • demo_db
  • blog_system
  • mall_system

在 MySQL 里,很多时候 databaseschema 可以近似理解为同一层概念。

3. 表(Table)

表是数据库中真正存放业务记录的对象。

比如在 blog_system 数据库下,可能会有:

  • users
  • articles
  • comments

4. 一个简单层级关系

MySQL 实例
└── 数据库 demo_db
    ├── 表 users
    ├── 表 orders
    └── 表 products

把这个层级关系理解清楚,后面执行 USESHOW TABLESCREATE TABLE 就不会乱。


三、数据库操作:先学会管理“容器”

1. 查看当前实例里有哪些数据库

SHOW DATABASES;

你通常会看到类似结果:

  • information_schema
  • mysql
  • performance_schema
  • sys

这些大多是系统库。学习时我们一般自己创建一个练习库,不建议直接在系统库里做实验。

2. 创建数据库

最常见的写法如下:

CREATE DATABASE demo_db;

如果你希望更明确地指定字符集和排序规则,可以这样写:

CREATE DATABASE demo_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci;

这是一种更稳妥的写法,因为它避免后续由于字符集不一致导致乱码或比较行为差异。

3. 进入指定数据库

USE demo_db;

执行成功后,后续很多表操作都会默认作用在当前数据库下。

4. 查看当前正在使用哪个数据库

SELECT DATABASE();

这条命令很简单,但非常实用。尤其是你开了多个连接窗口时,先确认当前库能减少很多误操作。

5. 删除数据库

DROP DATABASE demo_db;

这个操作会直接删除数据库及其中所有对象,风险很高。学习阶段可以在练习库中使用,但要养成习惯:

  • 删除前先确认当前环境
  • 删除前先确认是否需要备份
  • 正式环境不要随意直接执行

6. 更稳妥的写法:带 IF EXISTS

DROP DATABASE IF EXISTS demo_db;

类似地,创建时也可以带 IF NOT EXISTS

CREATE DATABASE IF NOT EXISTS demo_db;

这类写法能让脚本在重复执行时更稳定。


四、表是什么:你真正操作数据的地方

数据库更像是逻辑容器,而表才是日常最频繁打交道的对象。

表主要由下面几个部分组成:

组成部分 含义
表名 这张表叫什么
列名 每个字段叫什么
数据类型 每个字段存什么类型的数据
约束 哪些值允许、哪些不允许
索引 如何提升查询效率

例如一张最简单的用户表:

CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) DEFAULT NULL,
    created_at DATETIME NOT NULL
);

这条语句里已经包含了表定义的核心元素:

  • 表名:users
  • 主键:id
  • 字符串字段:usernameemail
  • 时间字段:created_at
  • 约束:NOT NULL
  • 自增:AUTO_INCREMENT

五、创建表:从一张最小业务表开始

我们继续以用户表为例。

1. 建表前先确认当前数据库

SELECT DATABASE();

如果结果为空,说明你还没有执行 USE demo_db;。这时直接建表,可能会报错。

2. 创建表示例

CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    phone VARCHAR(20) DEFAULT NULL,
    status TINYINT NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL
);

3. 这张表的含义可以这样理解

字段 说明
id 用户主键,自增
username 用户名,不能为空
phone 手机号,可为空
status 用户状态,默认值为 1
created_at 创建时间
updated_at 更新时间

4. 创建表后查看当前库里的表

SHOW TABLES;

如果看到 users,说明建表成功。


六、查看表结构:别只会建,不会看

很多初学者会建表,但不会检查表结构,这是一个很典型的问题。建完表之后,建议立刻学会几种查看方式。

1. 查看字段结构

DESC users;

或者:

DESCRIBE users;

你会看到每个字段的:

  • 字段名
  • 类型
  • 是否允许为空
  • 键类型
  • 默认值
  • 额外属性

2. 查看完整建表语句

SHOW CREATE TABLE users;

这条命令很重要,因为它能告诉你:

  • 实际建表语句是什么
  • 字符集和排序规则是什么
  • 主键、索引、约束如何定义
  • 存储引擎是什么

3. 什么时候优先用 SHOW CREATE TABLE

当你要排查下面这些问题时,它尤其好用:

  • 为什么字段默认值和我想的不一样
  • 为什么表字符集不一致
  • 为什么主键没有按预期生效
  • 为什么同事机器和你机器上的表结构不同

七、重命名表与删除表

1. 重命名表

如果表名不合适,可以重命名:

RENAME TABLE users TO app_users;

执行后,原来的 users 表名就不存在了。

2. 删除表

DROP TABLE app_users;

和删除数据库一样,删除表也是高风险操作。

更稳妥一点可以写成:

DROP TABLE IF EXISTS app_users;

3. 删除表和删除数据库的区别

操作 作用范围
DROP TABLE 删除单张表
DROP DATABASE 删除整个数据库及其所有表

学习阶段一定要分清,不要把局部删除写成整体删除。


八、修改表结构:ALTER TABLE 是高频操作

业务不可能一开始就把表结构设计得完美,所以改表是常见需求。

1. 添加字段

假设我们要给 users 表新增邮箱字段:

ALTER TABLE users
ADD COLUMN email VARCHAR(100) DEFAULT NULL;

2. 添加多个字段

ALTER TABLE users
ADD COLUMN nickname VARCHAR(50) DEFAULT NULL,
ADD COLUMN last_login_at DATETIME DEFAULT NULL;

3. 修改字段类型或定义

例如把 username 长度从 50 改成 100:

ALTER TABLE users
MODIFY COLUMN username VARCHAR(100) NOT NULL;

4. 修改字段名

ALTER TABLE users
CHANGE COLUMN phone mobile VARCHAR(20) DEFAULT NULL;

注意这里不仅改名字,还要把完整字段定义一起写出来。

5. 删除字段

ALTER TABLE users
DROP COLUMN nickname;

6. 添加索引

ALTER TABLE users
ADD INDEX idx_mobile (mobile);

7. 删除索引

ALTER TABLE users
DROP INDEX idx_mobile;

九、清空表数据:DELETETRUNCATEDROP 不要混淆

这几个操作初学者非常容易搞混。

1. DELETE

DELETE FROM users;

作用:删除表中的数据,但表结构还在。

2. TRUNCATE TABLE

TRUNCATE TABLE users;

作用:快速清空表数据,表结构还在。

3. DROP TABLE

DROP TABLE users;

作用:连表结构一起删掉。

4. 三者对比

操作 数据是否删除 表结构是否保留 常见用途
DELETE FROM users 按条件或全量删除数据
TRUNCATE TABLE users 快速清空整表
DROP TABLE users 不再需要该表

学习时一定要形成这个意识:TRUNCATE 是清空,DROP 是连表一起删掉。


十、一个完整练习:从建库到改表走一遍

下面给出一个适合初学者实际跟敲的最小流程。

步骤 1:创建数据库

CREATE DATABASE IF NOT EXISTS demo_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci;

步骤 2:切换数据库

USE demo_db;

步骤 3:创建学生表

CREATE TABLE students (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    student_no VARCHAR(20) NOT NULL,
    name VARCHAR(50) NOT NULL,
    age TINYINT NOT NULL,
    created_at DATETIME NOT NULL
);

步骤 4:查看表结构

DESC students;
SHOW CREATE TABLE students;

步骤 5:新增一个状态字段

ALTER TABLE students
ADD COLUMN status TINYINT NOT NULL DEFAULT 1;

步骤 6:再看一次建表语句

SHOW CREATE TABLE students;

步骤 7:如果练习结束,删除这张表

DROP TABLE students;

这一整套过程的价值在于:

  • 你能看到表是怎么从无到有创建出来的
  • 你能看到改表后的结构变化
  • 你能建立“数据库 -> 表 -> 字段”的具体操作感

十一、表命名与字段命名的实践建议

虽然这是入门阶段,但命名习惯越早建立越好。

1. 表名建议见名知义

例如:

  • users
  • orders
  • products
  • user_login_logs

尽量避免这种表名:

  • data1
  • info_table
  • testabc

2. 字段名建议统一风格

常见做法是使用小写加下划线:

  • user_id
  • created_at
  • updated_at

3. 时间字段建议成对出现

很多业务表都会保留:

  • created_at
  • updated_at

这样后续排查问题、做列表排序、做变更追踪都方便很多。

4. 主键命名保持稳定

通常可以统一用:

id

如果是关联外键字段,则用:

user_id
order_id
product_id

统一命名会让后续关联和阅读轻松很多。


十二、常见误区:数据库与表操作里最容易犯的错

误区 1:忘了切库就直接建表

很多同学执行了 CREATE TABLE users ... 之后报错,或者在错误的数据库中建了表,根源就是没先执行:

USE demo_db;

误区 2:只会 DESC,不会看 SHOW CREATE TABLE

DESC 只能看到简化结构,而很多真实信息要通过 SHOW CREATE TABLE 才能看出来。

误区 3:改字段名时忘了写完整定义

CHANGE COLUMN 不是只写旧名字和新名字就行,还要把字段类型、默认值、是否为空等完整定义重新写出。

误区 4:把 DELETETRUNCATEDROP 混为一谈

这是线上误操作里非常典型的一类问题。语义不同,风险级别也不同。

误区 5:在正式环境随手执行改表

学习环境里觉得很简单,但正式环境改表往往要考虑:

  • 数据量大小
  • 锁表影响
  • 变更窗口
  • 回滚方案
  • 应用兼容性

所以现在先建立一个习惯:任何结构性变更都要谨慎。


十三、实践建议:把 DDL 操作用得更稳一些

1. 练习时优先使用自己的测试库

不要在系统库里做实验,也不要在不确定用途的现有库里随意建表。

2. 创建对象时尽量写清楚字符集和含义

尤其是在多人协作环境下,默认值不同会带来很多隐性问题。

3. 先“查看”再“修改”

在改表前,先执行:

SHOW CREATE TABLE users;

确认当前结构后再动手,会更稳妥。

4. 删除前先做确认

建议先回答自己两个问题:

  1. 我删的是数据,还是删的是结构?
  2. 删除后是否还能恢复?

有了这个停顿动作,很多低级错误都能避免。

5. 养成结构变更留痕的习惯

哪怕是学习阶段,也可以把建表 SQL、改表 SQL 单独整理出来。后面你会慢慢理解,这其实就是数据库版本管理意识的开始。


十四、小结

数据库与表的基本操作,看起来只是建库建表,但它其实是后续所有 MySQL 学习的起点。

这篇文章重点讲清了:

  • MySQL 实例、数据库、表之间的层级关系
  • 如何创建、查看、切换、删除数据库
  • 如何创建表、查看结构、重命名和删除表
  • 如何使用 ALTER TABLE 对字段和索引做基本调整
  • DELETETRUNCATEDROP 的区别
  • 表结构管理中最容易踩的坑与更稳妥的实践方式

如果说 SQL 查询是在“读写数据”,那么数据库与表操作做的事情就是“搭建数据的骨架”。骨架清晰了,后面的增删改查、索引、事务才会真正有落点。


📝 版权声明:本文为原创技术博客,转载请注明出处。

如文章中存在错误或不准确之处,欢迎在评论区指正,感谢您的阅读与支持!

上一篇

01|MySQL 简介与安装

下一篇

03|SQL 增删改查入门