目录

  • 概要
  • 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;

pgsql 不在 sudoers 文件中此事将被报告_MySQL

  • 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);
  • 查看每个表中的数据

pgsql 不在 sudoers 文件中此事将被报告_MySQL_02

1.从以上的实验可以看出,blackhole存储引擎确实是存进去的数据立即消失,

类似垃圾处理站。

2.想要证明memory确实是基于内存来存取数据断电即丢失需要对MySQL服务

端进行重启,实验结果如下。

pgsql 不在 sudoers 文件中此事将被报告_MySQL_03

由于我用的MySQL版本是5.6,所以可以在不指定存储引擎创建表格,

可以看出默认使用的是innodb,实验结果如下。

pgsql 不在 sudoers 文件中此事将被报告_主键_04

  • 存储引擎在创建表的不同
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
  • 数值范围区分

pgsql 不在 sudoers 文件中此事将被报告_数据_05

  • 研究默认情况下是否需要正负号
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);

pgsql 不在 sudoers 文件中此事将被报告_数据_06

结论:所有的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本身对数字的精确度并不敏感,之所以能够从事人工智能这一类高精度作业,其原因得益于功能强大的模块

pgsql 不在 sudoers 文件中此事将被报告_数据_07

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');

可以看出再不修改时,是不会报错的

pgsql 不在 sudoers 文件中此事将被报告_数据_08

下面实验修改后的情况

pgsql 不在 sudoers 文件中此事将被报告_MySQL_09

pgsql 不在 sudoers 文件中此事将被报告_MySQL_10

  • 研究定长与变长的特性
1、往表中插入未达到指定长度的字符
	insert into t13 values('j');
    	insert into t14 values('j');

# 统计某个字段数据的长度 
select char_length(字段名) from 表名,where 筛选条件;

pgsql 不在 sudoers 文件中此事将被报告_MySQL_11

从上面的数据我们会发现,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;

pgsql 不在 sudoers 文件中此事将被报告_MySQL_12

从以上运行截图就可以看出,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、整形中括号内数字的作用

pgsql 不在 sudoers 文件中此事将被报告_MySQL_13

从上面的图中会引出一个问题,整型int括号内的11是干什么用的?
	在上面讲char与varchar时,我们知道,括号内的数字是来限制数字的长度的,
    	那么,整型中括号内的数字又是干什么的?

'''
	在整型中括号内的数字并不是用来限制存储数字的长度的,
	而是用来控制展示的数字长度的
	我们在以后定义整型的时候,不需要自己添加数字,使用默认的就可以了。

'''
  • 研究整型括号内数字的作用
1、创建一个新的表格,并设置展示的长度,同时利用zerofill约束条件(这个下面细说,这里先说明一下,zerofill的作用是,不够的位置用0来填充)
	create table t1(id int(4) zerofill);
2、插入数据
	insert into t1 values(4);

实验结果如下

pgsql 不在 sudoers 文件中此事将被报告_主键_14

结论:整型是比较特殊的存在,是唯一一个不需要限制存储长度的类型

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');

实验结果如下

pgsql 不在 sudoers 文件中此事将被报告_MySQL_15

pgsql 不在 sudoers 文件中此事将被报告_数据_16

pgsql 不在 sudoers 文件中此事将被报告_主键_17

结论:枚举类型只能多选一,集合可以多选多或者多选一,但是选择数据都必须是在括号内存在的数据,否则就会添加失败,出现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');

实验结果如下

pgsql 不在 sudoers 文件中此事将被报告_主键_18

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);

pgsql 不在 sudoers 文件中此事将被报告_MySQL_19

结论:设置为非空的字段必须要传值

  • 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);

pgsql 不在 sudoers 文件中此事将被报告_数据_20

结论:所有的字段都可以设置默认值,用户可以不给该字段传值,则使用默认的,若传值,则使用用户传的值

  • unsingned(让数字没有正负号)
unsingned	让数字没有正负号
	示例:
    	create table t4(
		id tinyint unsigned
        );
	insert into t4 values(-999),(999);

pgsql 不在 sudoers 文件中此事将被报告_主键_21

结论:设置为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);

单列唯一

pgsql 不在 sudoers 文件中此事将被报告_MySQL_22

联合唯一

pgsql 不在 sudoers 文件中此事将被报告_主键_23

结论:唯一值的存是为了更好的去标识表中的数据,便于数据的存取

  • 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
        );

pgsql 不在 sudoers 文件中此事将被报告_MySQL_24

结论:以后在创建表的时候一定要设置主键,并且主键字段一般是表的id字段

  • auto_increment(自增)
auto_increment	自增

	'''
		由于主键一般都是类似于数据的唯一标识,并且主键一般都是数字类型
		我们在添加数据的时候,若数据量过多,很容易就会忘记接下来的序号是多少,而且这样操作太麻烦,于是我们可以用自增这条属性来实现我们的需求
	'''
    示例;
    	create table t17(
		id int ptinmary key auto_increment,
		name varchar(32)
        );

pgsql 不在 sudoers 文件中此事将被报告_主键_25

结论:在使用自增特性时,带有自增约束的主键(一般是表的id字段)可以不用插入主键字段对应的值,会自动从1开始自增,每次加1

10、自增的特性

1、在研究完自增如何使用以后,我们把表里的数据删除以后会发现,自增并没有消失,那么如何解决这个问题,这里介绍两个删除表数据的方法
	方式1;delete from 表名 # 无法影响到自增
    	方式2:truncate 表名  # 清空表数据且重置主键值,并保留表结构
2、结论
	因此,如果想要在删除表数据以后,同时重置表中的主键值,可以用truncate关键字,而delete只是单纯的删除数据,不会影响到主键

使用delete删除表数据

pgsql 不在 sudoers 文件中此事将被报告_主键_26

使用truncate删除表数据

pgsql 不在 sudoers 文件中此事将被报告_MySQL_27