MySQL—day2

一、 修改表结构

表结构包含:字段名,字段类型,字段属性

1.查看当前表结构

desc table_name;
image.png

2.增加字段

alter  table table_name add 字段名称 字段类型 字段属性 【first/after 某个字段】
image.png

添加字段的时候至少要说明字段的类型。否则的话会产生语法错误。


image.png
image.png

在字段hp之前添加mp的字段

alter table hero add mp int after skill;
image.png

在数据表的最前面添加字段:

alter table hero add deface int first;
image.png

添加字段时候必须要指明添加的字段的名称,字段类型 ,字段长度。

如果没有指定字段的位置,默认添加的字段会添加到数据表的最后。

可以同时添加多个字段,每个字段的添加语句之间使用逗号隔开。

3.删除字段

alter  table  table_name drop 字段名称;
image.png

4.修改字段

修改表字段要分为两种情况:

1) 修改表字段的数据类型或者属性

alter table table_name modify 字段名称 字段类型 字段属性
image.png

2) 修改表字段的名称

alter table table_name change 原字段名 新的字段名 字段类型 字段属性
image.png

image.png

看图说话:

不仅可以修改字段的名称,还可以修改字段类型以及字段的属性。

二、 MySQL数据类型

1. 数据类型的概念

不同的数据类型存储的形式,存储的空间,以及数据处理的效率是不一样的。

PHP的数据类型:

标量类型: 整型 字符串 浮点型 布尔型

组合类型(复杂类型):数组 对象

特殊类型:null 资源

MySQL的数据类型:

数值类型:字符串类型:日期时间类型:

image.png

2. 数值型

1) 整型

整型有五种。

tinyint :微整型(迷你整型),使用1个字节进行存储。也就是2的8次方个状态,最大表示的数据是255。

smallint:小整型。使用2个字节进行存储。最大表示65535个状态。

mediumint:中整型。使用3个字节进行存储。

int :标准整型,使用4个字节进行存储。

bigint :大整型。使用8个字节存储。

一个字节是8个二进制位。

28种状态。表示的数字就是2个。255。

有符号数与无符号数的区别:

0000 0001 无符号的 1

0000 0001 有符号的 +1

1111 1111 无符号的 255

 128+64+ 32+16+ 8+4+ 2+ 1 = 255

1111 1111 有符号 -127

    -(  64+ 32+16+ 8+4+ 2+ 1 ) =  -127
image.png

创建一个整型各种类型字段的表:

create table my_int (
int_1 tinyint ,
int_2 smallint ,
int_3 mediumint ,
int_4 int ,
int_5 bigint
) charset utf8;
image.png
insert into  my_int values(1,1,1,1,1);
image.png

如果保存的数据不是整形:

insert into my_int values(1,1,1,1,’a’);
image.png

如果保存的数据超出了范围:

insert into my_int values(255,255,255,255,255);
image.png

看图说话:

数据库整型数据默认的是有符号的数据。通过desc查看表字段的信息是看不出来的


image.png

无符号的整形:

给表添加一个无符号的整形列:

alter table my_int add int_6 tinyint unsigned;
image.png

尝试插入255的数据:

insert Into  my_int values(1,1,1,1,1,255);
image.png

整形之后的数字:

image.png

添加一个新的字段:要求字段使用0填充:

比如说 :

1 2 3 10 100 1000

要修所有的数据长度一致:

0001 0001 0001 0010 0100 1000

alter table my_int add int_7 int zerofill;
image.png

插入数据查看0填充效果:

insert  into  my_int (1,1,1,1,1,1,1);
image.png

2) 小数型

带有小数点或者范围超出整型的数值型的数据就是小数型的数据。

SQL中将小数型数据又分为浮点型与定点型。

浮点型:小数点会浮动,精度有限,而且有可能会丢失精度

定点型:小数点固定。精度比较高。不会丢失精度。

创建表:

create table my_float (
float_1 float(9,2),
float_2 decimal(9,2)
)charset utf8;
image.png

插入几条数据:

insert Into my_float values (1.23456789,1.23456789);
insert into my_float values (1234567.89,1234567.89);
insert into my_float values (1234567.23,1234567.23);
image.png

