Mysql 數(shù)據(jù)庫day2(2019.4.24)

一、回顧

二、修改表結(jié)構(gòu)

表結(jié)構(gòu)包含:字段名,字段類型,字段屬性

1.查看當(dāng)前表結(jié)構(gòu)

desc table_name;
image.png

2.增加字段

alter  table table_name add 字段名稱 字段類型 字段屬性 【first/after 某個(gè)字段】
image.png

添加字段的時(shí)候至少要說明字段的類型。否則的話會產(chǎn)生語法錯(cuò)誤。


image.png

image.png

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

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

在數(shù)據(jù)表的最前面添加字段:

alter table hero add deface int first;
image.png

添加字段時(shí)候必須要指明添加的字段的名稱,字段類型 ,字段長度。
如果沒有指定字段的位置,默認(rèn)添加的字段會添加到數(shù)據(jù)表的最后。
可以同時(shí)添加多個(gè)字段,每個(gè)字段的添加語句之間使用逗號隔開。

3.刪除字段

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

4.修改字段

修改表字段要分為兩種情況:

1)修改表字段的數(shù)據(jù)類型或者屬性

alter table table_name modify 字段名稱 字段類型 字段屬性
image.png

2)修改表字段的名稱

    alter table table_name change 原字段名 新的字段名 字段類型 字段屬性
image.png

image.png

看圖說話:
不僅可以修改字段的名稱,還可以修改字段類型以及字段的屬性。

三、MySQL數(shù)據(jù)類型

1.數(shù)據(jù)類型的概念

不同的數(shù)據(jù)類型存儲的形式,存儲的空間,以及數(shù)據(jù)處理的效率是不一樣的。
PHP的數(shù)據(jù)類型:
標(biāo)量類型: 整型 字符串 浮點(diǎn)型 布爾型
組合類型(復(fù)雜類型):數(shù)組 對象
特殊類型:null 資源
MySQL的數(shù)據(jù)類型:
數(shù)值類型:字符串類型:日期時(shí)間類型:


image.png

2.數(shù)值型

1)整型

整型有五種。
tinyint :微整型(迷你整型),使用1個(gè)字節(jié)進(jìn)行存儲。也就是2的8次方個(gè)狀態(tài),最大表示的數(shù)據(jù)是255。
smallint:小整型。使用2個(gè)字節(jié)進(jìn)行存儲。最大表示65535個(gè)狀態(tài)。
mediumint:中整型。使用3個(gè)字節(jié)進(jìn)行存儲。
int :標(biāo)準(zhǔn)整型,使用4個(gè)字節(jié)進(jìn)行存儲。
bigint :大整型。使用8個(gè)字節(jié)存儲。
一個(gè)字節(jié)是8個(gè)二進(jìn)制位。
28種狀態(tài)。表示的數(shù)字就是2個(gè)。255。

有符號數(shù)與無符號數(shù)的區(qū)別:
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

創(chuàng)建一個(gè)整型各種類型字段的表:

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

如果保存的數(shù)據(jù)不是整形:

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

如果保存的數(shù)據(jù)超出了范圍:

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

看圖說話:
數(shù)據(jù)庫整型數(shù)據(jù)默認(rèn)的是有符號的數(shù)據(jù)。通過desc查看表字段的信息是看不出來的


image.png

無符號的整形:
給表添加一個(gè)無符號的整形列:

alter table my_int add int_6 tinyint unsigned;
image.png

嘗試插入255的數(shù)據(jù):

insert Into  my_int values(1,1,1,1,1,255);

image.png

整形之后的數(shù)字:
image.png

添加一個(gè)新的字段:要求字段使用0填充:
比如說 :
1 2 3 10 100 1000
要修所有的數(shù)據(jù)長度一致:
0001 0001 0001 0010 0100 1000

alter table my_int add int_7 int zerofill;
image.png

插入數(shù)據(jù)查看0填充效果:

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

2)小數(shù)型

帶有小數(shù)點(diǎn)或者范圍超出整型的數(shù)值型的數(shù)據(jù)就是小數(shù)型的數(shù)據(jù)。
SQL中將小數(shù)型數(shù)據(jù)又分為浮點(diǎn)型與定點(diǎn)型。
浮點(diǎn)型:小數(shù)點(diǎn)會浮動(dòng),精度有限,而且有可能會丟失精度
定點(diǎn)型:小數(shù)點(diǎn)固定。精度比較高。不會丟失精度。
創(chuàng)建表:

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

