创建库和表
MySQL 用 CREATE DATABASE / TABLE 建库建表:指定编码与引擎、use 切换库、desc 看结构、常见报错与 drop 注意事项。
本页目录
前两天解决了「登录」和「地图」,今天开始真正动手搭仓库:创建数据库(库),再在库里创建表。学完你应能独立写出建库、建表语句,并用 desc 检查结构。
系列:MySQL 入门到查询 · 第 4 / 17 篇(第 4 天 · 4 月 24 日)
上一篇:登录与库表结构
下一篇:修改表结构
总目录:系列索引
环境说明
- 已完成第 2~3 天:能登录 MySQL,理解库/表/行/列
- 全部操作在
mysql>提示符下进行 - 练习库统一用
train(后续篇 SQL 均写use train;,请不要改成别的库名,以免对不上)
1. 先分清:什么在改结构
| 类型 | 英文 | 干什么 | 今天学吗 |
|---|---|---|---|
| DDL | Data Definition Language | 建/改/删库和表的结构 | 是(建与删) |
| DML | Data Manipulation Language | 往表里插/改/删数据 | 明天起 |
| DQL | Data Query Language | 查询数据 | 后面 |
今天语句都以 CREATE 开头,属于「定义结构」。
2. 与库有关的常用命令
2.1 查看有哪些库
show databases;
刚安装好的 MySQL 8 常见系统库(名字可能略有差别):
| 库名 | 作用(了解) |
|---|---|
information_schema | 元数据信息 |
mysql | 账号、权限等系统信息 |
performance_schema | 性能相关 |
sys | 系统视图辅助 |
警告:系统库不能删、不要随意改。练习请新建自己的业务库。
2.2 创建库
语法:
create database 库名;
指定文字编码:
create database 库名 charset 编码;
示例:
create database train;
成功提示类似:
Query OK, 1 row affected
再建一个用 gbk 的库(对比用):
create database train_gbk charset gbk;
2.3 进入库(切换「当前文件夹」)
use train;
成功提示:
Database changed
查看当前在哪个库:
select database();
| 时机 | 可能的结果 |
|---|---|
刚登录、还没 use | NULL(还不在任何业务库) |
use train; 之后 | train |
2.4 查看库的编码
show create database train;
结果里注释或 DEFAULT CHARACTER SET 附近,会写明编码(常见 utf8mb4)。
show create database train_gbk;
应能看到 gbk。
2.5 编码继承(建表前记牢)
建库:不写 charset → 用 MySQL 默认(本机常为 utf8mb4)
建表:不写 charset → 继承所在库
所以:库的编码建错,后面表和数据也容易跟着乱——业务库建库时就写上 charset utf8mb4 更稳妥。
create database train charset utf8mb4;
若库已存在且编码不对,可用(进阶,改完只影响以后新建的表):
-- alter database train charset utf8mb4;
3. 创建表
3.1 语法骨架
create table 表名(
列名 类型,
列名 类型,
...
);
可选:指定编码与存储引擎:
create table 表名(
列名 类型,
列名 类型
) charset=utf8mb4 engine=InnoDB;
| 部分 | 说明 |
|---|---|
表名 / 列名 | 建议英文 + _,见名知意 |
类型 | 第 3 天学过的 int / varchar(n) / double / datetime 等 |
| 逗号 | 列与列之间用英文逗号分隔 |
分号 ; | 整句结束 |
charset | 不写则继承库 |
engine | 不写常用默认 InnoDB |
3.2 为什么要换行写
课堂笔记里的好习惯:
- 复杂语句先在记事本里写好,检查后再贴到
mysql> - 每一列占一行,报错时容易对上行号
3.3 实战:商品表 goods
设计:
| 列名 | 类型 | 含义 |
|---|---|---|
id | int | 商品编号 |
name | varchar(30) | 商品名称 |
price | double | 价格 |
sale_date | datetime | 上架日期 |
在 train 库中执行:
use train;
create table goods(
id int,
name varchar(30),
price double,
sale_date datetime
);
成功:Query OK。
再建一张更简单的练习表:
create table phone(
id int,
brand varchar(20),
price double
);
3.4 建表时指定编码和引擎(对比)
create table goods_gbk(
id int,
name varchar(30)
) charset=gbk engine=MyISAM;
入门建议:新表用默认
InnoDB+ 库的utf8mb4即可;MyISAM仅作了解。
4. 检查:库里有哪些表、表长什么样
4.1 列出当前库的表
show tables;
| 输出 | 含义 |
|---|---|
Empty set | 还没有任何表 |
列表中出现 goods、phone | 创建成功 |
4.2 查看表结构:desc
desc goods;
典型输出(示意):
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| price | double | YES | | NULL | |
| sale_date | datetime | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
| 列 | 先理解成 |
|---|---|
Field | 列名 |
Type | 数据类型 |
Null | 是否允许为空(约束后面细讲) |
Key | 是否有键(主键等,后面讲) |
Default | 默认值 |
Extra | 额外属性(如自动编号) |
desc 也可写成 describe 表名;。
4.3 查看建表语句 / 引擎 / 编码
show create table goods;
最后一行常见:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
说明:用 InnoDB,编码继承了库(utf8mb4)。
show create table goods_gbk;
对比 ENGINE 与 CHARSET 是否与你建表时一致。
4.4 了解:数据到底存在哪个文件夹(Windows)
show variables like '%datadir%';
结果路径常见类似:
C:\ProgramData\MySQL\MySQL Server 8.0\Data\
资源管理器打开后,你通常能看到:
- 以库名命名的文件夹(如
train) - 进入后可见表相关文件;InnoDB 表常见
.ibd
只参观即可,不要手工删除或改这些文件;管理数据请用 SQL。
5. 完整跟练脚本(可整段复制)
建议在记事本写好后分段执行:
-- 1) 登录后
show databases;
select database();
-- 2) 建库并进入
create database train charset utf8mb4;
use train;
select database();
show create database train;
-- 3) 建表
create table goods(
id int,
name varchar(30),
price double,
sale_date datetime
);
create table phone(
id int,
brand varchar(20),
price double
);
-- 4) 检查
show tables;
desc goods;
show create table phone;
期望
show tables;能看到goods、phonedesc goods;四列类型正确select database();为train
6. 删除表与删库(慎用)
drop table 表名;
drop database 库名;
示例(仅当你确认练习库可删时):
drop table goods_gbk;
show tables;
drop database train_gbk;
show databases;
警告:
drop会删掉结构,表里的数据也没了。
警告:绝不 drop 系统库mysql/sys/information_schema/performance_schema。
删除表和「清空表数据」不同:清空数据在后面 DML 会讲 truncate;drop 连表定义一起去掉。
7. 常见报错怎么读
7.1 You have an error in your SQL syntax
| 检查点 | 说明 |
|---|---|
at line N | 大约第 N 行附近有问题(也可能是上一行末尾) |
to use near '...' | 引号里是出错位置附近的片段 |
| 英文逗号 / 分号 | 是否漏了、写成了中文逗号 , |
| 括号 | create table 的 ( ) 是否成对 |
| 类型 | varchar 是否写了 varchar(30) 这种长度 |
7.2 Database exists / Table already exists
库或表名重复。可以:
show databases;
show tables;
换一个名字,或(确认是练习对象后)先 drop 再建。MySQL 里也可写成(较新版本支持):
create database if not exists train charset utf8mb4;
create table if not exists phone(
id int,
brand varchar(20),
price double
);
7.3 No database selected
ERROR 1046 (3D000): No database selected
原因:还没 use 库就建表/查表。
use train;
show tables;
7.4 Unknown database
use db999;
若库不存在会报 Unknown database。先 show databases; 核对名字。
8. 命名与书写习惯(少踩坑)
| 习惯 | 说明 |
|---|---|
| 英文命名 | 库表列名用 goods、sale_date,避免中文名 |
| 小写 + 下划线 | 与系列文章一致,好读好搜 |
| 关键字不冲突 | 不要用 order、user 等直接当列名;必须用时加反引号 `order`(入门可先避开) |
| 语句分号 | 每一句以 ; 结束 |
| 大小写 | 关键字大小写不敏感(CREATE/create 皆可);库名表名在 Linux 服务器上可能区分大小写,练习时统一小写更省心 |
9. 速查表
| 目标 | 语句 |
|---|---|
| 看所有库 | show databases; |
| 建库 | create database 库名; |
| 建库并指定编码 | create database 库名 charset utf8mb4; |
| 进入库 | use 库名; |
| 当前库 | select database(); |
| 看库编码 | show create database 库名; |
| 建表 | create table 表名(列 类型, ...); |
| 看当前库表 | show tables; |
| 看表结构 | desc 表名; |
| 看表引擎/编码 | show create table 表名; |
| 删表 / 删库 | drop table / drop database(慎用) |
10. 今天的练习清单
-
create database train charset utf8mb4;并use train; - 创建
goods(4 列)与phone(3 列) -
show tables;看到两张表 -
desc goods;核对列名与类型 -
show create table goods;确认ENGINE/CHARSET - (可选)再建
train_gbk charset gbk,用show create database对比 - (可选)
show variables like '%datadir%';并在资源管理器里「看一眼」
常见错误
易错:没
use就create table,报 No database selected。
易错:忘记分号,提示符变成->。
易错:中文逗号导致语法错误。
易错:varchar不写长度。
易错:误 drop 系统库或练习数据未备份就 drop 业务表。
易错:库表名用了中文或大写混用,后面环境一换就不一致。
小结
- 建库:
create database train charset utf8mb4;,再用use train;进去。 - 建表:
create table 表名(列名 类型, ...);,一列一行更清晰。 - 检查:
show tables;、desc 表名;、show create table 表名;。 drop很危险,系统库绝对不删。- 下一篇学习 ALTER 修改表结构:改表名、加列、改类型等。