目录
- 概要
- 1、存储引擎
- 2、MySQL基本数据类型之整型
- 3、MySQL基本数据类型之浮点型
- 4、M有SQL基本数据类型之字符类型
- 5、整形中括号内数字的作用
- 6、MySQL基本数据类型之枚举与集合
- 7、MySQL基本数据类型之日期类型
- 8、MySQL创建表的完整语法
- 9、MySQL里的约束条件
- 10、自增的特性
概要
1、存储引擎
MyISAM
InnoDB
memory
blackhole
2、MySQL基本数据类型
1、整型
2、浮点型
3、字符类型
4、日期类型
5、枚举与集合类型
3、约束条件
unsigned
zerofill
not null
default
unique
primary key
1、存储引擎
- 1、什么是存储引擎
存储引擎可以简单的理解为处理数据的方式。
- 2、如何查看存储引擎
命令:show engines;
- 3、四个重要的搜索引擎
# 存储引擎简介
1、MyISAM
MySQL5.5之前默认的存储引擎
优点:存取速度相比于InnoDB更快
缺点:不支持事务、行级锁和外键,针对数据的操作相对于InnoDB来说安全性较差
2、InnoDB
MySQL5.5之后默认的存储引擎
优点:支持事务、行级锁和外键,针对数据的操作相对于MyISAM来说更加安全
缺点:存取数据的速度相较于MySQL来说较慢
3、memory
运行与内存之中,基于内存存取数据
速度最快,但是断电即丢失
4、blackhole
写入其中的数据都会立刻消失,可以看成是垃圾处理站
- 存储引擎创建表的不同点
1、使用四种不同的引擎创建表
create table t1(id int) engine=myisam;
create table t2(id int) engine=innodb;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
2、往每个表中插入数据
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
- 查看每个表中的数据
1.从以上的实验可以看出,blackhole存储引擎确实是存进去的数据立即消失,
类似垃圾处理站。
2.想要证明memory确实是基于内存来存取数据断电即丢失需要对MySQL服务
端进行重启,实验结果如下。
由于我用的MySQL版本是5.6,所以可以在不指定存储引擎创建表格,
可以看出默认使用的是innodb,实验结果如下。
- 存储引擎在创建表的不同
MyISAM会创建三个文件
.frm 表结构文件
.MYD 表数据文件
.MYI 表索引文件(索引的作用是加快数据的查询)
InnoDB会创建两个文件
.frm 表结构文件
.ibd 表数据和索引文件
memory会创建一个文件
.frm 表结构文件
blackhole会创建一个文件
.frm 表结构文件
结论:从以上情况也可以得出,MyISAM相较于InnoDB存储引擎来说,存取速度相对较快,原因就在于,MyISAM存储引擎的每个表文件都是独立分开的,所以在存取速度上要更加的快捷
2、MySQL基本数据类型之整型
- 整型类型介绍
1、MySQL数据类型之整型
分类:tinyInt smallint int bigint
区别:不同的int类型能够存储的数字范围是不一样的
数字范围比较:tinyint < smallint < int < bigint
2、注意事项
1、针对是否存在正负号的问题(正负号需要占一个比特位)
2、针对手机号码,只能用bigint # 由于手机号位数都是11位,但是int只有十位,所以存储手机号只能用bigint
- 数值范围区分
- 研究默认情况下是否需要正负号
1、创建表格
create table t6(id tinyint);
create table t7(id smallint);
create table t8(id int);
create table t9(id bigint);
2、插入数据
insert into t6 values(-999),(999);
insert into t7 values(-999),(999);
insert into t8 values(-999),(999);
insert into t9 values(-111111111111111),(111111111111111);
结论:所有的int类型默认都需要正负号
3、MySQL基本数据类型之浮点型
- 浮点型类型介绍
1、MySQL数据类型之浮点型
分类:float double decimal
基本语法格式:
float(255,30) # 总共255位,小数占30位
double(255,30) # 总共255位,小数占30位
decimal(65,30) # 总共65位,小数占30位
- 研究三者的区别
1、利用三种数据类型创建三张表
create table t10(id float(255,30));
create table t11(id double(255,30));
create table t12(id decimal(65,30));
2、插入数据
insert into t10 values(1.111111111111111111111);
insert into t11 values(1.111111111111111111111);
insert into t12 values(1.111111111111111111111);
结论:从下面的结果中可以看出,三种类型的精确度不同:float < double < decimal
至于使用哪一个,分情况而定
一般情况下小数点后面只需要保留两位,一次你float就足够了
如果是一些对于精度要求较高的作业,则需要考虑其他的
# 注:有时候很多看似用数字存储的数据,可能都是存的字符串
# ps:python本身对数字的精确度并不敏感,之所以能够从事人工智能这一类高精度作业,其原因得益于功能强大的模块
4、M有SQL基本数据类型之字符类型
- 字符类型介绍
1、MySQL基本数据类型之字符类型
分类:char、varchar
特征描述
char(4):定长类型,最多只能存四个字符,多了报错,少了自动用空格填充为4个
varchar(4):变长类型,最多只能存四个字符,多了报错,少了有几个则存几个
'''
但是有一点需要注意的是,针对MySQL5.6版本,超出范围不会报错,而是自动帮你截取并保存,但是这种行为是不合理的,因此在研究该特性时,需要保留该特性
'''
方式1:修改配置文件(永久)
方式2:命令修改环境变量(暂时性)
show variables like '%mode%'; # 展示所有带mode的环境变量
set session # 当前窗口有效
set global # 当前服务端有效
完整修改命令:
set global sql_mode = 'strict_trans_tables';
# 修改完毕之后退出客户端重新进入即可,这样就会实现我们上述所说的超过报错的情况
- 研究超过字符长度时报错的情况
1、使用char和varchar创建两张表
create table t13(name char(4));
create table t14(name varchar(4));
2、往表中添加超过字符长度的数据
insert into t13 values('jason');
insert into t14 values('jason');
可以看出再不修改时,是不会报错的
下面实验修改后的情况
- 研究定长与变长的特性
1、往表中插入未达到指定长度的字符
insert into t13 values('j');
insert into t14 values('j');
# 统计某个字段数据的长度
select char_length(字段名) from 表名,where 筛选条件;
从上面的数据我们会发现,char所存取的应该是4,但是为什么也是1?
其实这是因为,mysql在往硬盘上存数据时,确实是补了相应的空格数来实现定长,但是在取出来的时候会自动把补加的空格再去掉,所以展示我们的就是1个字符长度,其实这是可以用修改环境变量sql_mode去改变的
# 命令:
set global sql_mode ='srtricts_trans_tables,pad_char_to_full_length'
# 这里需要注意一点,再修改环境变量时,新设置的会把原来的覆盖,所以要想增加,就要把原来设置好的也加上
'''
在设置好环境变量以后,退出当前客户端并重新进入,有一点需要注意,设置完环境变量以后,我们之前插入的数据是不受影响的,所以这里使用另外一条命令,清空表里的数据
命令格式:truncate table 表名;该命令清空表数据后会保留表结构
'''
1、设置完环境变量就,重启客户端,并清空原来的表
truncate table t13;
truncate table t14;
2、重新插入数据
insert into t13 values('j');
insert into t14 values('j');
3、再查看对应字段的字符长度
select char_length(name) from t13;
select char_length(name) from t14;
从以上运行截图就可以看出,char确实是定长类型,varchar是变长类型。
- char与varchar的对比
char
优点:整存整取,存取速度快
缺点:消耗存储空间
varchar
优点:节约存储空间
缺点:存取速度相对于char较慢
'''
1、在上面我们研究了char与varchar的主要特征:
定长类型与变长类型,这一点就决定了对存储空间的使用情况,varchar比char更节省空间
2、整存整取以及存取速度的快慢又是什么造成的
当我们利用char与varchar分别往硬盘上存储不同长度的字符时,
char:char的定长特性决定了在存的时候按照固定长度存,取的时候
按照固定长度取,这样对于数据的存取就比较明朗了起来。
varchar:由于varchar是变长类型,在存的时候是根据每条数据的长度来存,
但是取的时候就无法去判断每条数据的初始长度,为了解决这个问题,varchar
采用了报头的概念,即给每条数据加上固定一个字节的报头来记录每条数据的长度
varchar在存的时候:先计算每条数据的长度(即将计算后的数据长度存于报头里)
取的时候:先获取报头里的数据(即获取每条数据的原始长度)
'''
# 到底使用char还是varchar
在以前,几乎使用的都是char,而现在很多情况下都是使用varchar,这是由于varchar的兼容性更好,
也即是由于varchar的变长特性决定的
进了公司之后 会通过邮件你每个字段的英文名和中文名及类型等项目的诸多信息
# 补充:在创建字段的时候可以为每个字段添加备注
命令格式:create table 表名(
字段名1,字段类型1 comment '字段名中文注释'
字段名2,字段类型2comment '字段名中文注释'
);
5、整形中括号内数字的作用
从上面的图中会引出一个问题,整型int括号内的11是干什么用的?
在上面讲char与varchar时,我们知道,括号内的数字是来限制数字的长度的,
那么,整型中括号内的数字又是干什么的?
'''
在整型中括号内的数字并不是用来限制存储数字的长度的,
而是用来控制展示的数字长度的
我们在以后定义整型的时候,不需要自己添加数字,使用默认的就可以了。
'''
- 研究整型括号内数字的作用
1、创建一个新的表格,并设置展示的长度,同时利用zerofill约束条件(这个下面细说,这里先说明一下,zerofill的作用是,不够的位置用0来填充)
create table t1(id int(4) zerofill);
2、插入数据
insert into t1 values(4);
实验结果如下
结论:整型是比较特殊的存在,是唯一一个不需要限制存储长度的类型
6、MySQL基本数据类型之枚举与集合
- 枚举与集合简介
# 枚举:多选一
关键字:enum() # 只能从括号内给出的数据选择
示例:
create table user(
id int ,
name varchar(32),
gender enum('male','female','others')
);
# 集合:多选多(包含多选一)
关键字:set() # 只能从括号中给出的数据选择
示例:
create table userinfo(
id int,
name varchar(32),
hobby set('sing','dance','rap')
);
- 研究枚举与集合的多多选一和多选多特性
1、使用枚举与集合分别创建两张不同的表
create table user(
id int,
name varchar(32),
gender enum('male','female','others')
);
create table userinfo(
id int,
name varchar(32),
hobby set('sing','dance','rap')
);
2、往表中添加数据
1、往user表中体验价数据时,添加的数据在enum括号内,且只添加一个
insert into user values(1,'json','male');
3、往userinfo表中添加数据时,添加的数据不在set括号内
insert into userinfo values(2,'tony','basketball');
4、往userinfo表中添加数据时,添加的数据在set括号内,且一次性为多个
insert into userinfo values(2,'tom','sing,dance,rap');
实验结果如下
结论:枚举类型只能多选一,集合可以多选多或者多选一,但是选择数据都必须是在括号内存在的数据,否则就会添加失败,出现warning。
7、MySQL基本数据类型之日期类型
1、日期类型关键字
date 年月日
datetime 年月日时分秒
time 时分妙
year 年
2、示例
以学生基本信息表为例
create table student(
id int,
name varchar(32),
birth datetime,
study_time time,
join_time year
);
添加学生基本信息
insert into student values(1,'jason','2022-2-22','2022-2-22 22:22:22','22:22:22','2022');
实验结果如下
8、MySQL创建表的完整语法
# 完整语法结构
create table 表名(
字段名1 字段类型1(数字) 约束条件,
字段名2 字段类型2(数字) 约束条件,
字段名3 字段类型3(数字) 约束条件
....
);
# 注意事项
1、字段名和字段类型是必须要有的
2、数字和约束条件是可算的,并且约束条件可以有多个,且用空格隔开即可
3、最后一个语句的结尾不要加逗号,否则会报错
9、MySQL里的约束条件
# MySQL里的约束条件相当于在字段类型的基础之上添加的额外约束,例如我们上面所讲的zerofill
# 约束条件简介
zerofill 多余的使用数字0填充
unsingned 让数字没有正负号
not null 非空
default 默认值
unique 唯一值
primary key 主键
zuto_increment 自增
# 新增表数据的方式
方式1:按照字段顺序一一传值
isnert into 表名 values();
例如:insert into t1 values(1,'jason');
方式2:自定义传值顺序,甚至可以不传
insert into 表名(字段名) values(根据前面的字段名传值);
例如:insert into t1(name,id) values('jason',1)
且可以不传值
insert into t1(id) values(1);
#注:在MySQL中不传数据,会使用关键字NULL填充,意即为空,类似于python中的None
- not null(非空)
not null 非空
示例:
create table t2(
id int,
name varchar(32) not null
);
insert into t2(name,id) values('jason',1);
结论:设置为非空的字段必须要传值
- default(默认值)
default 默认值
示例:
create table t3(
id int,
name varchar(32) not null,
gender enum('male','female','others') default 'male'
);
insert into t3(name,id) values('jason',1);
结论:所有的字段都可以设置默认值,用户可以不给该字段传值,则使用默认的,若传值,则使用用户传的值
- unsingned(让数字没有正负号)
unsingned 让数字没有正负号
示例:
create table t4(
id tinyint unsigned
);
insert into t4 values(-999),(999);
结论:设置为unsigned的字段,将忽略正负号,一般显示为正数
- unique(唯一值)
unique 唯一值
# 在以后创建表时,可能会存在数据相同的情况,这时候就需要设置一个唯一值来便于存取数据。
1、单列唯一
create table t15(
id int,
name varchar(32) unique
);
insert into t5(name,id) values('jason',1);
# 联合唯一的意思是,若不希望有出现重复的两组数据a和b,即a可以重复,b可以重复,但是a和b不能同时重复
2、联合唯一
crete table t5(
id int,
name varchar(32),
student_id bigint,
unique(id,student_id)
);
insert into t5 values(1,'jason',17113710101);
单列唯一
联合唯一
结论:唯一值的存是为了更好的去标识表中的数据,便于数据的存取
- primary key(主键)
prinmary key 主键
# 主键的存在从约束层面上来说,相当于是not null+unique(非空且唯一),在此基础上,还可以加快数据的查询
'''
InnoDB规定了一张表有且必须只有一个主键
因为InnoDB是通过主键的方式构造表的,若没有设置主键
情景1:没有主键和其他约束条件
InnoDB会采用隐藏的字段作为主键,但是这种并不能加快数据的查询
情景2:没有主键但是有非空且唯一的字段
会自动将该字段升级为主键
'''
示例:
create table t16(
id int not null unique,
age int not null unque
);
结论:以后在创建表的时候一定要设置主键,并且主键字段一般是表的id字段
- auto_increment(自增)
auto_increment 自增
'''
由于主键一般都是类似于数据的唯一标识,并且主键一般都是数字类型
我们在添加数据的时候,若数据量过多,很容易就会忘记接下来的序号是多少,而且这样操作太麻烦,于是我们可以用自增这条属性来实现我们的需求
'''
示例;
create table t17(
id int ptinmary key auto_increment,
name varchar(32)
);
结论:在使用自增特性时,带有自增约束的主键(一般是表的id字段)可以不用插入主键字段对应的值,会自动从1开始自增,每次加1
10、自增的特性
1、在研究完自增如何使用以后,我们把表里的数据删除以后会发现,自增并没有消失,那么如何解决这个问题,这里介绍两个删除表数据的方法
方式1;delete from 表名 # 无法影响到自增
方式2:truncate 表名 # 清空表数据且重置主键值,并保留表结构
2、结论
因此,如果想要在删除表数据以后,同时重置表中的主键值,可以用truncate关键字,而delete只是单纯的删除数据,不会影响到主键
使用delete删除表数据
使用truncate删除表数据