插入幾條數(shù)據(jù):

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

浮點(diǎn)型數(shù)據(jù):
浮點(diǎn)型數(shù)據(jù)是一種精度型數(shù)據(jù)。在超出指定的范圍之后會產(chǎn)生精度丟失,也就是四舍五入。
浮點(diǎn)型分為兩種:
float :單精度。使用4個(gè)字節(jié)存儲數(shù)據(jù)。精度范圍大概在6位左右。
double:雙精度。使用8個(gè)的字節(jié)存儲數(shù)據(jù)。精度范圍是在16位左右。
float與double如果沒有指定精度的話會按照實(shí)際的精度存儲。


image.png

創(chuàng)建浮點(diǎn)型表:

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

插入數(shù)據(jù):

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

看圖說話:
如果在創(chuàng)建字段的時(shí)候直接使用float創(chuàng)建,那么數(shù)據(jù)保存的時(shí)候是直接按照數(shù)據(jù)自己的精度進(jìn)行保存的。如果使用的是float(M,D )這種方式創(chuàng)建的,那么數(shù)據(jù)存儲的方式是小數(shù)位是D位,小數(shù)位和整數(shù)位總共是M位,整數(shù)位就是M-D為。
float類型的小數(shù)默認(rèn)的有效精度是6位,decimal有效小數(shù)位默認(rèn)是16位。

浮點(diǎn)型整數(shù)部分超出數(shù)據(jù)的指定范圍:

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

看圖說話:
浮點(diǎn)型小數(shù)在數(shù)據(jù)保存的時(shí)候整數(shù)部分是不能夠超出范圍的。

浮點(diǎn)型小數(shù)部分超出范圍:

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

小數(shù)部分是可以超出數(shù)據(jù)范圍的,但是超出的部分要進(jìn)行四舍五入。就會產(chǎn)生數(shù)據(jù)精度的丟失。

如果是數(shù)據(jù)庫自身在四舍五入的時(shí)候產(chǎn)生進(jìn)位的情況:

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

如果插入最大值是自己規(guī)定的標(biāo)準(zhǔn)最大值得時(shí)候是可以進(jìn)行正常插入的,但是如果是小數(shù)進(jìn)位造成的數(shù)據(jù)進(jìn)位變成最大值,是不允許插入的。

定點(diǎn)型小數(shù):


image.png

decimal 定點(diǎn)型小數(shù),decimal他的存儲有效范圍適合double一樣的,但是decimal的精度是由M和D的值決定的,同時(shí)decimal的存儲空間也是有M決定的。也就是decimal不是占用一個(gè)固定大小空間。
decimal他的整數(shù)默認(rèn)的是10位,小時(shí)默認(rèn)的是0位,所以decimal默認(rèn)的是整形。
所以decimal的標(biāo)準(zhǔn)用法是decimal(M,D)。

float , double ,decimal都可以使用(M,D)這種方式進(jìn)行申明。但是float小數(shù)位默認(rèn)的是6位。double默認(rèn)的小數(shù)位保存的是16位。而decimal的小數(shù)位可以保存30位。

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

如果插入的字段是大于30位的小數(shù)位:

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

實(shí)際上,float(M,D)和double(M,D)這種格式不是浮點(diǎn)型的典型用法。而decimal(M,D)才是定點(diǎn)類型數(shù)據(jù)的標(biāo)準(zhǔn)用法,所以在使用浮點(diǎn)類型數(shù)據(jù)的時(shí)候,如果不是實(shí)際需要,盡量不要使用M,D的格式類型。如果使用了,可能會影響數(shù)據(jù)的精度。也會影響數(shù)據(jù)庫的遷移。


image.png

3.日期與時(shí)間類型

日期格式也是數(shù)據(jù)庫常用的一種數(shù)據(jù)類型,比如說添加時(shí)間,刪除時(shí)間,下單時(shí)間。。。


image.png

1)datetime數(shù)據(jù)類型

格式:YYYY-MM-dd HH:ii::ss
b表示的范圍: 1000- 01-01 00:00:00 到 9999-12-31 23:59:59
注意:
datatime格式可以省略中間的分隔符號,而且這個(gè)分隔符號也可以是任何符號。
datetime是不能省略前導(dǎo)0。


image.png

創(chuàng)建表:

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

