1、数据类型
1.1、数值类型
1.1.1、整数类型
tinyint:微整数【1字节】
smallint:小整数【2字节】
mediumint:中等整数【3字节】
int:整数【4字节】——常用基本满足
bigint:大整数【8字节】
说明:
对于整数类型(int)MySQL支持在类型后面加括号——int(M),小括号中的M表示显示宽度,M的取值范围为(0-255),但 8之后不推荐这么干
int没有指定M,默认M的是11。最多能存储和显示11位整数
int(M)这个M在字段中只有指定了unsigned(无符号)和zerofill(零填充)的情况下才有意义,表示当整数值不够M位时用零来填充,存入超过位数的值会报错


1.1.2、bit类型
bit类型 ,如果没有指定(M),默认是1位。这个1位表示只能存储1位二进制值,M的范围是1到64
对于位类型的字段,之前版本直接使用select语句不会看到结果,而在MySQL8版本中默认与“0x”开头的十六进制形式显示,可以通过bin()函数显示为二进制
1.1.3、小数类型
浮点数:
flout(M,D)
double(M,D)
不指定M,D按照实际精度显示
定点数
declmal(M,D):
该类型在不指定(M,D)时,默认为(10,0),表示只表示整数部分
该类型实际上底层使用的是字符串的方式存放,在对进度要求比价高的时候(如货币、科学数据),使用比较好
说明:
浮点数和定点数都可以使用(M,D)来表示
M表示精度,表示该值总共显示M位,包括整数位和小数位,对浮点型来说范围为0-255,对于顶定点型来说范围为0-65
D表示标度,表示小数位数,取值范围为0-30,同时必须<=M
浮点数和定点数各有优缺,定点数相对精准,而浮点数能够表示更大的范围,但浮点数会有精度问题
建议少用浮点数的类型
1.2、字符类型
1.2.1、文本字符串
说明:文本字符串客户端向服务器传递的是二进制编码以及编码方式
char(M):定长字符串
表示存储M个字符串,如果不够底层使用\u0000补全,也就是说即使不够也占那么大的空间
M的默认值是一个字符,范围0-255
尾部不可存空格,会被当成占空间的底层代码
varchar(M):变长字符串
可变长度,表示最多存储M个字符
必须指定M的值
解释一下就是即使存不够也不多占内存,只是耗费1到2个字节来标识占位多少
InnoDB引擎底层有优化平常字符串类型建议直接用他就行
长字符串
tinytext:小文本
text:文本——常用
mediutext:中等文本
longtext:大文本
enum:枚举
从预定义的成员中选择一个
字段名ENUM(‘值1’,‘值2’,…‘值n’)
set:集合
从预定义的文本中选择一个或者多个,最多定义64个
字段名 SET(‘值1’,‘值2’,…‘值n’)
1.2.2、二进制字符串
说明:客户端向服务端传递的是编码值
binary:定长二进制字符串,类似char,只不过后面M是字节数。
varbinry:不定长二进制字符串,类似于varchar,后面的M为字节数
blob:大的二进制字符串
1.3、时间日期类型
year:年份
date:日期—年月日
time:时间—时分秒
datetime:时间日期—年月日-时分秒
timestamp:时间戳—年月日-时分秒,存储
说明:存入时间日期时,需要加单引号
2、约束
2.1、作用
约束是为了保证数据完整性,数据完整性是指数据的精确性和可靠性
它是应防止数据库中存在不符合规范的数据和防止因错误信息的输入输出造成无效的操作或错误信息而提出
2.2、约束类型
主键约束【primary key】
作用:
用来唯一标识一行数据,或者换句话说,表中不允许出现俩条无法区分的记录
特点
每个表最多只能定义一个主键约束
主键约束,即要求唯一又要求非空
主键索引可以是一个复合索引
删除主键约束:
alter table 表名称 drop primary key;
添加
建表时