浮点型数据:

浮点型数据是一种精度型数据。在超出指定的范围之后会产生精度丢失,也就是四舍五入。

浮点型分为两种:

float :单精度。使用4个字节存储数据。精度范围大概在6位左右。

double:双精度。使用8个的字节存储数据。精度范围是在16位左右。

float与double如果没有指定精度的话会按照实际的精度存储。

image.png

创建浮点型表:

create table you_float(
f1 float,
f2 float(10,2),
f3 float(6,2)
);
image.png

插入数据:

insert into you_float values (1,2,3);
insert into you_float values (1.23456,1.23456,1.23456);
insert intp you_float values (12345678.23,12345678.23,1234.56);
image.png

看图说话:

如果在创建字段的时候直接使用float创建,那么数据保存的时候是直接按照数据自己的精度进行保存的。如果使用的是float(M,D )这种方式创建的,那么数据存储的方式是小数位是D位,小数位和整数位总共是M位,整数位就是M-D为。

float类型的小数默认的有效精度是6位,decimal有效小数位默认是16位。

浮点型整数部分超出数据的指定范围:

insert into you_float values (1234,123456789.12,1234.34);
image.png

看图说话:

浮点型小数在数据保存的时候整数部分是不能够超出范围的。

浮点型小数部分超出范围:

insert into you_float
values(123456.2345,12345678.12345,1234.34565432);
image.png

小数部分是可以超出数据范围的,但是超出的部分要进行四舍五入。就会产生数据精度的丢失。

如果是数据库自身在四舍五入的时候产生进位的情况:

insert into you_float values (99999999,99999999.99,9999.99);
insert into you_float values (99999999,99999999.999,9999.999);
image.png

如果插入最大值是自己规定的标准最大值得时候是可以进行正常插入的,但是如果是小数进位造成的数据进位变成最大值,是不允许插入的。

定点型小数:

image.png

decimal 定点型小数,decimal他的存储有效范围适合double一样的,但是decimal的精度是由M和D的值决定的,同时decimal的存储空间也是有M决定的。也就是decimal不是占用一个固定大小空间。

decimal他的整数默认的是10位,小时默认的是0位,所以decimal默认的是整形。

所以decimal的标准用法是decimal(M,D)。

float , double ,decimal都可以使用(M,D)这种方式进行申明。但是float小数位默认的是6位。double默认的小数位保存的是16位。而decimal的小数位可以保存30位。

alter table you_float add f4 decimal(35,30);
image.png

如果插入的字段是大于30位的小数位:

alter table you_float add f5(35,31);
image.png

实际上,float(M,D)和double(M,D)这种格式不是浮点型的典型用法。而decimal(M,D)才是定点类型数据的标准用法,所以在使用浮点类型数据的时候,如果不是实际需要,尽量不要使用M,D的格式类型。如果使用了,可能会影响数据的精度。也会影响数据库的迁移。

image.png

3. 日期与时间类型

日期格式也是数据库常用的一种数据类型,比如说添加时间,删除时间,下单时间。。。

image.png

1) datetime数据类型

格式:YYYY-MM-dd HH:ii::ss

b表示的范围: 1000- 01-01 00:00:00 到 9999-12-31 23:59:59

注意:

datatime格式可以省略中间的分隔符号,而且这个分隔符号也可以是任何符号。

datetime是不能省略前导0。

image.png

创建表:

create table  my_date(
t1 datetime
) charset utf8;
image.png

插入数据:

insert into my_date values (‘2017-0708 12:23:32’);
insert into my_date values (‘2017-7-8 21:1:32’);
insert into my_date values (‘20110801122350’);
insert into my_date values (‘1992%05%23 23&13*12’);
image.png

image.png

所有保存进入数据的数据会重新进行格式化,保证数据在数据库中是相同的格式。格式是YYYY-mm-dd HH:ii:ss.

如果插入的是一个错误的时间格式:

insert into my_date  values (‘2017-13-35 12:12:12’);
image.png

如果说我希望数据插入的时间是数据进入数据库的当下时间》

now():数据获取当前时间的函数。