插入數(shù)據(jù):

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

所有保存進(jìn)入數(shù)據(jù)的數(shù)據(jù)會重新進(jìn)行格式化,保證數(shù)據(jù)在數(shù)據(jù)庫中是相同的格式。格式是YYYY-mm-dd HH:ii:ss.
如果插入的是一個(gè)錯(cuò)誤的時(shí)間格式:

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

如果說我希望數(shù)據(jù)插入的時(shí)間是數(shù)據(jù)進(jìn)入數(shù)據(jù)庫的當(dāng)下時(shí)間》
now():數(shù)據(jù)獲取當(dāng)前時(shí)間的函數(shù)。

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

2)timestamp數(shù)據(jù)格式

時(shí)間戳類型也是數(shù)據(jù)的一種時(shí)間類型,這個(gè)時(shí)間戳與常規(guī)PHP時(shí)間戳是不同的,而這個(gè)類型是從格式上與datetime格式完全一致,只是在數(shù)據(jù)的存儲上使用4個(gè)字節(jié)的int類型存儲。

3)date

日期類型,相當(dāng)于datetime的日期部分。

4)year

年份,有兩種表示形式y(tǒng)ear(2)表示1970- 2069,year(4)表示1901-2155年。表示的時(shí)間范圍不一樣。默認(rèn)是year(4)的格式。
兩位
(00-69,2000--2069)
(70-99 1970--1999)
四位表示范圍:1901-2155

alter table my_date add myear year ;
image.png

5)time

時(shí)間段,指定的某個(gè)時(shí)間之間,從-時(shí)間到+時(shí)間之間的時(shí)間

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

注意:
在實(shí)際開發(fā)中,PHP具有非常強(qiáng)大的時(shí)間函數(shù)。
time():獲取當(dāng)前的時(shí)間戳;
date():格式化時(shí)間;
所以為了加快數(shù)據(jù)庫的速度,我們更多的是使用int格式來存儲時(shí)間戳格式的數(shù)據(jù)。
alter table my_date add timestamp1 int;

5.字符串類型

數(shù)據(jù)庫將字符串類型的數(shù)據(jù)分為六種:

char , varchar , text ,enun ,set ,blob

1)char

固定長度的字符串,就是表示在數(shù)據(jù)表建表的時(shí)候就已經(jīng)吧數(shù)據(jù)長度就規(guī)定好了。

char(L):L表示長度,單位是字符,char類型最大的長度是255。
在插入當(dāng)中》utf8編碼下。一個(gè)中文字符3個(gè)字節(jié),一個(gè)英文字符1個(gè)字節(jié)。
所以char的最大存儲長度是255*3。

2)varchar

變長字符串 ,在數(shù)據(jù)表定義的時(shí)候,指定的長度是數(shù)據(jù)存儲的最大的長度,數(shù)據(jù)開辟的空間都是按照最大的空間開辟。實(shí)際所占用的位置要按照實(shí)際存儲的數(shù)據(jù)的大小來決定。
varchar(L):L也表示長度。表示的是在定義時(shí)所開辟的長度,實(shí)際如果達(dá)不到這個(gè)長度,就按照實(shí)際的漲肚存儲。varchar 默認(rèn)最大的長度是65535個(gè)字符。注意:varchar類型除了要保存數(shù)據(jù)的實(shí)際內(nèi)容之外還需要保存數(shù)據(jù)的長度,所以varchar一般會使用1-2個(gè)字符去保存數(shù)據(jù)的長度。
創(chuàng)建表:

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

插入數(shù)據(jù):

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

插入超出范圍的長度

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

image.png

如何選用變長字符串還是使用定長的字符串(定長類型與變長類型的區(qū)別):
如果在實(shí)際使用中,字符的長度是固定的,那么就使用char類型,比如說身份證號碼,手機(jī)號碼,學(xué)號。
當(dāng)字符的長度不確定的時(shí)候使用變長類型,變長類型是varchar,現(xiàn)在默認(rèn)的不用需截?cái)嘧址迦搿?br> 為什么定長類型的字段又浪費(fèi)空間的可能,還是會使用,而變長字段有非常好的自動(dòng)調(diào)節(jié)能力,有的時(shí)候也不會使用?
當(dāng)時(shí)用定長的時(shí)候系統(tǒng)不需要去管理數(shù)據(jù)的長度開銷,系統(tǒng)的速度就會相對比較快。而那邊長就相對比較慢,但是會節(jié)省空間。
注意:在實(shí)際開發(fā)過程中,如果字符串的長度超過了255,一般不會使用char也不會使用varchar,而是使用text類型的數(shù)據(jù)格式。

