MySQL数据库 (三) 表的操作(增删查改),库和表的关系

目录

一、库和表的关系

二、表的操作

创建表

查看表

查看库中有几个表:

查看表的各个字段信息:

查看表的创建信息:

修改表

删除表

总结:

三、总结


在上一篇内容里我们已经完整学习了数据库的增删查改相关 SQL 语法,从创建、修改、删除库到查看库、备份恢复都做了实操练习,接下来我们的学习重心转向数据表,开始系统学习数据表层面的增删查改操作。

一、库和表的关系

我们首先理清数据库和数据表的关系,数据库相当于一个独立的数据文件夹,数据表就是存放在这个文件夹内部的结构化文件,一个数据库中能够创建多张数据表,想要操作某一张表之前,必须先用 use 指令进入它所属的目标数据库,这也是后续所有表操作的前提。

二、表的操作

创建表

create table 表名称 (...)

创建表使用 create table 关键字,整体语法分为字段定义与表配置两部分,括号内部依次填写各个列名与对应数据类型,多个字段之间用逗号隔开,括号外部可以选择性写明字符集、校对规则和存储引擎。其中 field 代表自定义的列名称,datatype 用来限定该字段的数据存储类型,字符集 character set 和校对规则 collate 如果在建表语句里没有手动指定,就会自动沿用当前所在数据库的对应编码配置,存储引擎 engine 不额外声明时,则采用 MySQL 配置文件里预设的默认引擎参数,日常建表大多可以省略末尾三项配置,直接依托库的默认参数生效。

下面我们举个创建表的例子:

我们先执行 create database user_db; 创建用户数据库,再通过 use user_db; 切换进入该库。下面我们就可以建表了:

我们可以只定义 id、name、password、birthday 四个字段,同时用 comment 为每个字段添加注释说明字段含义;

当然我们也可以写完整,完整写法在字段定义末尾额外指定字符集 utf8、校验集 utf8_general_ci 以及 MyIsam 存储引擎。

按下回车后此时表就建立后了,建表成功后去到 Linux 系统 user_db 对应的目录下,可以看到 MyIsam 引擎生成的 user1.frm、user1.MYD、user1.MYI 三个配套文件,分别用来存放表结构、实际数据、索引数据,直观体现数据表在磁盘是以文件形式落地存储。

下面我们再建一个表 user2:

我们在同一个 user_db 库中继续创建 user2 数据表,字段结构和 user1 完全一致,只是调整了末尾配置的书写格式,用 charset=、collate=、engine= 的写法指定编码与存储引擎,同时再把存储引擎更换为 InnoDB。

在建表后我们继续查看 Linux 库目录文件,能直观看出两种引擎的文件差异,采用 MyISAM 的 user1 生成 frm、MYD、MYI 三个文件,frm 统一存放表结构、MYD 存实际数据、MYI 存放索引;而 InnoDB 引擎的 user2 只有 frm 和 ibd 两个文件,ibd 文件会把数据和索引合并存储在一处,这也就说明不同存储引擎在磁盘落地时的文件组成规则并不相同。

查看表

查看库中有几个表:

show tables;

想要查看库内的数据表,要遵循先确认当前所在数据库、再查表的顺序,我们先执行 select database();,语句返回 user_db,确认当前会话处在目标数据库中,之后执行 show tables;,查询结果列出 user1、user2、user3 三张数据表,由此就可以清楚获知 user_db 库内现存所有数据表。

查看表的各个字段信息:

desc 表名称;

我们使用 desc 表名; 查看数据表的字段详情:

我们依次执行 desc user1;、desc user2;、desc user3;,从返回的表格里能看到 Field、Type、Null、Key、Default、Extra 六列信息,Field 代表字段名称、Type 代表对应字段的数据类型,Null 标识字段是否允许存入空值,剩下 Key、Default、Extra 后续学习索引与字段属性时再细化。其中 user1 和 user2 结构一致,都包含 id、name、password、birthday 四个字段,user3 仅保留 name 单个字段,字段数量的区别也在查询结果里直观体现。