insert into my_date values (now());
image.png

2) timestamp数据格式

时间戳类型也是数据的一种时间类型,这个时间戳与常规PHP时间戳是不同的,而这个类型是从格式上与datetime格式完全一致,只是在数据的存储上使用4个字节的int类型存储。

3) date

日期类型,相当于datetime的日期部分。

4) year

年份,有两种表示形式year(2)表示1970- 2069,year(4)表示1901-2155年。表示的时间范围不一样。默认是year(4)的格式。

两位

(00-69,2000--2069)

(70-99 1970--1999)

四位表示范围:1901-2155

alter table my_date add myear year ;
image.png

5) time

时间段,指定的某个时间之间,从-时间到+时间之间的时间

alter  table my_date add mtime time;
image.png
insert into my_date values (now(),56,2);
image.png

注意:

在实际开发中,PHP具有非常强大的时间函数。

time():获取当前的时间戳;

date():格式化时间;

所以为了加快数据库的速度,我们更多的是使用int格式来存储时间戳格式的数据。

alter table my_date add timestamp1 int;

4.字符串类型

数据库将字符串类型的数据分为六种:

char , varchar , text ,enun ,set ,blob

1) char

固定长度的字符串,就是表示在数据表建表的时候就已经吧数据长度就规定好了。

char(L):L表示长度,单位是字符,char类型最大的长度是255。

在插入当中》utf8编码下。一个中文字符3个字节,一个英文字符1个字节。

所以char的最大存储长度是255*3。

2) varchar

变长字符串 ,在数据表定义的时候,指定的长度是数据存储的最大的长度,数据开辟的空间都是按照最大的空间开辟。实际所占用的位置要按照实际存储的数据的大小来决定。 varchar(L):L也表示长度。表示的是在定义时所开辟的长度,实际如果达不到这个长度,就按照实际的涨肚存储。varchar 默认最大的长度是65535个字符。注意:varchar类型除了要保存数据的实际内容之外还需要保存数据的长度,所以varchar一般会使用1-2个字符去保存数据的长度。

创建表:

create table my_char(
num char(18),
name varchar(30)
);
image.png

插入数据:

insert into my_char values('140611188809085411','ergouzi')
image.png

插入超出范围的长度

insert into my_char values('1406111888090854111','ergouzi')
image.png

image.png

如何选用变长字符串还是使用定长的字符串(定长类型与变长类型的区别):

如果在实际使用中,字符的长度是固定的,那么就使用char类型,比如说身份证号码,手机号码,学号。

当字符的长度不确定的时候使用变长类型,变长类型是varchar,现在默认的不用需截断字符插入。

为什么定长类型的字段又浪费空间的可能,还是会使用,而变长字段有非常好的自动调节能力,有的时候也不会使用?

当时用定长的时候系统不需要去管理数据的长度开销,系统的速度就会相对比较快。而那边长就相对比较慢,但是会节省空间。

注意:在实际开发过程中,如果字符串的长度超过了255,一般不会使用char也不会使用varchar,而是使用text类型的数据格式。

3) 文本字符串

如果要存储的字符串的长度比较大就使用文本类类型的数据格式进行存储。

文本类型的数据格式按照存储的数据的格式分为两类:

存储字符串格式的数据使用text类型的数据。

存储二进制格式的数据使用blob格式的数据。(通常不用)

4) 枚举字符串

image.png

枚举类型:非常类似于HTML 当中的radio(单选框)

enum事先会将所有有可能使用的结果都定义好,在使用的时候只能从定义好的结果里面去选择使用。

定义:

enum(第一个值,第二个值,第三个值。。。)

创建表:

create table my_set (
name varchar(30),
sex (‘男’,’女’,’就是你’)
);
image.png

image.png

当插入的数据不是事先定义好的数据的时候会产生错误。

使用enum的意义:

  1. 使用事先定义好的数据,实现数据格式的固定。保证数据的规范化。

  2. 节约空间。在MySQL中eNum实际上是使用int来进行存储的。

事实上数据库将enum的对应关系存储在数据的日志当中,数据在进入数据库以及出来数据库的时候都要进过加工。

