适用版本:MySQL 8.0.x
学习 MySQL 时,很多人最先想学的是查询语句,比如 SELECT、WHERE、ORDER BY。但在真正写查询之前,你得先有“可被查询的数据结构”。也就是说,数据库和表的创建、查看、修改、删除,才是所有 SQL 操作的起点。
如果把 MySQL 比作一个仓库系统,那么数据库像是仓库分区,表像是分类货架,字段像是每个货架上的标签。你如果连仓库和货架都还没搭好,后面再谈查数据、改数据,其实是无从下手的。
这篇文章专门讲清楚 MySQL 里最基础也最常用的一类内容:数据库(Database)和表(Table)的基本操作。目标不是死记命令,而是建立一套清晰的操作顺序:先选库、再建表、再查看结构、再演进表结构,最后再谨慎删除。
一、为什么数据库与表的基本操作很重要
初学者常把这部分当成“纯命令记忆”,其实它很重要,原因主要有三个。
1. 所有业务数据最终都要落到表结构里
你写用户系统、订单系统、内容系统,本质上都要先回答这些问题:
- 数据放在哪个数据库里?
- 需要几张表?
- 每张表有哪些字段?
- 表和表之间如何拆分职责?
这些都属于数据库与表设计的基本功。
2. 后续所有 SQL 能力都建立在表结构之上
你后面会学习:
- 查询
- 索引
- 事务
- 关联查询
- 聚合统计
但这些能力都离不开一个前提:表结构存在且设计合理。
3. 线上很多问题并不是查询语法问题,而是结构管理问题
比如:
- 表字段命名混乱
- 类型选错
- 约束缺失
- 改表风险评估不足
- 测试库和正式库结构不一致
所以这部分虽然基础,却非常“工程化”。
二、先分清几个概念:实例、数据库、表
很多初学者一上来就把这些概念混在一起,后面执行命令时容易犯迷糊。
1. MySQL 实例
实例可以理解成一个正在运行的 MySQL 服务进程。它监听某个端口,等待客户端连接。
例如你本机的:
- 主机:
127.0.0.1 - 端口:
3306
就是一个 MySQL 实例的接入方式。
2. 数据库(Database / Schema)
数据库是实例中的逻辑划分单位。一个实例里可以有多个数据库。
例如:
demo_dbblog_systemmall_system
在 MySQL 里,很多时候 database 和 schema 可以近似理解为同一层概念。
3. 表(Table)
表是数据库中真正存放业务记录的对象。
比如在 blog_system 数据库下,可能会有:
usersarticlescomments
4. 一个简单层级关系
MySQL 实例
└── 数据库 demo_db
├── 表 users
├── 表 orders
└── 表 products
把这个层级关系理解清楚,后面执行 USE、SHOW TABLES、CREATE TABLE 就不会乱。
三、数据库操作:先学会管理“容器”
1. 查看当前实例里有哪些数据库
SHOW DATABASES;
你通常会看到类似结果:
information_schemamysqlperformance_schemasys
这些大多是系统库。学习时我们一般自己创建一个练习库,不建议直接在系统库里做实验。
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 - 字符串字段:
username、email - 时间字段:
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;
九、清空表数据:DELETE、TRUNCATE、DROP 不要混淆
这几个操作初学者非常容易搞混。
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. 表名建议见名知义
例如:
usersordersproductsuser_login_logs
尽量避免这种表名:
data1info_tabletestabc
2. 字段名建议统一风格
常见做法是使用小写加下划线:
user_idcreated_atupdated_at
3. 时间字段建议成对出现
很多业务表都会保留:
created_atupdated_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:把 DELETE、TRUNCATE、DROP 混为一谈
这是线上误操作里非常典型的一类问题。语义不同,风险级别也不同。
误区 5:在正式环境随手执行改表
学习环境里觉得很简单,但正式环境改表往往要考虑:
- 数据量大小
- 锁表影响
- 变更窗口
- 回滚方案
- 应用兼容性
所以现在先建立一个习惯:任何结构性变更都要谨慎。
十三、实践建议:把 DDL 操作用得更稳一些
1. 练习时优先使用自己的测试库
不要在系统库里做实验,也不要在不确定用途的现有库里随意建表。
2. 创建对象时尽量写清楚字符集和含义
尤其是在多人协作环境下,默认值不同会带来很多隐性问题。
3. 先“查看”再“修改”
在改表前,先执行:
SHOW CREATE TABLE users;
确认当前结构后再动手,会更稳妥。
4. 删除前先做确认
建议先回答自己两个问题:
- 我删的是数据,还是删的是结构?
- 删除后是否还能恢复?
有了这个停顿动作,很多低级错误都能避免。
5. 养成结构变更留痕的习惯
哪怕是学习阶段,也可以把建表 SQL、改表 SQL 单独整理出来。后面你会慢慢理解,这其实就是数据库版本管理意识的开始。
十四、小结
数据库与表的基本操作,看起来只是建库建表,但它其实是后续所有 MySQL 学习的起点。
这篇文章重点讲清了:
- MySQL 实例、数据库、表之间的层级关系
- 如何创建、查看、切换、删除数据库
- 如何创建表、查看结构、重命名和删除表
- 如何使用
ALTER TABLE对字段和索引做基本调整 DELETE、TRUNCATE、DROP的区别- 表结构管理中最容易踩的坑与更稳妥的实践方式
如果说 SQL 查询是在“读写数据”,那么数据库与表操作做的事情就是“搭建数据的骨架”。骨架清晰了,后面的增删改查、索引、事务才会真正有落点。
📝 版权声明:本文为原创技术博客,转载请注明出处。
如文章中存在错误或不准确之处,欢迎在评论区指正,感谢您的阅读与支持!