1.创建表的完整语法
2.字段类型
3.字符类型
4.日期类型
5.枚举与集合类型
6.约束条件
补充:
存储引擎分类: 不同的数据应该有不同的处理机制 mysql存储引擎: 1.Innodb:默认存储引擎,查询速度较myisam慢,但是更安全 2.myisam:老版本用的存储引擎 3.memory:内存引擎(数据全部存在内存中) 4.blackhole:无论存什么,都立马消失(也称之为黑洞引擎) 研究一下每个存储引擎存取数据的特点 查看所有引擎:show engines;
一.创建表的完整语法
1.
创建表的完整语法 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意: 1.创建表的时候字段名和字段类型是必须写的,中括号内的参数都是可选参数 2.创建同一张表的时候字段名是不能写重复的 3.最后一个字段后面是不能加逗号的 列子: create table t1( id int, name char );
2.宽度
宽度说的就是对存储数据的限制,比如说 char(1)只能存一个字符,
如果存的字符数超了,mysql他会自动帮你截取,你写的参数是多少就有几个字符。
1.插入的时候,mysql自动截取
2.但是要是按照严格模式,会直接报错
注意:
使用数据库的准则:尽量让它少干活就尽量少干活,因为你如果存取的少的话倒是没事,
但是要是操作的数据是以千万为单位的话,那么mysql会有崩溃的风险
3.如何设置严格模式
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数 # 修改安全模式 set session # 只在当前操作界面有效 set global # 全局有效 set global sql_mode ='STRICT_TRANS_TABLES' # 修改完之后退出当前客户端重新登陆即可
4.该如何避免不能插空
alter table 数据表名 modify name char not null; not null该字段不能插空
总结:创建表的最终格式
最终的格式: create table 表名 ( 列1 列属性 [是否为null 默认值], 列2 列属性 [是否为null 默认值], ..... 列n 列属性 [是否为null 默认值] )engine = 存储引擎 charset = 字符集 最终的例子: create table t4 ( id int auto_increment primary key, name char(32) not null default '', pwd char(32) not null default '' )engine=Innodb charset=utf8;
二.字段类型
数据类型分为:整型,浮点型
1.整型
smallint ,tinyint ,int ,bigint
tinyint : 范围: 有符号: -128到127 无符号: 0 到 255 unsigned smallint 范围: 有符号: -32768到32767 无符号: 0 到 65535 unsigned mediumint 范围: 有符号: -8388608到8388607 无符号: 0 到 16777215 unsigned int bigint 区别: a. 取值范围不一样, 根据自己公司的业务来去选择 b. 无符号和有符号的意思5535 unsigned
unsigned 无正负符号
总结:char后面的数字是用来限制存储数据的长度的
特例:只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数
int(8)够8位 或者 超8位 有几位存几位,不够8位空格填充
我们可以通过修改约束条件 不够8位的情况下,用0来填充
zerofill 0填充多余的位数
案例:
1 验证整型字段有无符号及范围: 2 create table t1(x tinyint); 3 insert into t1 values(128),(-129); 4 5 create table t2(x tinyint unsigned); 6 insert into t2 values(-1),(256); 7 8 create table t3(x int unsigned); 9 insert into t3 values(4294967296); 10 11 疑问:**类型后面的宽度能否改变字段存储的大小限制 12 create table t4(x int(8)); 13 insert into t4 values(4294967296123); 14 15 # 显示时,不够8位用0填充,如果超出8位则正常显示 16 create table t5(x int(8) unsigned zerofill); 17 insert into t5 values(4294967296123); 18 19 # create table t6(id int(10) unsigned); 20 # create table t7(id int(11));
强调:
对于整型来说,数据类行后的宽度并不是存储限制,而是显示限制,所以在创建表的时候,
如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据。
只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据
严格模式补充:
%匹配任意多个字符
_匹配任意一个字符
1 我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式 2 3 like 是关键字 4 5 show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数 6 # 修改安全模式 7 set session # 只在当前操作界面有效 8 set global # 全局有效 终生有效 9 10 set global sql_mode ='STRICT_TRANS_TABLES' 11 # 修改完之后退出当前客户端重新登陆即可
2.浮点型
float ,double ,decimal
1 float(255,30) 总共255位 小数部分占30位 2 double(255,30) 总共255位 小数部分占30位 3 decimal(65,30) 总共65位 小数部分占30位 4 5 create table t12(id FLOAT(255,30)); 6 create table t13(id DOUBLE(255,30)); 7 create table t14(id DECIMAL(65,30)); 8 9 10 insert into t12 values(1.111111111111111111111111111111); 11 insert into t13 values(1.111111111111111111111111111111); 12 insert into t14 values(1.111111111111111111111111111111); 13 14 精确度 15 float < double < decimal
三.字符类型
分别为:char (定长),varchar(变长) char(4)#最大只能存取四个字符,超出来会直接报错,如果少了,会自动用空格填充 varchar(4)#最大只能存四个字符,超出来回直接报错,如果少了,有几个就会存几个 查看存储了几个字符:char_lenght() select char_length(字段) from 表名 但是有一个问题: 我存了2个字符,char自动用空格给我补充了,但是我一起出来就又会变为2个了,这是为什么。 解:因为mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是取出的那一瞬间,mysql会自动将填充的空格去除了 但是本着能让mysql少干事就少干事,我们可以通过严格模式来修改机制,让其不做自动去除处理。 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; # 退出客户端重新登陆
那么char 和 varchar有什么区别:
char(定长) 1.浪费空间 因为他的长度是固定好的,比如说你写个32,但是你只存了2个,那么其他30个空间就都被空格填充浪费了 2.存取速度快 因为不管你存了多少,直接通过给的参数是多少就是多少来查,内部不在需要通过计算,你存了多少字符 varchar(变长) 1.节省空间 因为它不会填充空格,你存几个数据,就是几个。 2.存取熟读慢(只是相比于插入比较慢) 存的时候 需要给数据讲一个记录长度的报头 取的时候 需要先读取报头才能读取真实数据 总结: char:取的时候方便,直接按固定的长度取即可 varchar:取的时候比较繁琐了 无法知道数据到底多长
总结:详细请看
1 create table t10(name char(4)) # 超出四个字符报错,不够四个字符空格补全 2 create table t11(name varchar(4)) # 超出四个字符报错,不够四个有几个就存几个 3 4 # 验证存储限制 5 insert into t12 values('hello'); 6 insert into t13 values('hello'); 7 # 验证存储长度 8 insert into t12 values('a'); #'a ' 9 insert into t13 values('a'); #'a' 10 select * from t12 11 select * from t13 # 无法查看真正的结果 12 13 select char_length(name) from t12 14 select char_length(name) from t13 # 仍然无法查看到真正的结果 15 16 """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉""" 17 # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式 18 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; 19 # 退出客户端重新登陆 20 select char_length(x) from t12; #4 21 select char_length(y) from t13; #1 22 23 # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格 24 25 26 """ 27 char与varchar的使用区别 28 """ 29 name char(5) 30 # 缺点:浪费空间 31 # 优点:存取速度都快 32 egon alex lxx jxx txx 33 34 name varchar(5) 35 # 缺点:存取速度慢 36 # 优点:节省空间 37 1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx
四.日期类型
日期类型分为:
date :2019-05-01
datetime :11:11:11
year :2019-01-02 11:11:11
time:2019
案例:
1 create table student( 2 id int, 3 name char(16), 4 born_year year, 5 birth date, 6 study_time time, 7 reg_time datetime 8 ); 9 insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');
五.枚举与集合类型
枚举(enum,多个选一个):限制某个字段能够存储的数据内容
集合(set,多个可以选一个,也可以选多个):限制某个字段能够存储的数据内容
案例:
1 create table user( 2 id int, 3 name char(16), 4 gender enum('male','female','others') 5 ); 6 insert into user values(1,'jason','xxx') # 报错 7 insert into user values(2,'egon','female') # 正确! 8 9 10 create table teacher( 11 id int, 12 name char(16), 13 gender enum('male','female','others'), 14 hobby set('read','sleep','sanna','dbj') 15 ); 16 insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一个
六.约束条件
1.唯一索引 和 联合唯一索引
not null 不能为空 default 给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值) create table t17(id int,name char(16) default 'jason'); 往表中插入数据的时候 可以指定字段进行插入 不需要全部都插 insert into t17(name,id) values('egon',2); 1.unique 唯一 单列唯一:限制某一个字段是惟一的 比如说可以把id设置为唯一,就是id不能重复 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') # 成功 2.unique(字段名,字段名)联合唯一索引 表示2个字段在一起的数据必须是惟一的 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);
2.primary key 主键
限制效果跟 not null 加 unique 组合的效果是一样的,不能为空而且是惟一的 create table t18(id int primary key); 那么为什么需要索引: primary key也是innodb引擎查询必备的索引 索引你就把当成书的目录,可以加快查询的速度 强调:一张表里必须需要一个主键 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键 那么主键到底设置给谁了: 你只要记住通常每张表里都会有一个id的字段,并且应该将id设置为表的主键字段 什么是联合主键: 就是多个字段联合起来作为一个表的一个主键,但是本质还是一个主键 ps:innodb引擎中一张表只有一个主键,引擎不要写默认为innodb引擎 每次还要标序号不觉得很麻烦么:主键字段应该具备自动递增的特点 每次添加数据的时候,不需要用户手动输入:auto_increment 自动递增 create table t21(id int primary key auto_increment,name varchar(16));
详细解释:
1 # 单从约束角度来说primary key就等价于not null unique 2 create table t11(id int primary key); 3 desc t11; 4 insert into t11 values(1),(1); # 报错 5 insert into t11 values(1),(2); 6 7 # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率 8 """ 9 强调: 10 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键 11 """ 12 create table t12( 13 id int, 14 name char(16), 15 age int not null unique, 16 addr char(16) not null unique 17 )engine=innodb; 18 desc t12; 19 """ 20 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了 21 索引:类似于书的目录,没有主键就相当于一页一页翻着查 22 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键 23 """ 24 # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键 25 create table t18( 26 ip char(16), 27 port int, 28 primary key(ip,port) 29 ); 30 desc t18; 31 32 # 主键id作为数据的编号,每次最好能自动递增 33 create table t13( 34 id int primary key auto_increment, 35 name char(16) 36 ); 37 insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增 38 # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
补充:
delete from tb1; 强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0, 所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录 delete from tb1 where id > 10; 如果要清空表,使用truncate tb1; 作用:将整张表重置,id重新从0开始记录