证明enum是使用int存储的:

第一种方法:

数字+0 = 数字。我们可以使用这种机制查看enum数据。

select sex+0,sex from my_set;
image.png

第二种方法:

insert into my_set values (‘huoyuejia’,1);
image.png

5) set集合

集合与枚举非常好相似,只不过一个是单选,一个是多选,set就是多选,相当于HTML当中CheckBox。

集合的数据也是以数字的形式进行存储的。

使用的时候不同的元素使用逗号进行分割

alter table my_set add mset set('樱桃','苹果','香蕉','西瓜','榴莲');
image.png
insert into my_set values ('diaozhatian','女','榴莲,西瓜');
image.png

image.png

证明set是以数字存储的:

select name,sex,mset+0 from my_set;
image.png

以数字的格式进行set数据存储。

image.png

image.png

集合中数据元素存储的顺序是没有影响的。调整元素的顺序不对存储的数组产生影响。

可以很好的提高磁盘的利用率。

6) 总结

类型选择的黄金定律:

  • 先选择大类型,再选择小类型

  • 具体的小类型原则:越小越好,越简单越好,不使用null最好。

四、 关系

实体:现实中真实存在的个体,能够看得见,摸得着或者感受得到。实体反映到数据库当中相当于数据的一条记录。实体集相当于数据表。实体的属性相当于表的字段(列)。

表与表之间具有关联,那么实体与实体之间也有关联。实体与实体之间的关系大致分为三种:一对一的关系,一对多的关系,多对多的关系。

1. 一对一

学生表:姓名,性别,年龄,身高,体重,籍贯,住址,身份证号码。

image.png

把不常用的信息单独提出来作为一张表:


image.png

在主表中的任何一条数据,都能在附表中找到唯一的一条数据与它对应,或者附表没有对应的数据。我们称这样的额关系为一对一的关系。

2. 一对多

表1中的一条记录对应表2中的多条记录。但是反过来,表2中的一条记录在表1中只有一条记录与之对应。这种关系就是一对多,或者多对一。

淘宝的账户表:


image.png

收货地址表:


image.png

3. 多对多

一张表中的一个记录可以对应另一张表中的多个记录,同时反过来,一条B表中的记录也是对应多条A表中的记录。

老师与学生:

一个学生可以多个老师,一个老师也可以由多个学生。

老师表:

image.png

学生表:


image.png

这在种情况下,老师表想要与学生表建立联系,第一种方式就是在老师表里面或者学生里面添加字段。但是在添加字段的时候应该添加多少个字段?还有一种办法就是添加一个字段,然后呢在这个字段里面堆积所有学生信息。这样的话,在我们取数据的时候,或者存数据的时候,数据处理相当麻烦。

这种情况下我们只有去建立第三张表,第三标保存两个实体之间的关系:

老师学生关系表:

image.png

五、范式

normal format :是离散数学的概念。是为了解决数据的存储于优化的问题。

数据存储后,能够通过关系查找出来的数据坚决不再进行存储。范式的目标是为了减少数据的冗余。

范式是一种分层的结构,总共分为六层。1Nf-6NF。每一次都比上一层更加的严格。而且满足下一层范式的要求必须是要符合上衣层范式的基础上。

MySQL数据库是关系型数据库。存储的数据是实体与实体关系的抽象。而范式是解决关系存储过程中的数据冗余问题。从这个角度来说,范式刚好符合MySQL数据库的设计。

但是数据库不仅仅只是解决空间问题,还要解决效率问题,所以有的时候我们需要故意的违反范式的设计去存储数据。但是范式在数据库的设计过程中具有指导意义。特别是前三层。所以我们在设计数据库的过程中要基本满足三层范式。

1.1NF 第一范式

在设计数据库存储数据的时候,如果数据困当中存储的某个元素,在取出来使用之前还需要再次进行处理(比如说拆分),那么我们说这样的数据库关系式不符合第一范式的。

满足第一范式的关系叫做规范化的关系,否则称之为不规范化的关系。关系数据库研究的都是规范化的关系。所以说数据库设计至少要满足第一范式。也就是数据库表中的属性具有原子性(不可拆分)。


