存储引擎
不同的数据应该有不同的处理机制
mysql存储引擎:
Innodb:默认的存储引擎 查询速度较myisam慢 但是更安全
myisam:mysql老版本用的存储引擎
memory:内存引擎(数据全部存在内存中,一旦数据库关闭,存储在内中的数据都会丢失)
blackhole:无论存什么 都立马消失(黑洞)
存储引擎相关的sql语句
查询当前数据库支持的存储引擎
show engines;
指定存储引擎建表
在建表时指定
create table a(id int,name varchae(16)) ENGINE=MyIsam; create table b(id int,name varchar(16)) ENGINE=INNODB; 也可以使用alter table语句,修改一个已经存在的表的存储引擎 alter table a engine=innodb;
创建表的完整语法
语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ) 注意: 1.在同一张表中,字段名不能相同 2.宽度和约束条件可选,字段名和类型是必须的 3.最后一个字段后不能加逗号!!!!!!!!!!!! 补充: 1.宽度指的是对存储数据的限制 create table userinfo(name char); insert into userinfo values('yyy'); """ 1.没有安全模式的数据库版本,能够存放数据但是是会存进去一个y 2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1 """
约束条件初识>>>null 与 not null create table t1(id int,name char not null); insert into t1 values(1,'y'); # 正常存储 insert into t1 values(2,null); # 报错 总结 类型与约束条件区别 类型:限制字段必须以什么样的数据类型存储 约束条件:约束条件是在类型之外添加一种额外的限制
基本数据类型
整型
分类:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
作用:存储年龄,等级,id,各种号码等
类型存储范围:
验证整型字段有无符号及范围
create table t1(id tinyint); insert into t1 values(128),(-129); create table t2(id tinyint unsigned); insert into t2 values(-1),(256); create table t3(id int unsigned); insert into t3 values(4299999999);
类型后面的宽度能否改变字段存储的大小限制
create table t4(x int(8)); insert into t4 values(239787943927); 显示时,不够8位用0填充,如果超出8位则正常显示 create table t5(x int(8) zerofill); insert into t5 values(1); 强调: 对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时, 如果字段采用的是整型类型,完全无需指定显示宽度,默认的显示宽度,足够显示完整存放的数据
严格模式
我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,
发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。
但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,
让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
模糊匹配
like
% 匹配任意多个字符
_ 匹配任意一个字符
show variables like '%mode%'; # 查看数据库配置中变量名包含mode的配置参数 # 修改安全模式 set session # 只在当前操作界面有效 set global # 全局有效 set global sql_mode='STRICT_TRANS_TABLES'; # 修改完之后退出当前客户端重新登陆即可
浮点型
分类:float double decimal
应用场景:身高,体重,薪资
字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数
三者最大整数位和小数位对比:
# 存储限制 float(255,30) double(255,30) decimal(65,30) # 精确度验证 create table t9(x float(255,30)); create table t10(x double(255,30)); create table t11(x decimal(65,30)); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); insert into t11 values(1.111111111111111111111111111111); # 精确度 float < double < decimal
字符类型
分类:
char (定长)
varchar(变长)
作用:姓名,地址,描述类信息
create table t10(name char(4)); # 超出4个字符报错,不够四个字符空格补全 create table t11(name varchar(4)); # 超出4个字符报错,不够四个有几个就存几个 # 验证存储限制 insert into t10 values('hello'); # 报错 insert into t11 values('hello'); # 报错 # 验证存储长度 insert into t10 values('yy'); insert into t11 values('yy'); select * from t10; # 无法查看真正的结果 select char_length(name) from t10; # 仍然无法查看到真正的结果 """首先应该肯定的是在硬盘上存的绝对是真正的数据, 但显示的时候mysql会自动将末尾的空格取掉""" # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式 set global sql_mode='strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH'; # 退出客户端重新登陆 select char_length(nane) from t10; # 4 select char_length(name) from t11; # 2 # 针对char类型,mysql在存储时会将数据用空格补全存在到硬盘中.但是会在读出结果的时候自动去掉末尾的空格
char 与 varchar的使用区别
name char(5) # 缺点:浪费内存空间 # 优点:存取速度都快 name varchar(5) # 缺点:存取速度慢(较于char比较慢) 存的时候 需要给数据讲一个记录长度的报头 取的时候 需要先读取报头才能读取真实数据 # 优点:节省空间
时间类型
分类:
date:2019-11-11
time:11:11:11
datetime:2019-11-11 11:11:11
year: 2019
create table student( id int, name char(16), birth date, born_year year, study_time time, reg_time datetime ); insert into student values(1,'yyy','1996-11-11','2019','11:11:00','2019-11-11 11:11:00');
枚举与集合类型
分类:
枚举enum 多选一
集合set 多选多
create table user( id int, name char(16), gender enum('male','female','others') ); insert into user values(1,'yyy','xxx') # 报错 insert into user values(1,'yyy','male') # 正确 create table teacher( id int, name char(16), hobby set('read','sleep','eat') ); insert into teacher values(1,'yyy','read,sleep') # 集合也可以只存一个
约束条件
""" PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充 """
not null + default
create table user( id int, name char(16) ); insert into user values(1,null) # 可以存null alter table user modify name char(16) not null; insert into user(name) values(null); # 报错 插入数据可以在表名后面指定插入数据对应的字段 create table student( id int, name char(16) not null, gender enum('male','female','others') default 'male' ); insert into student(id,name) values(1,'jason') # 成功
unique
# 单列唯一 create table user1( id int unique, name char(16) ); insert into user1 values(1,'jason'),(1,'egon') # 报错 insert into user1 values(1,'jason'),(2,'egon') # 成功 # 联合唯一 create table server( id int, ip char(16), port int, unique(ip,port) ) insert into server values(1,'127.0.0.1',8080); insert into server values(2,'127.0.0.1',8080); # 报错 insert into server values(1,'127.0.0.1',8081);
primary key+auto_increment
# 但从约束角度来说primary key 就等价于not null unique create table t11(id int primary key); desc t11; insert into t11 values(1),(1); # 报错 insert into t11 values(1),(2); # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率 ''' 强调: 1.一张表中必须有且只有一个主键,如果没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键 ''' create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t12; """ 2.如果表里面没有指定任何的可以设置为主键的字段, 那么innodb会采用自己默认的一个隐藏字段作为主键, 隐藏意味着你在查询的时候无法根据这个主键字段加速查询了 索引:类似于书的目录,没有主键就相当于一页一页翻着查 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键 """ # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键 create table t18( ip char(16), port int, primary key(ip,port) ); desc t18; # 主键id作为数据的编号,每次最好都能自动递增 create table t13( id int primary key auto_increment, name char(16) ); insert into t13 values('yyy'),('ppp'); # id字段自动从1开始递增 # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
补充
delete from 仅仅是删除数据 不会重置主键
truncate 初始化表 会重置主键