一、数据类型
1、数值型
名称 | 取值范围 |
---|---|
tinyint(长度) | 有符号-128-128无符号 0-255 |
smallint(长度) | -2的15次方 - 2的15次方 |
mediumint(长度) | -2的23次方-2的23次方 |
int(长度) | -2的31次方-2的31次方 |
float(长度,小数位数) | float(5,2) 第一个是数值整体的长度加上小数点,第二个值是小数的位数 13.25 |
double(长度,小数位数) | double(5,2) 13.25 |
decimal(长度,小数位数) | decimal(5,2) 13.25 要求精确度很高的数据就使用decimal |
2、字符串
名称 | 取值范围 |
---|---|
char(长度) | char(5),char固定长度字符串,长度值char(0-255),如果存放的值超过了5系统报错 'abcdef'6个长度系统报错,这个类型如果字符串不满五个长度时,按五个长度算 |
varchar(长度) | 可变长度,长度取值0-65535,varchar(5)如果存放的值超过了5个长度也会报错,不满五个长度时系统会根据值的长度而变化计算空间 |
tinytext | 微字符串 0-255个长度的字符 |
text | 大文本型 0-65535 编辑器-->编辑的内容会有text或longtext进行存储 |
longtext | 超大文本 |
3、日期型
名称 | 取值范围 |
---|---|
datetime | 内部以日期格式存放数据 , 是以系统的时间为准 |
timestamp | 时间戳 , 是以mysql的时间为准 |
4、二进制
名称 | 取值范围 |
---|---|
Blob | 二进制类型 |
二、 SQL(DDL)
1、新建表
7.1.1 语法
代码语言:javascript复制create table [if not exists ] 表名(
字段名 数据类型(长度) [字段属性],
字段名 数据类型(长度) [字段属性],
字段名 数据类型(长度) [字段属性]
)engine=[innodb] charset=utf8;
属性说明
名称 | 说明 |
---|---|
primary key | 代表主键,唯一不重复 |
auto_increment | 代表当前键自增,保证当前的字段的类型为数值型,一般情况下主键设置自增 |
not null | 代表当前列的数据在添加时不能省略 |
default | 默认值 |
foreign key(字段名) | 设置外键 |
COMMENT '学号' | 说明 |
engine=innodb | 设置存储引擎 |
charset=utf8 | 设置表的编码 |
建表案例:
代码语言:javascript复制create table if not exists student(
studentno int not null auto_increment primary key,
loginpwd varchar(50) not null,
studentname varchar(50) not null,
gender char(1) default '男',
gradeid int,
phone char(11),
address varchar(100),
email varchar(20),
identitycard char(18)
)engine=innodb charset=utf8;
7.1.2、删除表
drop table if exists 表名; 如果表存在就删除
7.1.3、查看表结构
desc 表名;
2、修改表结构
7.2.1 修改表名
语法: alter table 原表名 rename 新表名;
案例: alter table newstudent rename student;
7.2.2 添加字段
语法: alter table 表名 add 添加的字段名 字段的类型(长度) 字段的属性;
案例: alter table grade add resultDate timestamp;
7.2.3 删除字段
语法:alter table 表名 drop 字段名;
案例: alter table student drop photo;
7.2.4 修改字段
语法: alter table 表名 change 原字段名 新字段名 字段类型(长度) 字段属性;
案例: alter table student change photo images varchar(500) not null;
3、主键与外键
7.3.1 相关理论
用于连接两张表之间的关系,解决的是数据的冗余,剧有关系的表中所有的关键字段联系在一起才能够组合成一条完整的可读性记录。
有外键的表是子表,没有外键的表是主表,一般情况下主表的数据信息会相对于少于子表(这不是绝对的)。主要还是看有没有关联字段(外键)。
设置主外键关系是在子表上进行设置.
主外键关系的名称,一般都是全大写,以FK为前缀,多个单词之间用下划线(_)分隔。
设置完主外键关系之后,子表中添加数据时的外键字段中的数据在主表中必须存在,如果不存在将会引发异常。
7.3.2 SQL操作
主键(唯一,非空,标识该条记录是一条唯一记录) :
创建主键有两种方式:
1) 第一种在建表时创建
代码语言:javascript复制create table grade(
gradeId int primary key auto_increment not null,
)
2) 建表时没有指定主键,后期来进行添加
//PK_主键名 为主键索引取一个名称
语法:alter table 表名 add constraint PK_主键名 primary key 表名(主键字段名);
案例:alter table student add constraint PK_GRADE_ID primary key student(studentno)
外键(两表之间逻辑关联,降低数据冗余):
外键的创建两种方式:
1) 第一种建表时没有指定,后期进行添加
语法: alter table 子表名 add constraint FK_ 外键名称 foreign key(子表中的关联字段) references 主表名(主表中的主键字段);
案例: alter table student add constraint FK_GRADE_ID1 foreign key (gradeid) references grade(gradeid)
2) 第二种在建表的时候指定主外键关系
代码语言:javascript复制mysql> create table result(
-> studentNo int,
-> subjectNo int,
-> examDate timestamp,
-> studentResult int,
-> foreign key(studentNo) references student(studentNo),
-> foreign key(subjectNo) references subject(subjectNo)
-> )engine=innodb charset=utf8;
4、数据表设计规范
什么是三大范式?
设计表的依据:按照三大范式设计的表不会出现数据冗余。
1)第一范式
任何表都有一个主键,并且每一个字段的原子性不可再分。
不满足第一范式
满足第一范式:
2) 第二范式:
第二范式在第一范式的基础上,所有的非主键字段,完全依赖主键,不能产生部分依赖。容易产生冗余数据
(3) 第三范式
在第二大范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖。
总结: 设计范式 设计表的依据,按照三范式的表,不会出现数据冗余。