目录
表的操作
创建表
创建表案例
查看表结构
查看表结构案例
查看历史上表的创建语句
修改表
修改表实例
新增列属性
修改列属性
删除列属性
修改列名
修改表名
删除表
表的操作
创建表
语法:
CREATE TABLE (if not exists) `table_name` (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎; -(这一串可以省略,MySQL会自动添加)
- field:表示列名。
- datatype:表示列的类型。
- character set:字符集,如果没有指定字符集,则以所在数据库的字符集为准。
- collate:校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准。
创建表案例
(对于数据类型此文不讲)
首先需要确保在数据库中,在做下述操作。
create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;
这个时候再看我们的数据库内部就会发现有了三个文件。
- users.frm:表结构
- users.MYD:表数据
- users.MYI:表索引
换而言之,如果存储引擎是MyISAM,它是一个数据库表对应的磁盘文件是三个(前缀一样表示一种表)。
查看表结构
desc 表名;
查看表结构案例
desc users;
#问:commend字段去哪了?
查看历史上表的创建语句
输入:
show create table users;
输出:
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
`id` int(11) DEFAULT NULL COMMENT '用户的id值',
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
如果觉得分割碍眼可以换为\G。
mysql> show create table users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL COMMENT '用户的id值',
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
这样就可以按照我们方便观看的精确的按行显示。可以发现这个建表与我们刚刚所写的,并不是完全的一样的。因为我们的建表的SQL语句,最终被下发到mysqld,然后mysqld内部做词法语法分析,以及对我们的MySQL做优化。
比如,它发现我们的数据库的字符集和校验规则就是utf8,于是就没有必要指明了,其就优化为默认的。编译器发现id、name、……,这些没有带反应号,于是优化的规范补上,以及SQL语句关键字的大小。
#问:如果将存储引擎更改一个进行使用?
create table if not exists `students`(
name varchar(20) ,
age int ,
number varchar(32),
sex char(1)
)engine=InnoDB default(可以省略) charset=utf8;
我们可以这么变化的书写创建方式,就是因为背后有MySQL进行SQL语句的专业化。
这个时候再看我们的数据库内部就会发现有了两个文件。
换而言之,如果存储引擎是InnoDB,它是一个数据库表对应的磁盘文件是两个(前缀一样表示一种表)。
#:数据库里的显示一张表就是逻辑结构,磁盘里文件是多个文件就是物理结构,mysqld服务保证物理到逻辑的抽象。
修改表
新增一列属性:
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);
#:一个表结构跟数据库一样,要建就提前建好,前期的话可以去改,但是最好的是里面的数据都是测试数据,一旦正式上线了,这个表就绝对不能改。因为一改就很容易造成影响,必将完整的大量行数数据,突然增加一列属性,也就必定此相对于其他列属性,就必定空很多数据 -- 数据库这里前期工作一定要做好不能出现任何的纰漏,不能贸然草率的建表,然后后期填填补补,项目就很容易出问题。
修改表实例
- 在users表添加二条记录(超出范围,此文不讲,只为展示)
insert into users (id, name, password, birthday) values(1,'a','b','2023-05-18'),(2,'b','c','2023-05-19');
新增列属性
- 在users表添加一个字段(新增一列属性),用于保存图片路径
即,上述的新增一列属性。
alter table users add image_path varchar(128) commit '该用户的头像图片的路径' after birthday;
通过查看历史上表的创建语句,可以发现它除了将我们新增的一列属性插入到表当中,其实构建表的SQL语句也发生了改变。所以MySQL是非常强的,它能准确的识别到,我们修改了哪一个表,我们改的表的结构,于是便将整个SQL语句都变了。
所以在外部看来,我们可能将表结构改了很多次,但是最终在MySQL看来就用一句SQL一次创建了表。
mysql> show create table users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL COMMENT '用户的id值',
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日',
`image_path` varchar(128) DEFAULT NULL COMMENT '该用户的头像图片的路径'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
修改列属性
-
修改name,将其长度改成60
alter table users modfity name varchar(60);
mysql> show create table users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL COMMENT '用户的id值',
`name` varchar(60) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日',
`image_path` varchar(128) DEFAULT NULL COMMENT '该用户的头像图片的路径'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
我们可以发现,虽然将一列属性当中的类型进行了修改,但是name原来的comment描述也没有了。 所以MySQL当中对列进行修改,其实是要将新属性全部覆盖式的覆盖到老属性上。
alter table users modify name varchar(60) comment '这是新的用户名';
通过查看历史上表的创建语句。
mysql> show create table users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL COMMENT '用户的id值',
`name` varchar(60) DEFAULT NULL COMMENT '这是新的用户名',
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日',
`image_path` varchar(128) DEFAULT NULL COMMENT '该用户的头像图片的路径'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
删除列属性
- 删除id列。
alter table users drop id;
删除库的后果是很严重的,一定要考虑到,删除的后果是否可以进行承担。
注意:当一个表只剩一列的时候,MySQL就不允许让我们继续删除了,如果还是要删除,那就使用删除表的指令来进行删除。
修改列名
- 将name列修改为xingming
alter table users change name xingming varchar(60) comment '这个新增的用户'; -- 新字段需要完整
定义
换而言之就是,其修改列名的方式不是我们想的那样,而是把整个一列的属性进行了覆盖修改。
通过查看历史上表的创建语句。
mysql> show create table users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`xingming` varchar(60) DEFAULT NULL COMMENT '这个新增的用户',
`password` varchar(32) DEFAULT NULL COMMENT '用户的登陆密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日',
`image_path` varchar(128) DEFAULT NULL COMMENT '该用户的头像图片的路径'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
修改表名
-
修改表名为user_set
alter table users rename to user_set; -- to:可以省掉
与此同时对应的数据库中,也发生了变化。
删除表
语法格式:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name(删多个表','隔开)] ...
如果要删除一个表,那么这个表的前提条件一定是存在的。和数据库一样,删的时候一定要慎重,删除的时候一定要清楚自己在干什么,并且删除的后果是否是自己能够承担的。
drop table students, user_set;
通过查看历史上表的创建语句。
我们在删除一个表的时候,不仅仅是将表结构给删除了,我们以前创建这个表的语句同样也被我们删除了(一个表的创建语句存在,前提是这个表也存在)。