MySQL数据库的基本知识

MySQL数据库的基本知识延展

 

储存引擎

创建表的完整语法

MySQL基本数据类型

字段的约束条件

 

储存引擎

MySQL内部针对数据的储存形式有很多种不同的数据方式

简单的理解:我们把这些不同的储存方式叫做不同的储存引擎

怎么在MySQL中查看我们的储存引擎

show engines;

主要储存引擎的种类

InnDB

MySQL5.5之后的版本全部默认的储存引擎

支持事务、行锁、外键 使得数据更加安全

事务:保证多个数据的操作,只有全部完成和全部失败

行锁:对一行行的数据进行加锁,同一时间点只能有一个人去操作这个数据

外键:建立表的关系

MyISAM

MySQL5.5之前的版本默认的储存引擎

不支持事务、外键等功能 使得安全性相较于InnDB低

但是存取数据的速度比InnDB快

memory

数据直接存储在内存 虽然存取的速度快了但是一断电就马上丢失了

blackhole

如他的字面意思:黑洞 写入其中的数据全部会丢失

 

储存引擎表文件

create table d1(id int)engine=InnoDB;
create table d5(id int)engine=MyISAM;
create table d3(id int)engine=memory;
create table d4(id int)engine=blackhole;

 

 

 

不同的储存引擎生成的文件数目也不同

1.InnoDB有两个文件
.frm 表结构
.idb 表数据、索引(书的目录)


2.MyISAM有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引


3.memory有一个文件
.frm 表结构


4.blackhole有一个文件
.frm 表结构

 

存取数据特性

insert into d1 values(1);
insert into d5 values(1);
insert into d3 values(1);
insert into d4 values(1);

 

 

创建表的完整语法

create table 表名(字段名 字段类型(宽度) 约束条件,
                     字段名 字段类型(宽度) 约束条件,
                     字段名 字段类型(宽度) 约束条件);

注意:

字段名称和字段类型是必须要有的 宽度和约束条件是可以自由选择的(可有可无)

约束条件可以自由选择 且一个字段可以有多个约束条件

最后结尾处的字段语句不能有逗号

 

字段类型

整型

tinyint

smallint

int

bigint

不同的整型类型能够储存的数字范围不同

 

 

 验证整型是否自带正负号

create table d6(id tinyint);
insert into d6 values(-129),(256);  -127 128

 

 

 

其他的数据类型也是这样的 默认的就是自带正负号的

 

create table d7(id tinyint unsigned);   unsigned约束条件 无符号
insert into d7 values(-129),(256);      0 255

 

 

 

 

 

 

 

浮点型

float

double

decimal

不同的浮点型储存小数的范围以及精度不一样

float(255,30)    总共255位小数位占30位
double(255,30)   总共255位小数位占30位
decimal(65,30)   总共65位小数位占30位
create table d8(id float(255,30));
create table d9(id double(255,30));
create table d10(id decimal(65,30));

 

 

insert into d8 values(1.111111111111111111111111111111);
insert into d9 values(1.111111111111111111111111111111);
insert into d10 values(1.111111111111111111111111111111);
精确度:float < double < decimal

由上图可以看出浮点型储存小数的精确度问题在这个场景下发生了

所以有的时候会用不同的数据类型来储存

 

字符类型

char和varchar

上面的两个数据类型在数据存储的方式上有着本质的区别

char(4):最多可以储存4个字符 超过了报错 没有超过的话也按照四个字符的大小来储存(默认用空格来填充)

varchar(4):最多可以储存4个字符 超过了报错 没有超过的话按照实际的字符来存储

create table d11(id int,name char(4)); 
create table d12(id int,name varchar(4)); 
insert into d11 values(1,'jason');
insert into d12 values(1,'jason');

 

 

我现在使用的5.6版本身并没有开启严格模式,也就不会报错

5.7版本之后默认都是开启的

我现在在上图演示的是已经开启了严格模式时候就会直接报错

 

char_length()  统计数据的长度

在默认的情况下MYSQL会自动储存并且在查询的时候自动去除填充的表格

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

 

那么问题来了char和varchar待敌选用哪个来存储数据比较好呢

char

优点:将整个数据以4个字符的大小存入并且取出 速度非常快

缺点:浪费了不少存储空间

 

varchar

优点:节省了储存的空间

缺点:存入取出的速度相比char慢了很多

原因是varchar在存数据的时候需要每个数据都进行计算才能存入

同理取出的时候先计算这个数据再取出,所以时间上确实比char更加的长

结论:们两个都有各自的应用场景,根据我们个人的实际情况来选择

 

严格模式

如何查看严格模式

show variables like '%mode%';

如何修改严格模式

set global sql_mode = 'strict_trans_tables';

严格模式只需要在修改完成之后退出重新登陆

 

时间类型

data            年月日

time            时分秒

Datetime    年月日时分秒

Year           年

create table time1(
      id int,
      name char(16),
      born_year year,
      birth date,
      study_time time,
      reg_time datetime);

insert into time1 values(1,'jason','2022','2022-05-09','11:11:00',
'2022-11-11 11:11:11');
时间数据绝大多数的时候都是自动获取的,看下图:

 

 

 

枚举与集合类型

enum    多选一

set        多选多(包含多选一)

 

枚举类型

create table d13(id int,
                 name varchar(16),
                 gender enum('male','female','others'));

insert into d13 values(1,'jason','');  报错
insert into d13 values(2,'tony','male'); 可以执行
这里面插入的数据只能是我前面规定好的

 

 

 

集合类型

create table d14(
    id int,
    name char(16),
    hobby set('basketball','football','doublecolorball'));
insert into d14 values(
1,'jason','read'); 报错 insert into d14 values(2,'kevin','basketball'); 可选一 insert into d14 values(3,'tony','basketball,football'); 可选多
插入数据的时候只能够插入提前规定好的

 

 

 

宽度说明

int(4)   char(4)

针对数字类型 宽度并不是用来限制存储长度而是用来表示展示长度

在定义数字的时候无需手动添加宽度

 

约束条件

插入数据两种方式

1.insert into d1 values() 按照字段顺序依次传入(一个都不能少)
2.insert into d1(id,name) values() 按照指定的字段传入(可以少)

unsigned     无符号
zerofill         0填充

 

not null 不能为空 使用的频率高

create table d18(
    id int,
    name varchar(16) not null);

insert into d18 values(1,null);
insert into d18 values (1,'');

 

 

default  默认值

create table d19(
    id int,
    name varchar(16) default '匿名用户');

insert into d19(id) values(99);

 

 

unique  唯一

单列唯一

create table d20( id int, name varchar(16) unique);

insert into d20 values(2,'cuka');
insert into d20 values(3,'cuka');

 

 

 

多列唯一
create table d21( id int, host int, port int, unique(host,port));

insert into d21 values(1,2,3); 正确
insert into d21 values(1,3,2); 正确
insert into d21 values(2,2,3); 报错

 

 

posted @ 2021-09-04 17:27  ふじわらたくみ  阅读(111)  评论(0编辑  收藏  举报