这里我们先看前两个字段 后面的几个字段我们后面学到时再讲

查看表的创建信息:

我们可以使用 show create table user1 \G 查看表完整创建信息,末尾的 \G 可以把查询结果改成竖排展示,阅读结构更清晰,这条指令会完整输出原始建表 SQL、字段注释、存储引擎与字符集配置。从执行结果能看到,最终返回的建表语句是 MySQL 服务标准化整理后的格式,自动补齐 DEFAULT NULL、反引号等规范写法,即便我们当初建表时书写格式相对简略,mysqld 经过词法解析后也会统一转换成标准 SQL,同时明确标注出 user1 使用 MyISAM 引擎、utf8 字符集,每个字段附带我们在建表时写入的 comment 注释内容,相比 desc 只能查看字段属性,这条命令可以拿到建表时的全部配置信息。

修改表

实际开发中借助 alter table 完成表结构变更,分为新增字段、修改字段属性、删除字段三类操作,下面我们基于之前 user1、user2 这两个表进行落地使用:

1. ADD 新增字段

alter table 表名 add(字段名 数据类型 默认值,...);

可一次性追加单个或多个字段,示例:alter table user1 add(age int default 0);,给 user1 新增 age 整型字段,默认值为 0。

2. MODIFY 修改字段类型/约束

alter table 表名 modify(字段名 新数据类型 默认值,...);

仅改动字段的数据类型、长度、默认值,不能修改字段名称,示例:alter table user1 modify age tinyint;,把 age 字段从 int 改成 tinyint。

3. DROP 删除字段

alter table 表名 drop(字段名);

移除指定字段和该字段存储的全部数据,示例:alter table user1 drop(age);,删掉刚才新增的 age 字段。


下面举个重命名的修改例子,比如我们对 user1 这个表进行重命名命名为 user。

alter table 原名字 rename to 目标名字;

我们先通过 desc user1; 查看表结构,确认 user1 包含 id、name、password、birthday 四个字段,随后执行 alter table user1 rename to user; 完成数据表重命名,该语句可以把原表名 user1 修改为 user,语句执行无报错后,再使用 show tables; 核查库内表列表,查询结果里原 user1 消失、新名称 user 出现,代表表重命名操作生效。另外还有简写写法 alter table user1 rename user;,可以省略 to 关键字,效果完全一致。

下面我们在表中插入内容:

我们先使用 insert into user values(1,'张三','12345','2010-1-1'); 和 insert into user values(2,'李四','54321','2015-1-1'); 两条语句向 user 表完整插入两条全字段数据,执行 select * from user; 查询可以看到两条已录入的用户信息。

下面我们想再新增一个列,这个列中的字段用来保存某种路径(比如说图片路径):

执行 alter table user add image_path varchar(128) comment '这个是用户的头像路径' after birthday;,语句里 after birthday 控制新字段排在 birthday 字段的后面,新增字段默认值为 NULL,再次全表查询时,原有两条数据的 image_path 列自动填充为空,字段添加生效。

补充:after 指定字段是精准控制新增字段位置的语法,若省略该后缀,新字段默认追加在整张表最后一列。

下面如果我们想对某一个指定的列的属性做修改呢? 比如说将列的长度从20改为60

我们先执行 desc user; 查看字段原有属性,发现 name 字段原本是 varchar(20),随后用 alter table user modify name varchar(60); 修改字段类型长度,modify 语法只变更字段的数据类型、长度、约束,不能修改字段名称。修改完毕再次 desc 查表,name 类型变为 varchar(60),表内已存在的张三、李四数据不受改动影响,只变更表结构属性、不改动原有存储数据。

补充:若需要同时改字段名 + 字段类型,改用 alter table user change 旧字段名 新字段名 新类型;。

再下来比如我们想删除其中一列,比如 password 密码这一列:

