文章目录
- 表的基本操作
- 表的创建
- 表的删除
- MySQL中的数据类型
- 整数类型
- 浮点数类型
- 定点数类型
- 日期和时间类型
- 字符串类型
- char
- varchar
- text
- 二进制类型
- DDL语句
- 查看建表语句
- 修改表名
- 新增字段
- 修改字段(名+类型)
- 修改字段(仅类型)
- 删除字段
表的基本操作
在介绍DDL和DQL的操作语句之前, 我们先来熟悉一下表的基础相关操作
表的创建
下面的sql语句是创建一个学生表
create table if not exists t_student(
id int,
name varchar(25),
gender char(1) default '男'
);
插入几条数据进行测试
# default是默认约束
insert into t_student(id, name, gender) values (1, 'll', '男');
insert into t_student(id, name) values (2, 'rr');
insert into t_student(id, name, gender) values (3, 'hh', '女');
select * from t_student;
# 测试结果
+------+------+--------+
| id | name | gender |
+------+------+--------+
| 1 | ll | 男 |
| 2 | rr | 男 |
| 3 | hh | 女 |
+------+------+--------+
表的删除
只需要下面的sql语句即可
# 如果数据库中没有这张表就会报错
drop table t_student;
# 即使数据库中没有这张表也不会报错
drop table if exists t_student;
MySQL中的数据类型
之前我们并没有介绍MySQL中的数据类型都有什么, 我们下面介绍一下MySQL中的数据类型
数据类型(data_type)是指系统中所允许的数据的类型。数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。如果使用错误的数据类型可能会严重影响应用程序的功能和性能,所以在设计表时,应该特别重视数据列所用的数据类型。更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。MySQL 的数据类型可以分为整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型、二进制类型等。
整数类型
tinyint:1个字节(微小整数)smallint:2个字节(小整数)mediumint:3个字节(中等大小的整数)**int(integer):4个字节(普通大小整数)**bigint:8个字节(大整数)
浮点数类型
float:4个字节,单精度(最多5位小数)double:8个字节,双精度(最多16位小数)
定点数类型
decimal:定点数类型。底层实际上采用字符串的形式存储数字。语法:decimal(m, d)例如:decimal(3, 2) 表示3个有效数字,2个小数。(有效数字最多65个,小数位最多30个)
日期和时间类型
year:1个字节,只存储年,格式YYYYtime:3个字节,只存储时间,格式HH:MM:SS / HHMMSSdate:3个字节,只存储年月日,格式:YYYY-MM-DDdatetime:8个字节,存储年月日+时分秒,格式:YYYY-MM-DD HH:MM:SS(从公元1000年公元9999年)timestamp:4个字节,存储年月日+时分秒,格式:YYYY-MM-DD HH:MM:SS(从公元1980年公元2040年)或者格式为 YYYYMMDDHHMMSS(采用这种格式不需要使用单引号,当然你使用单引号也可以)
字符串类型
char
char(m): m长度是0~255个字符。固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。m表示列的长度,范围是 0~255 个字符。例如,CHAR(4) 定义了一个固定长度的字符串列,包含的字符个数最大为 4。当插入的字符长度大于4,则报错(除非超过4个长度之后都是空格字符,则空格字符会自动被删除用来保证插入的成功)。
varchar
varchar(m): m长度是0~16383个字符长度可变的字符串。varchar 的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。例如,varchar(50) 定义了一个最大长度为 50 的字符串,如果插入的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和一个字符串结束字符。varchar在值保存和检索时尾部的空格仍保留。
text
text类型:
-
tinytext 表示长度为 255字符的 TEXT 列。
-
text 表示长度为 65535字符的 TEXT 列。
-
mediumtext 表示长度为 16777215字符的 TEXT 列。
-
longtext 表示长度为 4294967295 或 4GB 字符的 TEXT 列。
enum类型:
-
语法:<字段名> enum(‘值1’,‘值2’,…)
-
该字段插入值时,只能是指定的枚举值。
set类型:
-
语法:<字段名> set(‘值1’,‘值2’,‘值3’,…) 注意:值不可重复。
-
该字段插入值时,只能是指定的值。
二进制类型
BLOB类型:二进制大对象,可以存储图片、声音、视频等文件。
-
blob:小的,最大长度65535个字节
-
mediumblob:中等的,最大长度16777215个字节
-
longblob:大的,最大长度4GB的字节
这里注意一下, 使用命令行是无法进行BLOB类型的添加的, 需要调用Java程序中的IO流相关辅助实现
还有就是日常开发中一般是不会在数据库中保留一个视频这种非常大的文件的, 一般都是保存一个字符串
视频文件远程托管到服务器上, 这个字符串就是这个托管的地址, 所以一般保留的都是varchar/char
DDL语句
DDL语句是我们SQL语句中的一种, 下面是DDL的相关简介, 其实也就是修改表本身的结构, 其实这个内容相对不是特别重要, 因为开发的过程中, 当以及拥有庞大用户量之后, 修改表的结构其实时一件很危险的行为
数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。
还是创建一个数据表并且插入几条数据用来测试
create table test_ddl(
a bigint primary key auto_increment,
b varchar(255) not null,
c char(10) unique
);
insert into test_ddl(b, c) values ('hh', 'hhx');
insert into test_ddl(b, c) values ('bb', 'bbx');
insert into test_ddl(b, c) values ('ff', 'ffx');
select * from test_ddl;
# 测试结果如下
+---+----+------+
| a | b | c |
+---+----+------+
| 1 | hh | hhx |
| 2 | bb | bbx |
| 3 | ff | ffx |
+---+----+------+
查看建表语句
我们之前学习的那个是查看表的结构
# desc + 表名
desc test_ddl;
查看建表语句
# 语法
show create table [表名]
执行下面的sql语句
show create table test_ddl;
上面可以查看我们建表时的语句, 以及存储引擎(这里是InnoDB), 字符集以及排序规则
其实上面也解释了一个问题, 就是MySQL中的所有的标识符其实都隐式加上了反引号`
当我们想用关键字当成标识符的时候, 就要加上反引号
修改表名
从下面开始我们所有的DDL语句都是以alter table开头
基础语法
alter table [表名] rename [新名字]
假如我们想要修改表的名字, 比如把我们上面的test_ddl变为test_ddlt
执行下面的SQL
alter table test_ddl rename test_ddlt;
show tables;
# 执行结果如下(表名已经发生了改变)
+------------------------+
| Tables_in_java113mysql |
+------------------------+
| dept |
| emp |
| salgrade |
| t_student |
| test_ddlt |
+------------------------+
这时我们用上面的查看建表语句就会发现表名已经发生改变
新增字段
基础语法
alter table [表名] add [新字段名] [数据类型]
我们尝试执行下面的SQL语句
alter table test_ddlt add d varchar(10) not null;
思考一下, 我们新添加的d字段, 带有非空约束, 但是我们之前是没有加入过d这一列数据的, 那么会执行成功么, 答案是会执行成功的, 但是之前的所有位置的这个d列都是空, 不是null, 就是空(什么都没有)
insert into test_ddlt (b,c, d) values ('cc', 'ccx', 'ccxy');
select * from test_ddlt;
# 执行结果如下(就是空, 而不是null)
+---+----+------+------+
| a | b | c | d |
+---+----+------+------+
| 1 | hh | hhx | |
| 2 | bb | bbx | |
| 3 | ff | ffx | |
| 4 | cc | ccx | ccxy |
+---+----+------+------+
修改字段(名+类型)
这个SQL语句适用于修改一个字段的名称以及数据类型
基础语法
alter table [表名] change [旧字段名] [新字段名] [新字段类型];
尝试执行下面的SQL
alter table test_ddlt change d dx varchar(5);
执行结果以及表的前后结构对比如下
修改字段(仅类型)
基础语法
alter table [表名] modify column [字段名] [数据类型]
执行下面的SQL
alter table test_ddlt modify column dx varchar(7);
desc test_ddlt;
执行结果如下
删除字段
基础语法
alter table [表名] drop [字段名]
尝试执行下面的SQL
select * from test_ddlt;
alter table test_ddlt drop dx;
select * from test_ddlt;
执行结果如下