image.png

如果在使用数据的时候直接拿出来出发时间与结束时间是一个整体来使用的话。整个表的设计没有任何问题。但是如果使用的时候,开始时间与结束时间是单独使用的,那么我们的表设计就是有问题的,需要分成两个字段分贝进行存储。

总结: 设计表结构满足第一范式的要求是字段要保证原子性,也就是字段不可拆分。

2.2NF 第二范式

如果数据表再设计的过程中,数据表的主键是组合主键。但是数据的唯一性不是数据的组合主键决定而,而是组合主键中的某一个字段确定的。那么我们称这种设计为不符合第二范式的数据库设计。数据库字段与主键的依赖关系为不完全依赖。

第二范式就是首先数据库表的设计要符合第一范式,然后数据库的每个字段要与主键是完全依赖的关系(也就是数据的独立性是所有主键的字段一起决定的),这种关系称之为符合第二范式的关系。所有数据表都符合第二范式的数据库称之为符合第二范式的数据库。

image.png

以上表中,教师没办法单独的作为主键先确定带某个班级的时间,只有在于班级一起作为主键(组合主键)才能确定班级的上课天数。但是在这张表中,教师的性别和年龄只是依赖教师ID单独确定的。也就是说表中的字段是依赖于主键中的某个字段而不是主键所有字段。这种情况叫做部分依赖。需要重新对表进行设计,比如这里讲老师的信息放在老师表中。

解决办法:
第一种:将部分依赖的字段放在单独的依赖表中

第二种:将组合主键换为逻辑主键,比如上面的表中再添加一个ID的字段

总结:第二范式是为了消除非主键对主键的部分依赖。
只要不存在组合主键就不会存在部分依赖,也就是符合2NF。
如果需要这样的主键去确定唯一性,我们可以设计成unique key 也就是唯一索引。

3.3NF 第三范式

要满足第三范式必须先满足第二范式。

理论上,一张表中所有的字段都应该直接依赖于主键。也就是根据主键可以唯一的确定这个字段的值。但是如果在表设计的过程中,存在这样的一个字段,他是依赖于一个非主键的字段而确定的,这个非主键是根据主键确定的,最终造成第一个字段依赖于主键确定。那么我们称这种依赖关系为传递依赖。

第三范式就是要解决这种传递依赖的问题。

image.png

以上设计中:性别依赖于讲师,讲师依赖于主键,教室依赖于班级,班级依赖于主键。性别和教室都是传递依赖。

涉及办法:
将存在传递依赖的字段以及主键一起取出来单独组成一个新的表。
讲师表与班级表进行拆分。

总结:3范式主要解决传递依赖。

4.逆范式

有的时候在设计表示时候,如果数据表中的一些数据需要从另外一个数据表中根据关联查询去获取,理论上也能够取到数据。但是效率就会低很多,所以有的时候我们在设计数据表的时候,可以的在数据表中多增加一个字段去保存在查询时经常会获取的另一个数据表中的字段。这样在进行数据获取的时候使用一张数据表就能够获取到所有的数据。从而提高了查询效率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 一、回顾 二、修改表结构 表结构包含:字段名,字段类型,字段属性 1.查看当前表结构 2.增加字段 添加字段的时候...
    满天繁星_28c5阅读 443评论 0 0
  • 回顾 字段类型(列类型):数值型,时间日期型和字符串类型 数值型:整型和小数型(浮点型和定点型) 时间日期型:da...
    翊溪阅读 931评论 0 0
  • 一、子查询 可以将子查询放在许多的 SQL 子句中,包括:WHERE 子句; HAVING 子句;FROM 子句。...
    开源oo柒阅读 559评论 0 1
  • 一、建表规约 (1)目的 解决数据库相关名称的纠结 选择合适的数据类型和长度 (2)表、字段命名 必须使用小写字母...
    JefferyLcm阅读 171评论 0 0
  • 声明:本文内容纯属博主自己查找和归纳的个人所需的知识点,仅作参考,如有错误,博主强烈希望您指出。如果您是某个知识点...
    _DX3906阅读 303评论 0 0