目录
思路:我们在创建好了数据库之后还不能进行数据的存储,因为数据库相当于一个目录。我们需要在目录下建立对应的文件,然后再把数据存放在文件中。所以学习了库的操作之后,我们学习表的操作。
需要明确的是,不管是之前讲到的库的操作还是这里讲到的表的操作,实际上都是DDL。(都是在为之后的数据存储搭架子)
这里对表的操作主要从以下的方面来进行阐述:
一 创建表
语句
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
理解
创建表 create table +表名+(属性名+属性类型)。这是最基本的一个形式。后续的字符集校验规则存储引擎都是可选的。如果我们不显示写出的话,也是没有关系的,因为表是在数据库的基础上创建的,所以数据库下的规则是什么,一般表也会与之保持一致的。
注意
属性名+属性类型 如果有多个的话,最后一个字段值之前都是末尾带, 最后一个不跟标点
示例
创建一个学生表
mysql> create table student(
-> name varchar(20),
-> age int,
-> sex int,
-> tele varchar(11)
-> )character set utf8 collate utf8_bin engine MyISAM;
创建一个教师表
mysql> create table teacher(
-> name varchar(20) comment '名字',
-> age int comment '姓名',
-> positon varchar(20) comment '职位'
-> )engine InnoDB;
我们观察可以看出,对比学生表,教师表有一个comment的描述,这是啥
comment
其实相当于github commit操作提交的一个描述说明,这个也是一个描述,他不会对表的结构产生影响,但是这样增加了表的可读性。
存储引擎
形式
主要理解存储引擎:InnoDB和MYISAM对数据表的影响
影响
数据表存储的时候分为物理结构和逻辑结构,逻辑结构就是MySQL里面对应的表结构。物理结构其实是对应的mysql的目录下的几个文件
(前缀是一样的是表名,标识同一个表)
如果是MyISAM存储引擎的话,默认是会有这样三个磁盘文件存储表的。分别是以.frm,.MYD,.MYI为后缀的
如果是InnoDB存储引擎的话,默认是会有这样两个磁盘文件存储表的。分别是以.frm .ibd为后缀的
为什么
物理上存储了两个表,被数据库解释之后变成了一张逻辑上的表给我们显示出来。这个是由mysqld的服务来保证的,他会提取相同的文件名,如果是一张表的话,后续再做处理,在逻辑上显示出一张表的结构
表是由物理结构和逻辑结构两种存储结构的。
存储引擎有:InnoDB和MyISAM两种。
不同的存储引擎使得表在物理磁盘上存储的形式不同。
二 查找表
查找对应数据库下的所有表(宏观)
语法
mysql> show tables;
示例
我们可以看到有两行,就表示我们在test1数据库中由student和teacher两个表
查看表的列信息(微观)
如果我们想查看关于创建好了的表的更多的细节,我们可以用这个语句
语法
desc+对应的表名
mysql> desc student;
这样子我们就可以知道,student表中,fiele(字段名) type(字段类型) Null(是否允许为空) Default(默认值) Extra(扩充)
注意
关于默认值中的NULL 和‘ ’的区别:
如果是NULL的话,就表示这个数据没有,是空的
但是如果是‘ ’的话,这个数据还是有的,只不过值为空
查看创建表的操作(具体)
这个是和之前查看创建库的操作的命令是相同的,带上\G 方便显示阅读(如果不写这个就是可视化的方式按行显示)
语法
mysql> show create table student \G
示例
理解
如果有带上对应commen的话,show操作也会显示对应的comment语句
我们可以看到,数据库自动把我们的操作做了一个规整化的处理:比如大小写 ·· 字符集和校验编码的设置。这也就可以理解为什么我们指定字符集和校验编码的时候格式可以不一样,因为底层的数据库会去帮我们做一个规范性的工作
总结
对表的查看有三个操作,按照粒度划分,可以直接查看有哪些表(show),一张表有哪些对应的属性(desc),历史上创建表的时候做了什么操作。
三 修改表
其实,我们在创建数据库和表的时候,一般在最开始就要把工作做好。因为如果后续有了数据,对表的一些修改操作,会影响对应存储的数据的。
但是我们有时候确实有这样的需求,也可以来了解一下修改表的时候到底是怎么操作的。
语法
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]…);
ALTER TABLE tablename MODIFY (column datatype [DEFAULT expr][,column
datatype]…);
ALTER TABLE tablename DROP (column);
我们可以对字段值进行增加,删除,修改。这里的修改指的是表结构上的修改。我们用ADD,MODIFT,DROP语句对对应的属性值进行修改
基本的思想就是
alter table+表名 并且指明如何进行修改
准备工作:我们先在student表中插入两条数据,在这个基础上进行修改
增加
语法
mysql> alter table student add QQ vachar(20) comment'学生的QQ账号';
add后续跟着的是和创建表的时候()内部一样的东西
这样我们就完成了一个字段值的添加,并且刚创建好的字段值中数据是空的
总结
如何写?alter table +表名+add (后续跟着的和创建表小括号内的东西一致)
影响?数据是空的
修改
①如果我们想修改字段值的类型该怎么办?
modify
因为这里的修改是覆盖式的修改,如果我们曾经添加了对应的描述字段,如果想保留,修改的时候需要一并写出。否则默认就会被覆盖
语法
mysql> alter table student modify name varchar(30);
alter table+表名+modify跟上对应要修改成的新的内容(覆盖式修改)
确实被修改了,并且对应的comment描述没有了
②修改名字
rename
虽然数据库的名字不允许被修改,但是表的名字可以修改
语法
mysql> alter table teacher rename teacher1;
示例
成功把表的名字从teacher变成了teacher1
由于修改的是表的名字,没有修改内容,所以对应的0行受到影响
修改表名字逻辑和物理上的表名都被修改了
③ 修改列名字
修改名字的时候是需要带上对应的属性值的,如果不需要对属性值修改就保持和之前的一样。
语法
change
mysql> alter table teacher1 change name tea_name varchar(20);
我们可以理解成修改名字的时候也是整行记录覆盖式地修改的,因此需要写全
3 删除
如果删除了某个字段值,与之相关的所有的数据也就没了。删除的时候只需要去指定需要删除的列明,就会自动被删除了
语法
mysql> alter table drop name;
注意
如果删除到只剩下一个字段值的时候还想删除就无法用这个命令进行删除了。因为如果把最后一个字段值删除,这个表就没有用了。需要把整个表drop掉
总结
新增:新增一列完全新增,数据被设置成NULL add
删除:对应的数据也被清空 drop
修改:覆盖修改 可以修改表名 列名 属性类型 change rename modify
四 删除表
语法
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
理解
drop+对应的表名即可
如果要删除多个表的话,用,分割开来。
示例
本质
删除一个表的本质实质上是把曾经对表的创建时候的操作语句全部都删除掉。这里也可以理解成如果我们要查看一个表的创建操作语句,前提是这个表必须存在
注意:
删除要慎重!!!