資料庫進階一
阿新 • • 發佈:2020-08-06
一:儲存引擎
在日常生活中有很多中,並且針對不同的檔案型別會有對應不同儲存方式和處理機制(txt、pdf、word、MP4)
針對不同的資料,應該有對應的不同的處理機制來儲存
儲存引擎 就是 不同的處理機制
MySQL主要儲存引擎
Innodb
MySQL5.5版本及之後 預設的儲存引擎
支援事務 行鎖 外來鍵
Myisan
MySQL5.5版本之前 預設的儲存引擎
速度要比Innodb更快,但是我們更注重的是 資料的安全
memory
記憶體引擎(資料全部存放在 記憶體中)斷電資料就丟失
blackhole
無論存什麼,都立刻消失(黑洞)
命令
# 檢視所有的儲存引擎 show engines; # 不同的儲存引擎 在儲存表的時候 異同點: create table t1(id int) engine=innodb; create table t2(id int) engine=myisam; create table t3(id int) engine=blackhole; create table t4(id int) engine=memory; # 檔案分析(在mysql的data的資料庫裡) t1.frm 表結構 innodb t1.ibd 表資料 innodb t2.frm 表結構 myisam t2.MYD 表資料 myisam t2.MYI 索引(index,類似於 書的目錄,基於目錄查詢對應的資料 速度更快) myisam t3.frm 表結構 blackhole t4.frm 表結構 memory 資料存在記憶體 # 存資料 insert into t1 values(1); insert into t2 values(2); insert into t3 values(3); insert into t4 values(4); # 檢視資料 select * from t1; 有資料 select * from t2; 有資料 select * from t3; 沒資料 select * from t4; 有資料,但是重啟服務或者斷電後 會消失
建立表的完整語法
# 語法 create table 表名( 欄位名1 型別(寬度) 約束條件1, 欄位名2 型別(寬度) 約束條件2, 欄位名3 型別(寬度) 約束條件3 ) # 注意 1.在同一張表中 欄位名不能重複 2.寬度 和 約束條件 是可選的(可寫可不寫)而欄位名 和 欄位型別 是必須的 3.約束條件寫的話 也支援寫多個: 欄位名 型別(寬度) 約束條件1 約束條件2 ......, create table t1(id); # 報錯 create table t1(id int); 4.最後一行 不能有逗號,不然會報錯 create table t1( id int, name char(8), ); # 報錯
補充
# 寬度 一般情況下,是對儲存資料的限制 create table t7(name char); # 預設寬度是1,1個字元 inert into t1 values('jason'); inert into t1 values(null); # 關鍵字null 允許為空 針對不同的版本 會出現不同的效果: 5.6版本預設沒有開啟嚴格模式 規定只能存一個字元 如果你給了多個字元 那麼我會自動幫你擷取 5.7或以上版本開啟了嚴格模式 規定存幾個字元 如果超過了就會報錯 Data too long for... # 嚴格模式到底開不開呢? MySQL5.7之後的版本預設都是開啟嚴格模式的 # 使用資料庫的準則: 能儘量少的讓資料庫幹活 就儘量少 不要給資料庫增加額外的壓力 # 約束條件:null not null create table t8(id int, name char not null); insert into t8 values(1, 'jsaon'); insert into t8 values(2, null); # 會報錯 insert into t8 values(3); # 也會報錯 # 寬度 和 約束條件到底是什麼關係? 寬度 是用來限制資料的儲存 約束條件 是在寬度的基礎之上 增加額外的約束
二:基本資料型別
1.整型
整型
型別 大小 範圍(有符號) 範圍(無符號)
tinyint 1bytes (-128,127) (0,255)
smallint 2bytes 2**(2*8-1) 2**16
mediunint 3bytes
int或integer 4bytes
bigint 8bytes
#以tinyint為例#
是否有符號
預設情況下是帶符號的
超出如何
超出限制只存最大可接受值
create table t9(id tinyint);
inser into t9 values(-129),(256);
#約束條件之 unsigned無符號
create table t10(id tinyint unsigned);
#int為例#
create table t11(id int); #int預設也是帶符號的
整型預設情況下都是帶符號的
#針對整型括號內的寬度到底是幹嘛的?
create table t12(id int(8));
insert into t12 values(123456789);
#特例:只有整型括號裡面的數字不是表示限制位數而是顯示長度
id int(8)
如果數字沒有超出8位,那麼預設用空格填充
如果數字超出8位,那麼有幾位存幾位(但是還是要遵循欄位型別最大範圍)
#約束條件之 zerofill 0填充
create table t13(id int(8) unsigned zerofill);
insert into t13 values(1);
select * from t13; # 00000001 用0填充至8位
#總結:針對整型欄位,括號內無需指定寬度,因為它預設的寬度足夠顯示所有的資料了
嚴格模式
# 如何檢視嚴格模式
show variables like "%mode";
# 模糊匹配/查詢
關鍵字 like
% :匹配任意多個字元
_ :匹配任意單個字元
# 修改嚴格模式
set session 只在當前視窗有效
set global 全域性有效
set global sql_mode = "STRICT_TRANS_TABLES";
修改完之後,退出 重新進入即可
use day45;
create table t14(name char);
desc t14;
insert into t14 values('jason'); # 報錯 超出範圍了
2.浮點型
浮點型分類:
float
double
decimal
作用:身高、體重、薪資
只要是浮點型,括號後面包含兩位數
第一個表示總位數
第二個表示小數位數
儲存限制
float(255,30) #總共255位,小數部分佔30位
double(255,30) #總共255位,小數部分佔30位
decimal(65,30) #總共65位,小數部分佔30位
精度驗證
create table t15(id float(255,30));
create table t16(id float(255,30));
create table t17(id float(65,30));
insert into t15 values(1.11111111111111111111111111111111);
insert into t16 values(1.11111111111111111111111111111111);
insert into t17 values(1.11111111111111111111111111111111);
float <double <decimal
#要結合實際應用場景,三者都能使用,另外實際生產的中,看似用整型和浮點型儲存的資料可能都是使用字串型別
3.字元型別
char:
定長
char(4) 資料超過4個 直接報錯 不夠4個 空格來湊
varchar
定長
varvhar(4)資料超過4個直接報錯 不夠有幾個就存幾個
create table t18(name char(4));
create table t19(name varchar(4));
insert into t18 values('a');
insert into t19values('a');
# 介紹一個小方法 char_length統計欄位長度
select char_length(name) from t18;
select char_length(name) from t19;
"""
首先可以肯定的是 char硬碟上存的絕對是真正的資料 帶有空格的
但是在顯示的時候MySQL會自動將多餘的空格剔除
"""
# 再次修改sql_mode 讓MySQL不要做自動剔除操作
set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
char與varchar對比:
char
缺點:浪費空間
優點:存取都很簡單
直接按照固定的字元存取資料即可,存按照幾個字元,取也直接按照幾個取
varchar
優點:節省空間
缺點:存取較為麻煩
存的時候需要製作報頭,取的時候要先讀取報頭後才能取到真實資料
1bytes+annie 1bytes+yasuo ...
以前基本都是用char,現在用varchar也很多,無所謂,推薦varchar
其實在實際生產中,很多看似需要用整型 或者 浮點型儲存的資料
內部可能都是用的字元型別儲存
4.日期型別
分類:
date::年月日 2020-05-04
datetime:年月日時分秒2020-05-04 12:01:03
time:時分秒 12:01:03
Year:年份 2020
create table student(
id int,
name varchar(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'jason','1988','1988-11-11','11:11:11','2020-11-11 11:11:11'); # 日期要1970年之後
5.列舉與集合型別
分類:
列舉(enmu --> enumerate):多選一 # 選擇性別
集合(set):多選多 # 選擇愛好
create table user(
id int,
name char(16),
gender enum('male','female','male')
);
insert into user values(1,'jason','male'); # 正常
insert into user values(2,'egon','xxoo'); # 報錯
# 列舉欄位 後期再存資料的時候 只能從列舉裡面選擇一個儲存
create table teacher(
id int,
name char(16),
gender enum('male','female','other'),
hobby set('read','DBJ','hecha')
);
insert into teacher values(1,'jason','male','read'); # 正常
insert into teacher values(2,'egon','female','DBJ,hecha'); # 正常
insert into teacher values(3,'tank','male','sport'); # 報錯
# 集合可以只寫一個 但是不能寫沒有列舉的
三:總結
# 欄位型別
# 嚴格模式
# 約束條件
not null
zerofill
unsigned
# 基本資料型別
整型
浮點型
字元型別
日期型別
列舉與集合型別