建表后:alter table 表名称 add primary key(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键
自增属性【auto_increment】:
作用:给某个字段自动赋值,这个值是一直往上增加,如果没有干扰,没次自增一
要求:
一个表有且只能有一个自增字段,因为一个表的底层只有一个字段用来记录自增字段值
自增字段必须为一个键值
自增字段应该是数值类型,一般是整数类型
只能加不能减
唯一键约束【unique key】
作用:
用来限定某个字段的值不允许重复
特点
一个表可以有多个唯一键约束
每一个唯一键约束字段都会自动创建索引。通过删除唯一键约束的索引来删除唯一键约束
唯一键约束字段描述列允许为空
唯一键约束可以是复合键
添加
建表时

建表后:alter table 表名称 add unique 【key】(字段名);
删除唯一键约束:
【alter table 表名称 drop index 索引名;】
删除唯一键约束需要手动删除对应的索引,如果是复合的唯一键约束,同样是删除他们的共同索引
非空索引【not null】
作用:
限定某个字段的值不为null
特点:
一个表可以有多个列分别色值唯一键索引
但是不能出现复合的唯一键
添加
建表时:create table 表名称( 字段名 数据类型 not null)
建表后:alter table 表名称 modify 【column】 字段名 数据类型 not null;
删除非空约束:
alter table 表名称 modify【column】 字段名 数据类型;
默认值约束【default】
作用:
在添加数据时如果没有给这个数据赋值,会选择默认值为这个数据进行赋值,如没有默认值那么默认就为null
创建
建表时

建表后:alter table 表名称 modify 字段名 数据类型 default 默认值;
注意:如果这个字段原来有非空约束,你还保留非空约束,那么在加默认值约束时,还得保留非空约束,否则非空约束就被删除了同理,在给某个字段加非空约束也一样,如果这个字段原来有默认值约束,你想保留,也要在modify语句中保留默认值约束,否则就删除了
检查约束【check】
作用:
用于限制字段中的值的范围。如果对单个字段定义检查约束,那么该字段只允许特定范围的值
如果对一个表定义检查约束那么此约束会基于行中其他字段的值在特定字段中对值进行限制
添加
创建时

创建后:alter table 表名称 add check(条件);
删除:
alter table 表名称 drop check 检查约束名;
外键约束【foreign key】
作用:用来限定子表和父表的引用关系,子表的外键字段值必须在父类被引用的范围内
说明:阿里开发文档明确说明尽量不要使用外键,本人仅了解,基本没有用过
3、运算符
3.1、算数运算符
加:+
减:-
乘:*
除:/ div(只保留整数部分)
取模:% mod
3.2、比较运算符
大于:>
小于:<
大于等于:>=
小于等于:<=
等于:= 不能用于null值的判断
不等于:!=、<>、不能用于null值的判断
3.3、逻辑运算符
逻辑与:and
逻辑或:or
逻辑非:!或not
逻辑异或:xor
3.4、区间范围或集合范围比较运算符
区间范围:
betweeen x and y
not between x and y
集合范围
in(X,X,X)
not int(X,X,X)
3.5、关于null值问题
判断时
is null
is not null
<=>
计算时
ifnull(xxx,代替值):当xxx为null时,用代替值代替计算
4、事务
4.1、事务
一组执行语句,要么都成功,要么都失败,
举个例子:一组添加了事务的添加语句向表中添加数据,中间有一句出了问题,别管前面执行了多少,向表里有没有添加数据,只要出问题,那么前面添加的都不算,就算加了也得撤回。
4.2、特性ACID
原子性:事务为最小单位不可分割,要么都成功,要么都失败
一致性:举个例子,我向你转100元,那么你的账户要加100元,而我的账户要扣100元
隔离性:一个事务执行时,不会被其他事务干扰
持久性:事务提交后就永久保存,不能反悔
4.3、事务并发问题
脏读:读到其他事务没有提交的数据
不可重复读:一个事务前后俩次读取同一个数据发现不一样,因为被其他事务给【修改】了
幻读:一个事务前后俩次读取的数据不一致,区别于不可重复度他的问题是由于被其他事务新增增或删除引起的,例如小明想讲表的成绩数据由百分制改为ABCD,但他改完之后发现表里加了一条数据而且还是百分制
4.4、隔离级别
读未提交:隔离级别最低,对应脏读问题
读已提交:隔离级别稍高,解决了脏读,但是幻读和不可重复读问题同样存在
可重复度:解决了不可重复读和脏读,是MySQL的innoDB引擎的【默认隔离级别】,在MySQL8中应该也在这个隔离级别中解决了幻读
串行化:最狠的隔离级别,多线程一个一个的来,从根本解决