3)文本字符串

如果要存儲的字符串的長度比較大就使用文本類類型的數(shù)據(jù)格式進(jìn)行存儲。
文本類型的數(shù)據(jù)格式按照存儲的數(shù)據(jù)的格式分為兩類:
存儲字符串格式的數(shù)據(jù)使用text類型的數(shù)據(jù)。
存儲二進(jìn)制格式的數(shù)據(jù)使用blob格式的數(shù)據(jù)。(通常不用)

4)枚舉字符串

image.png

枚舉類型:非常類似于HTML 當(dāng)中的radio(單選框)
enum事先會將所有有可能使用的結(jié)果都定義好,在使用的時(shí)候只能從定義好的結(jié)果里面去選擇使用。
定義:
enum(第一個(gè)值,第二個(gè)值,第三個(gè)值。。。)
創(chuàng)建表:

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

image.png

當(dāng)插入的數(shù)據(jù)不是事先定義好的數(shù)據(jù)的時(shí)候會產(chǎn)生錯(cuò)誤。
使用enum的意義:
1.使用事先定義好的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)格式的固定。保證數(shù)據(jù)的規(guī)范化。
2.節(jié)約空間。在MySQL中eNum實(shí)際上是使用int來進(jìn)行存儲的。
事實(shí)上數(shù)據(jù)庫將enum的對應(yīng)關(guān)系存儲在數(shù)據(jù)的日志當(dāng)中,數(shù)據(jù)在進(jìn)入數(shù)據(jù)庫以及出來數(shù)據(jù)庫的時(shí)候都要進(jìn)過加工。

證明enum是使用int存儲的:
第一種方法:
數(shù)字+0 = 數(shù)字。我們可以使用這種機(jī)制查看enum數(shù)據(jù)。

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

image.png

當(dāng)插入的數(shù)據(jù)不是事先定義好的數(shù)據(jù)的時(shí)候會產(chǎn)生錯(cuò)誤。
使用enum的意義:
1.使用事先定義好的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)格式的固定。保證數(shù)據(jù)的規(guī)范化。
2.節(jié)約空間。在MySQL中eNum實(shí)際上是使用int來進(jìn)行存儲的。
事實(shí)上數(shù)據(jù)庫將enum的對應(yīng)關(guān)系存儲在數(shù)據(jù)的日志當(dāng)中,數(shù)據(jù)在進(jìn)入數(shù)據(jù)庫以及出來數(shù)據(jù)庫的時(shí)候都要進(jìn)過加工。
證明enum是使用int存儲的:
第一種方法:
數(shù)字+0 = 數(shù)字。我們可以使用這種機(jī)制查看enum數(shù)據(jù)。

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

第二種方法:

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

5)set集合

集合與枚舉非常好相似,只不過一個(gè)是單選,一個(gè)是多選,set就是多選,相當(dāng)于HTML當(dāng)中CheckBox。
集合的數(shù)據(jù)也是以數(shù)字的形式進(jìn)行存儲的。
使用的時(shí)候不同的元素使用逗號進(jìn)行分割

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

image.png

證明set是以數(shù)字存儲的:

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

以數(shù)字的格式進(jìn)行set數(shù)據(jù)存儲。


image.png

image.png

集合中數(shù)據(jù)元素存儲的順序是沒有影響的。調(diào)整元素的順序不對存儲的數(shù)組產(chǎn)生影響。
可以很好的提高磁盤的利用率。

6)總結(jié)

類型選擇的黃金定律:

  • 先選擇大類型,再選擇小類型
  • 具體的小類型原則:越小越好,越簡單越好,不使用null最好。

四、關(guān)系

實(shí)體:現(xiàn)實(shí)中真實(shí)存在的個(gè)體,能夠看得見,摸得著或者感受得到。實(shí)體反映到數(shù)據(jù)庫當(dāng)中相當(dāng)于數(shù)據(jù)的一條記錄。實(shí)體集相當(dāng)于數(shù)據(jù)表。實(shí)體的屬性相當(dāng)于表的字段(列)。
表與表之間具有關(guān)聯(lián),那么實(shí)體與實(shí)體之間也有關(guān)聯(lián)。實(shí)體與實(shí)體之間的關(guān)系大致分為三種:一對一的關(guān)系,一對多的關(guān)系,多對多的關(guān)系。

