学数据库,很多人一开始最喜欢做的事,就是打开 Navicat,然后一路右键:
- 新建数据库
- 新建表
- 填字段
- 点确定
这么做不是不行,问题是你会发现一个很现实的情况:
一旦离开图形界面,你就不会了。
尤其是做网络安全、靶场搭建、环境恢复、SQL 注入分析、数据库排障时,很多场景根本不会给你一个舒服的图形化界面。这个时候,真正有用的是你能不能自己写出一条完整的建表 SQL。
今天这篇文章,我们就把MySQL 创建数据库表这件事讲透,讲明白,而且尽量讲得接地气。你不需要一开始背太多理论,只要把这篇内容跟着练一遍,至少你会真正搞懂这些问题:
- 数据库表到底是什么
- 行和列在数据库里分别叫什么
- 表名该怎么起
- 字段该怎么设计
int、varchar、char、date分别怎么用- 怎么用 SQL 创建一张学生表
- 怎么查看表结构
- 怎么查看表里有没有数据
- 怎么反查建表语句
另外,文章里我会把容易混淆的地方一起讲清楚,顺手把一些常见写法纠正过来,避免初学时越学越乱。
一、数据库表到底是什么?别一上来就记术语,先把画面感建立起来
你平时在 Excel 里见过表格吧?
比如一张学生信息表,可能长这样:
| 学号 | 姓名 | 性别 | 年龄 |
|---|---|---|---|
| 17071401 | 张三 | 男 | 20 |
| 17071402 | 李四 | 女 | 19 |
这其实就是数据库表最容易理解的样子。
数据库里最常见的数据组织形式,就是这种二维表结构。
也就是:
- 横向一行一行
- 纵向一列一列
这就是关系型数据库管理数据的基本方式。
在数据库里,行和列怎么叫?
这个必须记住:
- 一行数据,叫一条记录
- 一列数据,叫一个字段
比如下面这条数据:
17071401 张三 男 20它在数据库里,就是一条完整的学生记录。
而“学号”“姓名”“性别”“年龄”这些列名,就是字段。
为什么这个概念特别重要?
因为你后面无论做这些事:
- 建表
- 插入数据
- 写查询语句
- 分析 SQL 注入
- 看后台用户表
- 理解 CMS 数据结构
本质上都在围绕两个东西打转:
- 字段
- 记录
二、创建表之前,先学会设计表,不然 SQL 写出来也没意义
很多人一上来就急着写:
CREATETABLE...但真正的问题是:
你这张表到底要存什么信息?
比如我们现在准备创建一张学生表,那你至少得先想清楚这张表要包含哪些字段。常见设计一般会有:
- 学号
- 姓名
- 性别
- 年龄
- 入学日期
- 班级名称
- 邮箱
你会发现,建表这件事其实不是先写 SQL,而是先做“信息建模”。
也就是说:
你想保存什么数据,就先设计什么字段。
表名怎么起?
表名这事,看起来小,实际很影响后期维护。
很多公司喜欢给表加一个前缀,比如:
t_student t_user t_order这里的t_就是table的缩写,表示“这是一张表”。
这不是强制规定,但确实是开发里很常见的一种命名习惯。
如果你不喜欢加前缀,也可以直接叫:
student user order都可以。
但建议是:
- 尽量见名知意
- 尽量统一风格
- 别今天
student,明天tb_student,后天t_stu
三、先创建数据库,再创建表,这个顺序别搞反了
表是放在数据库里的,不是凭空存在的。
所以在创建表之前,通常要先准备好一个数据库。
比如我们先创建一个测试数据库,名字叫:
mytestdb为什么字符集建议直接选 utf8mb4?
这是初学者最容易忽略,但后面最容易踩坑的地方。
建议创建数据库时直接使用:
utf8mb4原因很简单:
- 它对中文更友好
- 能更完整支持 Unicode
- 能兼容更多字符
- 比 MySQL 早期那个“残血版 utf8”更稳
很多人以为 MySQL 里的utf8就是完整 UTF-8,其实不是。
在 MySQL 中,真正更完整、更稳妥的选择,一般是:
utf8mb4创建数据库 SQL 示例
CREATEDATABASEmytestdbDEFAULTCHARACTERSETutf8mb4;运行结果示例
Query OK, 1 row affected (0.01 sec)这说明数据库已经创建成功。
切换到这个数据库
USEmytestdb;运行结果
Database changed只有切换到目标数据库后,后续创建的表才会建在这个库里。
四、创建表最核心的一步:字段和类型怎么写
真正开始建表时,最关键的不是表名,而是字段设计和类型选择。
因为数据库并不是一个“随便丢数据”的仓库。
每个字段都要告诉 MySQL:
- 这个字段叫什么
- 它存什么类型的数据
- 允许多长
- 以后怎么解释
我们准备创建的学生表字段如下
| 字段名 | 含义 | 建议类型 |
|---|---|---|
| sno | 学号 | int |
| sname | 姓名 | varchar |
| sex | 性别 | char | </