我们先通过 desc user; 查看表结构,确认存在 password 字段,再用 select * from user; 查看表里存储的密码数据,随后执行 alter table user drop password; 删除该字段,这条指令在移除字段定义的同时,会连带清空该列所有原有数据。

执行结束后再次使用 desc 和 select 核查,表结构与查询结果里均不再出现 password 列,字段和对应数据全部被清除,正因删除操作会永久丢失数据,日常开发里一般谨慎执行删字段操作。

修改表名字:

我们前面说过,如果要修改数据表的名称,先用 alter table user rename to User; 把 user 重命名为 User,to 关键字可省略,简写 alter table User rename users; 再次将表名改成 users,执行 show tables; 就能校验改名结果。

那现在如果我们想修改某一字段的名称呢? 比如我们想把 name 这个字段名称改为 xingming 呢?

修改字段名称需要使用 change 语法,执行 alter table users change name xingming varchar(60) DEFAULT NULL; ,该语法必须依次填写原字段名、新字段名、字段完整数据类型与约束,哪怕字段类型不需要改动也必须重写类型定义,执行 desc users; 查看表结构,原 name 字段成功替换为 xingming,原有数据不受修改影响。

补充区分:modify 仅改字段属性不能改名,change 既能改字段名也能同步修改字段类型。

删除表

我们通过 drop table user2;、drop table user3; 两条语句完成数据表删除,执行后不仅 MySQL 库内的表被移除,Linux 磁盘对应目录里该表的配套物理文件也会同步被系统删除,表结构与内部存储的数据全部永久清除。

这类建表、改表、删表、删库的操作都属于 DDL(数据定义语言),它作用于数据库和数据表的结构本身,不会直接操作表里存储的业务数据;而之前 insert 插入数据、后续 update/delete 改删数据属于 DML(数据操纵语言),是针对表中记录做改动。

总结:

数据库处在技术架构底层,表名、表的字段结构、数据表是否存在都会直接关联上层业务程序,一旦随意修改表结构、重命名或删除数据表,所有对接该库的后端代码、接口、项目配置都需要同步改动,轻则程序报错无法读写数据,重则直接造成业务瘫痪、数据丢失,所以生产环境里执行 alter、drop 这类结构变更 SQL 前,要提前备份数据、做方案评审,尽量规避随意改表删表的行为。

三、总结

本文系统介绍了MySQL数据表的增删查改操作,重点讲解了库表关系、表的基本操作和表结构修改。主要内容包括:1. 库表关系:数据库相当于文件夹,数据表是其中的结构化文件,一个库可含多张表;2. 表操作:创建表(定义字段、数据类型)、查看表(结构、创建信息)、修改表(增删改字段、重命名)、删除表;3. 注意事项:表结构变更会影响上层应用,生产环境需谨慎操作并做好备份。通过实际案例演示了不同存储引擎的文件差异,以及ALTER TABLE的各种用法。

谢谢大家的观看!

相关推荐
xsc6996751 小时前
Milvus实战:快速上手向量数据库
数据库·milvus
艾莉丝努力练剑1 小时前
【Qt】事件
服务器·开发语言·网络·数据库·qt·tcp/ip·计算机网络
Bert.Cai1 小时前
Oracle简介
数据库·oracle
洛水水1 小时前
图床项目实现:注册登录 + 文件上传等功能的完善
网络·c++·mysql·图床
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.41|多租户不是一个功能,是一次手术
服务器·数据库·系统架构·ai编程·ai工作流·企业ai
艾莉丝努力练剑1 小时前
【QT】窗口
运维·网络·数据库·qt·计算机网络·microsoft
元拓数智2 小时前
跨库NL2SQL可信落地的核心:用IntaLink破解数据关系“迷雾”
数据库·人工智能·ai·nlp·agent·llama
unicrom_深圳市由你创科技2 小时前
MySQL 慢查询日志深度分析:从 “识别慢 SQL” 到 “定位瓶颈根因”
sql·mysql·adb
worilb2 小时前
Spring Cloud 学习与实践(6):Nacos 配置中心
数据库·学习·spring cloud