1.一對一

學(xué)生表:姓名,性別,年齡,身高,體重,籍貫,住址,身份證號碼。


QQ截圖20190425203538.jpg
QQ截圖20190425203406.jpg
QQ截圖20190425203423.jpg
QQ截圖20190425203505.jpg

五、范式

normal format :是離散數(shù)學(xué)的概念。是為了解決數(shù)據(jù)的存儲于優(yōu)化的問題。
數(shù)據(jù)存儲后,能夠通過關(guān)系查找出來的數(shù)據(jù)堅(jiān)決不再進(jìn)行存儲。范式的目標(biāo)是為了減少數(shù)據(jù)的冗余。
范式是一種分層的結(jié)構(gòu),總共分為六層。1Nf-6NF。每一次都比上一層更加的嚴(yán)格。而且滿足下一層范式的要求必須是要符合上衣層范式的基礎(chǔ)上。
MySQL數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫。存儲的數(shù)據(jù)是實(shí)體與實(shí)體關(guān)系的抽象。而范式是解決關(guān)系存儲過程中的數(shù)據(jù)冗余問題。從這個(gè)角度來說,范式剛好符合MySQL數(shù)據(jù)庫的設(shè)計(jì)。
但是數(shù)據(jù)庫不僅僅只是解決空間問題,還要解決效率問題,所以有的時(shí)候我們需要故意的違反范式的設(shè)計(jì)去存儲數(shù)據(jù)。但是范式在數(shù)據(jù)庫的設(shè)計(jì)過程中具有指導(dǎo)意義。特別是前三層。所以我們在設(shè)計(jì)數(shù)據(jù)庫的過程中要基本滿足三層范式。

1.1NF 第一范式

在設(shè)計(jì)數(shù)據(jù)庫存儲數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)困當(dāng)中存儲的某個(gè)元素,在取出來使用之前還需要再次進(jìn)行處理(比如說拆分),那么我們說這樣的數(shù)據(jù)庫關(guān)系式不符合第一范式的。
滿足第一范式的關(guān)系叫做規(guī)范化的關(guān)系,否則稱之為不規(guī)范化的關(guān)系。關(guān)系數(shù)據(jù)庫研究的都是規(guī)范化的關(guān)系。所以說數(shù)據(jù)庫設(shè)計(jì)至少要滿足第一范式。也就是數(shù)據(jù)庫表中的屬性具有原子性(不可拆分)。

QQ截圖20190425203622.jpg

以上表中,教師沒辦法單獨(dú)的作為主鍵先確定帶某個(gè)班級的時(shí)間,只有在于班級一起作為主鍵(組合主鍵)才能確定班級的上課天數(shù)。但是在這張表中,教師的性別和年齡只是依賴教師ID單獨(dú)確定的。也就是說表中的字段是依賴于主鍵中的某個(gè)字段而不是主鍵所有字段。這種情況叫做部分依賴。需要重新對表進(jìn)行設(shè)計(jì),比如這里講老師的信息放在老師表中。

解決辦法:
第一種:將部分依賴的字段放在單獨(dú)的依賴表中
第二種:將組合主鍵換為邏輯主鍵,比如上面的表中再添加一個(gè)ID的字段
總結(jié):第二范式是為了消除非主鍵對主鍵的部分依賴。
只要不存在組合主鍵就不會存在部分依賴,也就是符合2NF。
如果需要這樣的主鍵去確定唯一性,我們可以設(shè)計(jì)成unique key 也就是唯一索引。

3.3NF 第三范式

要滿足第三范式必須先滿足第二范式。

理論上,一張表中所有的字段都應(yīng)該直接依賴于主鍵。也就是根據(jù)主鍵可以唯一的確定這個(gè)字段的值。但是如果在表設(shè)計(jì)的過程中,存在這樣的一個(gè)字段,他是依賴于一個(gè)非主鍵的字段而確定的,這個(gè)非主鍵是根據(jù)主鍵確定的,最終造成第一個(gè)字段依賴于主鍵確定。那么我們稱這種依賴關(guān)系為傳遞依賴。
第三范式就是要解決這種傳遞依賴的問題。


QQ截圖20190425203916.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容