数据类型
大体上SQL命令语言上用的数据类型和c语言差不多,只不过分的更详细,大体如下:
可以看出DDL语言数据类型都是列类型(因为mysql数据库中表为二维表,列数据的代号统称为字段,列类型即列字段的数据类型)
整数类型
细分为以下几种:
tinyint(1)、smallint(2)、mediumint(3)、int(4)、bigint(8) 括号中代表其类型数据所占的字节数。各自取值范围如下:
SQL语句定义表中字段形式:
create table tab1(f1 数据类型); /*tab1为表名,f1为字段名 | 数据类型:类型名[(长度n)][unsigned][zerofill]*/
- 长度n:表示该数字的“显示长度”
- unsigned:设定该类型数据为“无符号”数,则此时只能存储非负数,正数范围加倍
- zerofill:当数据长度不满足长度n时在左边补0(设置zerofill即默认设置了unsigned)
小数类型
细分为以下几种:
- 单精度浮点型:float,非精确数,通常不设定长度
- 双精度浮点型:double,非精确数,通常不设定长度(浮点数不能直接用来比较)
- 定点型:decimal,精确数,通常需设定长度(总长,小数位数)
小数设定unsigned相当于去掉了小数保留整数
字符串类型
最重要2个:
- varchar:可变长度字符串类型。最多能存储65532个字符(需考虑字符编码),实际长度以数据长度为准
- char:定长字符串类型,即字符串的长度一定。最多能存储256个字符,如果存储的数据不足设定的长度则会自动补空格填满
设定是都需给定长度,比如:varchar(20)、char(6)
mysql中一行的所有内容的总存储长度:限制为65535。
2个二进制文本:
- binary:与char类似,只是改类型存储的为文本的二进制数据
- varbinary:类似varchar,也是存储文本的二进制数据
大文本类型
- text:可以存储”超大文本“且实际的长度并不占用一行。效率较低
- blob:存储“超大二进制文本”,通常用于存储图片的“二进制数据”
2个“选项”文本存储形式:
enum:存储类似表单中“单选项”的值
形式:enum(‘选项1’,‘选项2’,‘选项3’);选项的值虽是字符串但其在数据库内部以数字存储(效率高),分别是1,2,3,.....有6万多个
结果:
set:专门用于存储表单中“多选项”的值
形式:set('选项1','选项2','选项3');选项的值虽是字符串但其在数据库内部以数字存储(效率高),分别是1,2,4,8,.....有6万多个
再看不存在的数据:
可见,enum、set类型的字段限制了“字符串”数据值
时间日期类型
如下:data、time、datatime、year、timestamp(注意:直接的时间日期数据写入数据库时应该用单引号)
- year类型可以是4位整数或4位纯数字字符串,也可是2位或2位纯数字字符串,注意year类型数据范围
- timestamp表示“时间戳”,其实就是“当前时刻”,本质表示从1970年1月1日0点0分到现在的秒数值
表定义语句
创建表
基本形式:
create table[if not exists]表名(字段列表,约束或索引列表) 表选项列表
//列表表示“多个”,之间用逗号隔开
//字段基本形式:字段名 类型[字段属性]
字段属性:
- not null:表示该字段不能放“null”这个值,不写则默认为空
- auto_increment:设定int类型的字段可以自增长,即其值无需写入会自动获得并增加,此属性跟primary key 或unique key一起使用
- [primary] key:设定为主键,唯一键“加强”,不能重复且不能使用null,并且可以作为确定任意一行数据的“关键值”where id = ..来确定某行数据;通常每个表都应该有主键且大多为自增长类型
- unique [key]:设定为唯一键:表示该字段的数据不能重复
- default '默认值':设定一个字段在没有插入的时候自动使用的值
- comment '字段注释':
举例:
索引列表
索引:“内置表”,该表的数据是对某个指示表的某些字段的数据排序之后的存储形式
作用:提高表查找的速度!(提高查找速度的同时,降低了增删改的速度)
建立索引:索引类型(字段1,字段2,...)//可使用多个字段建立索引,但通常是1个
- 普通索引:key(字段名1,字段名2,...):只具备索引的基本
- 唯一索引:unique key(字段名1,字段名2,...)
- 主键索引:primary key(字段名1,字段名2,...)
- 全文索引:fulltext(字段名,字段名2 , ...)
约束设置
约束:约束就是一种限定数据以符合某种形式的要求
约束种类:
- 主键约束:primary key(字段名1,字段名2,…)其实就是主键索引,也是主键属性。即primary key有三个角度的理解(说法):字段属性设置为主键,或建立的主键索引,或设定一个主键约束,本质一样
- 唯一约束:unique key(字段名1,字段名2),其实也是“三体合一”
-
外键约束
- 外键:就是设定一个表中的某个字段的值,必须“来源于”另一个表的某个主键字段的值
- 形式:foreign key (字段名1, 字段名2, ……)reference表名2(字段名1, 字段名2,…)
- 说明:对某个(些)字段设定外键,则相对应的其他表的对应字段需要设置为主键
- 非空约束:就是要求改字段的值不能为空,其只能在字段上当作字段属性来设定
- 默认约束:要求改字段的值在“空”的时候会自动填充该设定的默认值,也只能在字段上设定
- 检查约束:就是使用一个表达式(逻辑判断)来决定数据是否有效,比如年龄字段可以使用
表选项
就是对一个表的有关属性的设定,通常不需要有默认值。
Comment = ‘表的注释’;
Charset = 字符编码名称; //跟数据的字符编码设定是一个意思
字符编码设定范围和继承关系:
系统级设定:安装时确认
库级设定:建库时设定;
表级设定:charset = 字符编码名称
字段级设定:作为字段属性出现
只对“字符类型”的字段有效,每一级如果没有设定就会继承上一级的设定
Auto_increment = 起始整数; //自增长类型值的初值,默认为1;
Engine = “表的存储引擎名”;
存储引擎就是将数据存入硬盘(或其他媒介)的方式方法。通常就几个可用,默认是InnoDB
存储引擎决定一个数据表的各方面的信息:功能和性能
示例:
修改表
概述:
通常,创建一个表能做到的修改表也能做到。
增删改字段:
增:alter table 表名 add [column] 字段名 字段类型 字段属性
删:alter table 表名 drop 字段名
改:alter table 表名 change 原字段名 新字段名 新字段类型 新字段属性;
增删索引:
增删约束
修改表选项
修改表的基本形式:
Alter table 表名 修改语句1, 修改语句2, ……;
删除表:
Drop table [if exists] 表名;
表的其他操作:
- Show tables;
- Desc 表名;
- 显示表的创建语句:Show create table 表名;
- 从已有表复制表结构: create table [if not exists] 新表名 like 原表名
视图
视图使用
其实就是当做查询表来使用
Select * from 视图名 where 条件 order by…
修改视图:
Alter view 视图名【(列名1,列名2,。。。)】 as select 语句;
删除视图:
Drop view [if exists] 视图名;
数据库(数据表)的设计思想介绍
设定数据库本质就是设计表
数据库设计3范式(3NF)
范式:指设计数据库所需要遵循的原则
每个范式都是用来规定某种结构或数据要求后-后一范式都是在前一范式已经满足的基础上加强“要求”
第一范式(1NF),原子性
原子性:存储的数据应该“不可再分”
举例:
可见,其违反了原则性范式:学生字段的数据存储了多个可分的数据.修改为:
第二范式(2NF)唯一性
需要实现每一行数据都具有唯一可区分的特性并不能有部分依赖关系,通常,给一个表加主键(推荐做法),就可以做到“唯一区分”
但主键有这种情况:
设定一个字段为主键:此时,表示该一个字段的值就可以明确确定一行数据。
设定多个字段为主键:表示只有这多个字段的值都被确定后才能确定一行数据,也称“联合主键”
依赖:
如果确定一个表中的某个数据(A),则就可以确定表中其他另一个数据(B),则称:B依赖于A
实际上,一个表只要有主键,则其他非主键一定是依赖于主键的
部分依赖:
如果确定一个表中的某个数据组合(A,B),则就可以确定该表中的其他另一个数据(C),则称:C依赖于A和B(通常此时A,B作为主键)
但如果某个数据D,它只依赖于数据A,或者说,A一旦确定,则D也确定,此时我们就称:“数据D部分依赖于A”,可见部分依赖是指某个非主键字段依赖于联合主键字段的其中部分字段
举例:
改良后:
第三范式(3NF):独立性,消除传递依赖
在一个具有主键的表中,假设主键为A,其必然其他非主键都依赖于该主键,比如:B依赖于A,C依赖于A,D依赖于A,。。。但同时:如果该表中的某个字段B的值已确定,就能够确定另一个字段的值C,则称C依赖于B.
出现:C依赖于B,B依赖A—传递依赖,则消除该传递依赖的通常做法,就是将C依赖B中的数据,分离到另一个表中。
举例:
改良: