所謂的數(shù)據(jù)類型:對(duì)數(shù)據(jù)進(jìn)行統(tǒng)一的分類疾掰,從系統(tǒng)的 角度出發(fā)為了能夠使用統(tǒng)一的方式進(jìn)行管理,更好的利用有限的空間;
SQL中將數(shù)據(jù)類型分成了三大類:數(shù)值類型 字符串類型 時(shí)間日期類型
數(shù)值類型:都是數(shù)值
系統(tǒng)將數(shù)值型分為整數(shù)型和小數(shù)型
整數(shù)型
存放整形數(shù)據(jù):在sql中考慮到如何節(jié)省空間沪斟,所以系統(tǒng)將整形有細(xì)分了
5類
SQL中的數(shù)值類型全部是默認(rèn)有符號(hào)的:分正負(fù)
有時(shí)候需要使用無(wú)符號(hào)數(shù)據(jù):需要給數(shù)據(jù)類型限定:int unsigned; --無(wú)符號(hào) 從0開(kāi)始
例如:給student表添加一個(gè)height字段 類型為tinyint unsigned類型
alter table student add height tinyint unsigned after id;
插入數(shù)據(jù)
insert into student values(2, 255, 15, 'jim', 78);
查看表結(jié)構(gòu)的時(shí)候,發(fā)現(xiàn)每個(gè)字段的數(shù)據(jù)類型之后都會(huì)自帶一個(gè)括號(hào)暇矫,里面有制定的數(shù)字
顯示寬度:沒(méi)有特別含義主之,只是默認(rèn)告訴用戶可以顯示的形式而已,世界上用戶是可以控制的李根,這種控制不會(huì)改變數(shù)據(jù)的本身大小
顯示寬度的意義:在于當(dāng)前數(shù)據(jù)不夠顯示寬度的時(shí)候槽奕,回自動(dòng)讓數(shù)據(jù)變成顯示寬度
,通常需要搭配一個(gè)前導(dǎo)0來(lái)增加寬度房轿,不改變值大性猎堋:zerofill 零填充
小數(shù)型
小數(shù)型,
SQL中囱持;將小數(shù)細(xì)分為兩種:浮點(diǎn)型和定點(diǎn)型
浮點(diǎn)型:小數(shù)點(diǎn)浮動(dòng) 精度有限 而且會(huì)丟失精度
定點(diǎn)型:小數(shù)點(diǎn)固定夯接,精度固定 不會(huì)丟失精度
####### 浮點(diǎn)型
浮點(diǎn)型數(shù)據(jù)是一種精度典型數(shù)據(jù);以你為超出制定范圍之后洪唐,會(huì)丟失精度(四舍五入)
浮點(diǎn)型:理論分為兩種精度
Float:?jiǎn)尉茸甑牛加?個(gè)字節(jié)存儲(chǔ)數(shù)據(jù),精度范文大概為7位左右
Double:雙精度凭需,占用8個(gè)字節(jié)存儲(chǔ)數(shù)據(jù)问欠,精度范文大概為15位左右
創(chuàng)建浮點(diǎn)數(shù)表:浮點(diǎn)的使用方式,直接float表示沒(méi)有小數(shù)部分粒蜈;float(M,D);M代表總長(zhǎng)度顺献,D代表小數(shù)部分長(zhǎng)度 整數(shù)部分長(zhǎng)度為M-D;
create table my_float(
f1 float,
f2 float(10,2),
f3 float(6,2)
) charset utf8;
定點(diǎn)型:
絕對(duì)的保證整數(shù)部分不會(huì)被四舍五入(不會(huì)丟失精度)枯怖,小數(shù)部分有可能(理論小數(shù)部分也不會(huì)丟失精度)
時(shí)間類型
Datetime:時(shí)間日期是YYYY-mm-dd HH:ii:ss;表示的范圍是從1000年到9999年注整,有0值 0000-00-00 00:00:00
Date:日期 就是datetime中的date部分
Time:時(shí)間(段),制定某個(gè)區(qū)間之間,時(shí)間到-時(shí)間
Timestamp:時(shí)間戳肿轨,并不是時(shí)間錯(cuò)寿冕,并不是時(shí)間戳,只是從1970年開(kāi)始的YYYY-mm-dd HH:ii;ss格式與datetime完全一致
Year:年份 兩種形式 cc:表示1970到 year(4):1901-2156
網(wǎng)站是以PHP為實(shí)現(xiàn)的主要操作對(duì)象:PHP中有非常強(qiáng)大的時(shí)間日期處理函數(shù):date 椒袍,只需要一個(gè)時(shí)間戳就可以轉(zhuǎn)成任意類型的典型的時(shí)間驼唱,以PHP為主的時(shí)候,都是在數(shù)據(jù)庫(kù)使用時(shí)間戳(整形)開(kāi)存儲(chǔ)時(shí)間驹暑;
字符串類型
在MySQL中玫恳,將字符串類型分成了6類:char varchar text blob enum set
- char 定長(zhǎng)字符串 磁盤(pán)(二維表)在定義結(jié)構(gòu)的時(shí)候就已經(jīng)確定了最終數(shù)據(jù)的存儲(chǔ)長(zhǎng)度
Char(L):L代表;length 可以存儲(chǔ)的長(zhǎng)度 單位為字符 最大長(zhǎng)度的值可以為255
Char(4): 在UTF8環(huán)境下优俘,需要4*3=12個(gè)字節(jié)
變長(zhǎng)字符串
變長(zhǎng)字符串:varchar京办,在分配空間的時(shí)候,按照最大的空間分配帆焕,但是實(shí)際上最終用了多少惭婿,是根據(jù)具體的數(shù)據(jù)來(lái)確定
Varchar(L);L表示字符長(zhǎng)度叶雹,理論長(zhǎng)度65536個(gè)字符审孽,但是會(huì)多出1到2個(gè)字節(jié)來(lái)確定存儲(chǔ)的實(shí)際長(zhǎng)度
Varchar(10);的確存了10個(gè)漢字浑娜,utf8環(huán)境,10*3+1 = 31
定長(zhǎng)的磁盤(pán)空間比較浪費(fèi)式散,但是效率高筋遭;如果數(shù)據(jù)基本上確定長(zhǎng)度都一樣,就使用定長(zhǎng)暴拄,如:
身份證 電話號(hào)碼 手機(jī)號(hào)碼等
變成的磁盤(pán)空間比較節(jié)省漓滔,但是效率低; 如果數(shù)據(jù)不能確定長(zhǎng)度(不同數(shù)據(jù)有變化)乖篷;如姓名
地址等
文本字符串
如果數(shù)據(jù)量非常大响驴,通常超過(guò)255個(gè)字符就會(huì)使用文本字符串 分類text 和 blob
Text:存儲(chǔ)文字(二進(jìn)制數(shù)據(jù)實(shí)際都是存儲(chǔ)路徑)
Blob:存儲(chǔ)二進(jìn)制數(shù)據(jù)(通常不用)
枚舉字符串 enum
事先將所有可能出現(xiàn)的結(jié)果都設(shè)計(jì)好,實(shí)際上存儲(chǔ)的數(shù)據(jù)必須是規(guī)定好的數(shù)據(jù)中的一個(gè)
枚舉的使用方式
定義:enum(可能出現(xiàn)的元素); // 比如:
使用:存儲(chǔ)數(shù)據(jù)撕蔼,只能存儲(chǔ)上面的定義好的數(shù)據(jù)
create table my_enum(
gender enum('男'豁鲤, '女', '保密')
) charset utf8;
-- 插入數(shù)據(jù)
insert into my_enum values('男'), ('保密');
作用二:節(jié)省存儲(chǔ)空間(枚舉通常有一個(gè)別名:?jiǎn)芜x框)枚舉實(shí)際存儲(chǔ)的是數(shù)值而不是字符串本身
在mysql中鲸沮,系統(tǒng)也是自動(dòng)轉(zhuǎn)成數(shù)據(jù)格式琳骡,而且是基本與PHP一樣(尤其是字符串?dāng)?shù)字)
證明字段存儲(chǔ)的數(shù)據(jù)是數(shù)值:將數(shù)據(jù)取出來(lái)+0就可以判斷出原來(lái)的數(shù)據(jù)存儲(chǔ)存儲(chǔ)到底是字符串還是數(shù)值:如果是字符串最終結(jié)果永遠(yuǎn)為0,否則就是其他值讼溺,
枚舉元素實(shí)際規(guī)律:按照元素出現(xiàn)的順序楣号,重1開(kāi)始
列屬性
列屬性:真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型,約束很單一炫狱,需要一些額外的約束來(lái)更加保證數(shù)據(jù)的合法性
列屬性有很多: NULL/NOT NULL, default ,Primary key autp_increment, comment
空屬性
兩個(gè)值:NULL(默認(rèn)的)和NOT NULL(不為空)
雖然默認(rèn)的藻懒,數(shù)據(jù)庫(kù)基本都是字段為空 但是實(shí)際上在真是開(kāi)發(fā)的時(shí)候,盡可能的要保證所有的數(shù)據(jù)都不應(yīng)該為空视译;空數(shù)據(jù)沒(méi)有意義嬉荆,空數(shù)據(jù)沒(méi)法參與運(yùn)算
create table my_class(
name varchar(10) not null,
room varchar(10)
) charset utf8;
列描述
列描述:comment 描述 沒(méi)有實(shí)際含義:是專門(mén)用來(lái)描述字段,會(huì)根據(jù)表創(chuàng)建語(yǔ)句保存憎亚;用來(lái)給程序員(數(shù)據(jù)庫(kù)管理員)進(jìn)行了解的员寇。
create table my_teacher(
name varchar(20) not null comment '姓名',
money decimal(10, 2) comment '工資'
) charset utf8;
默認(rèn)值
默認(rèn)值:某一種數(shù)據(jù)會(huì)經(jīng)常性的出現(xiàn)某個(gè)具體的值,可以一開(kāi)始就制定好第美,在需要真實(shí)數(shù)據(jù)結(jié)構(gòu)蝶锋,用戶可以選擇性的使用默認(rèn)值
默認(rèn)值關(guān)鍵之:default
create table my_default(
name varchar(20) not null,
age tinyint unsigned default 0,
gender enum('男', '女', '保密') default '男'
)charset utf8;
主鍵
主鍵:primary key 一張表中只能有一個(gè)字段可以使用對(duì)應(yīng)的鍵,用來(lái)唯一的約束該字段里面的數(shù)據(jù)什往,不能重復(fù):這種稱之為主鍵
一張表中只能最多有一個(gè)主鍵
主鍵默認(rèn)不能為空
- 增加主鍵
SQL操作有多中方式可以給表增加主鍵:大體分為三種
方案1:在創(chuàng)建表的時(shí)候扳缕,直接在在字段之后,跟上primary key關(guān)鍵字
create table my_pril(
name varchar(20) not null comment '姓名',
number char(10) primary key comment '學(xué)號(hào):'
) charset utf8;
方案2:在創(chuàng)建表得時(shí)候别威,在所有的字段之后躯舔,使用primary key(主鍵字段列表)來(lái)創(chuàng)建主鍵(如果有多個(gè)字段作為主鍵,可以是復(fù)合主鍵)
create table my_pri2(
number char(10) comment '學(xué)號(hào)'省古,
course char(10) comment '課程代碼',
score tinyint unsigned default 60 comment '成績(jī)',
-- 增加主鍵限制:學(xué)號(hào)和 課程應(yīng)該是個(gè)對(duì)應(yīng)的粥庄,具有唯一性
primary key (number, course)(復(fù)合主鍵)
)charset utf8;
方案3;當(dāng)表已經(jīng)創(chuàng)建好了之后豺妓,再次額外追加主鍵惜互,可以通過(guò)修改字段屬性,也可以直接追加
Alter table 表名 add primary key(字段列表);
create table my_pri3(
course char(10) not null comment '課程編號(hào)',
name carchar(10) not null comment '課程名字'
) charset utf8;
追加主鍵
alter table my_pri3 modify course char(10) primary key comment '課程名字';
alter table my_pri3 add primary key (course);
主鍵約束
主鍵對(duì)應(yīng)的字段
- 更新主鍵&& 刪除主鍵
Alter table 表名 drop primary key;
- 主鍵的分類
實(shí)際創(chuàng)建表的過(guò)程中琳拭,我們很少使用真實(shí)的業(yè)務(wù)數(shù)據(jù)作為主鍵字段(業(yè)務(wù)主鍵);
大部分的時(shí)候是使用邏輯性的字段(字段沒(méi)有業(yè)務(wù)含義训堆,值是什么都沒(méi)有關(guān)系),將這種字段稱之為邏輯主鍵
Create table my_student(
id int primary key auto_increment ‘邏輯主鍵白嘁,自增長(zhǎng)’,
Number char(10) not null comment ‘學(xué)號(hào)’,
name carchar(10) not null
);
- 自動(dòng)增長(zhǎng)
自增長(zhǎng):當(dāng)前對(duì)應(yīng)的字段坑鱼,不給值,或者說(shuō)給默認(rèn)值絮缅,或者給NULL的時(shí)候鲁沥,會(huì)自動(dòng)的被系統(tǒng)觸發(fā),系統(tǒng)會(huì)從當(dāng)前字段中已有的最大值進(jìn)行+1操作耕魄,得到一個(gè)新的在不同字段
自增長(zhǎng)通常跟主鍵搭配
自增長(zhǎng)特點(diǎn): auto_increment
1.任何一個(gè)字段要做自增長(zhǎng)要做自增長(zhǎng)必須前提本身就是一個(gè)索引(key -欄有值)
2.自增長(zhǎng)必須是數(shù)字(增長(zhǎng))
3.一張表最多有一個(gè)主鍵
- 自增長(zhǎng)的使用
當(dāng)自增被給定的值為NULL 或者默認(rèn)值得時(shí)候黍析,會(huì)觸發(fā)自動(dòng)增長(zhǎng)
自增長(zhǎng) 如果對(duì)應(yīng)的字段輸入了值,那么自增長(zhǎng)失效:但是下一次還是能夠正確的自增長(zhǎng)(從最大值+1)
如何確定下一次是什么自增長(zhǎng)恩屎开?可以通過(guò)查看表創(chuàng)建語(yǔ)句看到阐枣;
- 修改自增長(zhǎng)
1.自增長(zhǎng)如果是涉及到字段改變马靠,必須先刪除自增長(zhǎng)后增加(一個(gè)表只能有一個(gè)自增長(zhǎng))
2.修改當(dāng)前自增長(zhǎng)已經(jīng)存在的值:修改只能比當(dāng)前已有的自增長(zhǎng)的最大值大(小不生效
)
alter table 表名 auto_increment = 值;
思考:為什么自增長(zhǎng)從1開(kāi)始蔼两?為什么每次都是自增1呢甩鳄?
所有的系統(tǒng)表現(xiàn)(如字符集,校隊(duì)集)都是有系統(tǒng)內(nèi)部的變量進(jìn)行控制的
show variables like 'auto_increment%';
- 刪除自增長(zhǎng)
自增長(zhǎng)是字段的一個(gè)屬性:可以通過(guò)modify來(lái)修改(保證字段沒(méi)有auto_crement即可)
Alter table 表名 modify 字段 類型;
唯一鍵
一張表中往往有很多字段需要具有唯一性额划,數(shù)據(jù)不能重復(fù):但是一張表中只能有一個(gè)主鍵:(unique key) 就可以解決多個(gè)字段需要唯一性約束的問(wèn)題妙啃;
唯一鍵的本質(zhì)與主鍵差不多:唯一鍵默認(rèn)的允許自動(dòng)為空,而且可以多個(gè)為空(空字段不參與唯一性比較)
- 增加唯一鍵
基本與主鍵差不多
方案1:在創(chuàng)建表的時(shí)候直接跟unique俊戳、unique key
create table my_unique1(
number char(10) unique comment ‘學(xué)號(hào)唯一揖赴,允許為空’,
name varchar(10) not null
) charset utf8;
方案2.在所有的字段之后增加unique key(字段列表)抑胎; --復(fù)合唯一鍵
方案3.在創(chuàng)建表之后增加唯一鍵
create table my_unique3(
id int primary key auto_increment,
number char(10) not null,
name varchar(20) not null
)charset utf8;
追加唯一鍵
alter table my_unique3 add unique key(number);
如果唯一鍵也不允許為空:與主鍵的作用是一致的
- 更新唯一鍵 &&刪除唯一鍵
更新唯一鍵:先刪除 后新增(唯一鍵可以有多個(gè)燥滑,可以不刪除)
alter table 表名 drop unique key; -- 錯(cuò)誤的 因?yàn)槲ㄒ绘I有多個(gè)
Alter table 表名 drop index 索引名字;
索引
幾乎所有的都是建立在字段之上
索引:系統(tǒng)根據(jù)某種算法阿逃,將已有的數(shù)據(jù)(未來(lái)可能新增的數(shù)據(jù))铭拧,單獨(dú)建立一個(gè)文件,文件能夠?qū)崿F(xiàn)快速匹配恃锉,并且能夠快速找到對(duì)應(yīng)表中的記錄搀菩;
索引的意義:
1.提升查詢數(shù)據(jù)的效率
2.約束數(shù)據(jù)的有效性(唯一性等)
增加索引的前提條件:索引本身會(huì)產(chǎn)生索引文件(有時(shí)候可能比數(shù)據(jù)文件還大),會(huì)消耗磁盤(pán)空間
如果某個(gè)字段需要`作為查詢條件`經(jīng)常使用破托,那么可以使用索引(一定想辦法增加)肪跋;
若果某個(gè)字段需要進(jìn)行數(shù)據(jù)有效的約束,也可能使用索引(主鍵土砂,唯一鍵)
MySQL中提供了多重索引
1.主鍵索引:primary key
2.唯一鍵索引: unique key
3.全文索引: fulltext index
4.普通索引: index
全文索引:針對(duì)文章內(nèi)部的關(guān)鍵字進(jìn)行索引
全文索引最大的問(wèn)題:在于如何確定關(guān)鍵字
英文和容易:英文單詞之間與打次之間有空格
中文很難: 沒(méi)有空格澎嚣, 而且中文可以各種隨意組合(分詞 sphinx)