字段类型
扩充:
复制表就是在原有表基础上,把原有的表的东西拿过来创建一个新的数据表
- 语法:create table 表名 select * from 表名;
- 作用:复制表的结构和表内容信息
复制前:
复制
复制后
第二种复制表
语法:create table 表名 like 表名;
作用:只复制表结构,不复制表信息
复制前
复制
复制后
数值型
整数
思考?—一个字节占多少位?—8位—–整形存储占8位—2*2*2*2*2*2*2*2=256
Tinyint的范围就是256个这里 -128—-127 刚好256个数
整形存储的范围和,存储的空间有关系
数值范围
无符号
Unsigned 只能存储正数,不能存储负数
注意:无符号没有负数,正数方向范围加倍
显示宽度&零填充
插入数据:
显示效果
注意:
- 显示长度和零填充一块使用才有效果;
- 当插入数据的长度大于显示长度的话
小数
浮点型
Float
单精度浮点型
这个float一般在数据类型中不使用,因为有误差;
- 误差问题测试案例
误差的原因—-MySQL内部存储计算使用的都是double类型
Double
- 无符号问题测试案例
Unsigned 无符号,也就是不能插入负数
- 设置显示宽度
create table 表名
(
num double(m,d)
— m是可以显示的总字符长度,d显示的是可以显示几个小数字符
)charset=utf8;
- 如果插入的数据的小数长度唱过了设置的d小数的显示长度1位,那么把超出的部分直接去掉
- 果插入的数据的小数长度唱过了设置的d小数的显示长度1位以上,会四舍五入
- 如果整数的显示长度超过了m – d(减号),那么会直接报错,范围超出的错误
零填充
Zerofill—当显示的长度不够设置的长度的时候在左侧补0占位显示;
创建表
注意:这里如果有zerofill零填充会把小数点算一个长度
- 默认精度就是默认的显示长度
Float和double是没有默认精度的
但是有一个类型是有默认精度的就是decimal小数类型
定点型
Decimal比较准确,一般在存储关于钱的数据的时候都使用decimal
Decimal的默认精度是(10,0);
案例:
表结构创建
数据测试
总结
Float和double的比较
精度方面:float有误差,double存储没有误差,因为数据库存储计算的时候使用的就是double类型
Decimal和float的标准
四舍五入方面
Float;如果小数长度超过了设置长度的1位—直接舍去,如果超过了一位以上四舍五入
Decimal: 如果小数长度超过了设置的长度直接四舍五入
通常如果这个小数类型是用来存储钱的时候就用decimal
字符串型
- 在utf8编码中一个字符占用3个字节
- 在gbk编码中一个字符占用2个字节
Char
Char是一个定长的最多能存储255个字符
- 插入时,字符串长度问题
- 自动填充空格的问题
插入数据
插入7个长度的字符串
插入10个长度的字符串
查看结果
Varchar
Varchar:可变字符类型,这里如果插入的字符不够设置的长度,会自动回收多于的空间
存储时以字节存储,会受到字符编码的影响 最多存储65535个字节
create table num12
(
name varchar() — 这里规定的可以显示的字符长度 一个字符占3个字节
— 计算这里括号里最多可以设置多长 65535字节/3=2万多个字符
)charset=utf8
Utf8中一个字符占3个字节
Gbk中一个字符占2个字节
案例:
Char和varchar的比较
- Char是定长,之规定存储多少字符,也是按照字符的个数来存储的,如果存储的字符少于规定的长度,多于的空间不能自动回收
- Varchar 是变长(不够设置的长度的话会自动的回收多于的空间),以字节来存的,但是varchar(20)规定的是最多存储20个字符
什么时候使用char ,什么时候使用varchar
问题:手机号存用什么存?
用char(定长)来存,手机号是固定的长度,都是11位
问题:新闻标题用什么存?
新闻标题字符数不确定,用varchar来存
Char 会浪费空间,执行效率高
Varchar 节省空间,执行效率低
Set
在MySQL中是一个多选类型,存储的是字符串,用途是供用户来选择,用户插入的值只能从set选项里边来插入
扩展:set 在MySQL底层计算的时候是以整数来计算的
sex set(‘男’,’女’,’保密’)
这里第一个值是 男—-1—2的0次方
这里第二个值是 女—-2—2的1次方
这里第三个值是 保密—4—2的2次方
所以在插入数据的时候我们还可以以整数的形式进行插入
表结构
插入数据
Enum
单选,单选的值是以字符串来保存的,内计算的时候是以整形来计算,所以单选的执行效率比较高
表结构
插入数据
扩展enum也可以用数字来插入
enum中有三个值
第一个是 男—-1
第二个是 女—-2
第三个是 保密—-3
第一个值就是1,第二个值就是2,第三个值就是3,第四个值就是4;
注意:单选每次只能插入一个值
比较set和enum的区别和相同点
不同的地方
-
- Set每次可以插入多个选项的值 Enum每次只能插入一个选项的值
- Set用整数插入的时候 第一个选项的值2的0次方 第二个值是2的1次方… Enum用整数插入的时候,第一个选项的是是1,第二个选项的值是2,第三个选项的设置是3
- Set 可以用整数的和代表几个选项,比如 3=2的零次方+2的一次方 = 男,女
相同的地方
- Set和enum底层计算都是用整数来计算,插入的时候都可以使用整数来插入
时间型
这个类型不常用,一般存储时间的我们用int
这里datetime和timestamp类型比较相似,最大的区别就是取值范围不一样
时间类型插入的时间格式(注意插入的时候时间用引号引起来)
案例使用
表结构
插入数据时间格式1
插入的时间格式2
插入的时间格式3
字段属性
Not null /null
含义:限制字段值是否是null
Not null—-限制字段值不能为null
Null——字段值允许为 null
这里 空字符串 等于null 吗? 0等于 null吗? 不全等
Comment
一个字段的说明
Auto_increment &&Primary key
Auto_increment:自动增长,用于整形,每次默认自动加1
Primary key : 就是能唯一确定一行(记录)的字段,说白了就是一个‘身份证号‘
总结:主键字段一般和auto_increment 连用,自动增长,
设置过主键和自动增长的字段表属性里会多增加一个属性AUTO_INCREMENT
用来表示下一次插入记录的时候,主键的值;如果主键的值是null那么就会使用表属性里边自动增长的值
- 表属性自动增长的值是表最大的主键值加1
- 主键能重复吗
Unique key
含义:字段的值不能重复
测试:
一般unique key会自动的加一个默认值是 null
这个null的含义就是’没有值’,多以唯一键一般都会加一个not null字段属性
Default(一般不单独使用)
含义:如果添加数据的时候没有给值,会自动用设置的默认值填充;一般和not null 连用
create table test20
(
id int primary key auto_increment,
name char(8) unique key not null default ‘a’
) charset = utf8;
一般数据库表设计的时候,都会加上一个not null,
- 第一执行效率比较快
- Null的特殊性
优化第一天案例英雄表
设计表:
- 一般字段类型的选择够用就行,不能过大(浪费空间)
- 一个表一般都有主键这个主键一般都设置成自动增长
- 字符串类型,看情况选择定长char(执行效率高)或是varchar(节省空间)
- 表字段除了主键一般都会使用字段属性 not null 如果不设置,后期的数据处理比较麻烦(唯一键的时候,可以有多个记录是null的情况出现)
修改表结构
增加字段
语法:alter table 表名 add 字段名 类型 [字段属性] [after 字段名]||[first ]
扩展
- 在某个字段后增加字段
- 增加的字段在表的字段顺序第一个
修改字段属性
语法:alter table 表名 modify 字段名 新的类型 新的字段属性
修改字段名&属性
语法:alter table表名 change 老字段名 新的字段名 新类型 新字段属性;
删除字段
语法:alter table 表名 drop 字段名;
修改数据表引擎
表属性的修改
语法:alter table 表名 表属性=新属性
扩展:修改字符集
重命名表
语法: alter table 表名 rename [to] 新表名
重命名表移动到别的数据库
语法 : alter table 表名 rename [to] 数据库名.表名;
注意:移动数据表的时候同时还可以给表重新命名
思考题
- 手机号码一般使用什么数据类型存储? Char
- QQ号 varchar
- 性别一般使用什么数据类型存储? Set 或enum
- 年龄信息一般使用什么数据类型存储? Int 或者 tinyint
- 照片信息一般使用什么数据类型存储? varchar
- 薪水一般使用什么数据类型存储? Num Decimal
- 学员姓名允许为空吗? Not null
- 家庭地址允许为空吗? Not Null
- 电子邮件信息允许为空吗? Null
- 考试成绩允许为空吗? Not null
- 在主键列输入的数值,允许为空吗? Not null
- 一个表可以有多个主键吗? 不可以
- 在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗? 可以
- 标识列允许为字符数据类型吗? 标识列主键,主键任意类型列都要每行值都唯种,要求自增标识列能用数值型
- 表中没有合适的列作为主键怎么办? 想加主键alter table table_name add constaint pk_tablename primary key (表主键列)
- 如果标识列A的初始值为1,增量为1,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始?4
注意注释的使用