一:數據庫基礎
【1】存儲引擎:不同的數據類型對應不同的處理機制
(1)innodb:默認存儲引擎 相比於myisam來說 讀取速度較慢
(2)myisam:5.1之前用的版本 對數據的操控安全性不如innodb
(3)memory:臨時存儲引擎 數據存入內存 斷電數據消失
(4)blackhole:黑洞引擎 無論存放什么數據 都會立馬消失
# 查看存儲引擎 show engines; create table t1(id int)engine=innodb; create table t2(id int)engine=myisam; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole; insert into t1 values(1); insert into t2 values(2); insert into t3 values(3); insert into t4 values(4);
圖解一:
Innodb:支持事務 行鎖 外鍵 在安全性上比myisam更加高
圖解二:
t1:
(1)frm:表結構
(2)ibd:真實存放的數據
t2:
frm:表結構
MYD:真實存放的數據
MYI:索引
PS:因為其有索引 所以查找數據速度比較快
t3/t4:
(1)frm:表結構
【1】創建表的完整語法結構
(1)語法 create table 表名(字段名 類型(寬度 約束條件),字段名 類型(寬度 約束條件));
PS:
(1)字段名 和類型必須要寫
(2)寬度值和約束條件可寫可不寫
(3)字段名之間不能重復
(4)字段名最后一個千萬不能加上逗號
例如:
create table userinfo(id int,name char);
(2)約束條件
寬度:
(1)作用:限制數據的存儲位數
PS:
(1)當數據超出存儲位數 會按照從左到右截斷數據
(2)如果在嚴格模式下 超出數據位數會直接報錯
例如:
insert into userinfo(name) values('SR'); # 插入數據 select name from userinfo; # S
PS:上述插入char寬度默認為1位 所以只能插入一個S
(1)對於整型來說寬度不是用來限制存儲的個數 而是用來限制展示出來的個數
(2)如果超過寬度則直接顯示出來 如果小於寬度則以0補齊寬度
(3)只要是整型 都不需要指定寬度 因為有默認的寬度(默認寬度為11位 而int最大數據長度為10位) 足夠顯示對應的數據
(2)條件約束:
not null不能為空
create table userinfo(name char(16)); alter table userinfo modify name char not null insert into userinfo values(null); # 報錯
PS:
(1)字段類型約束的是數據從存儲類型
(2)約束條件是在對字段類型之上在進行約束
二:字段類型
(1)整形:TINYINT,SMALLINT, MEDIUMINT ,INT
TINYINT:
符號:默認有符號的
超出范圍:會自動將值換成最先值或者最大值
例如:
create table t1(id TINYINT); insert into t1 values(-129),(128); # (-128),(127)
PS:如果有符號范圍為(-128,127)
int
符號:默認有符號的
超出范圍:會自動將值換成最先值或者最大值
例如:
create table t2(id int); insert into t2 values(-2222222222222222222),(222222222222222222222); # (-2147483648,2147483647)
PS:SMALLINT, MEDIUMINT 與上述情況一樣
unsigned :
作用:將上述整形由默認帶符號變成無符號
符號:無符號
范圍:如果超出范圍最小值為0 最大值為255
例如:
create table t4(id TINYINT unsigned); insert into t4 values(-129),(256); # (0,255)
(2)浮點型:
(1)float(255,30) 總共255位 小數部分占30位
(2)double(255,30) 總共255位 小數部分占30位
(3)decimal(65,30) 總共65位 小數部分占30位
例如:
create table t9(x float(255,30)); create table t10(x double(255,30)); create table t11(x decimal(65,30)); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); insert into t11 values(1.111111111111111111111111111111);
PS:精准度 float < double < decimal
(3)字符類型(char):
char:后面的數字是限制存儲的數據長度的
例如:
create table t5(name char); insert into t5 values('SR'); # S
PS:上述存放5位數據 但是由於char默認只能存一位 所以最終在數據庫中存入S
嚴格模式:
產生背景:
(1)對於上述例子中 雖然位數不夠 其會幫我們截斷進行存入數據庫
(2)但是截斷需要消耗數據庫的操作 增大數據的壓力
(3)而且截斷的存入的數據 本身也不是我們所需要的數據
作用:
(1)可以通過設置嚴格模式 如果不符合我設置的規則 則會報錯
# 查看嚴格模式
show variable like '%mode%' # 模糊匹配 like % 匹配任意多個字符 _ 匹配一個字符 set session 臨時有效 只在你當前操作的窗口有效 set global 全局有效 終生有效 # 修改模式為嚴格模式 set global sql_mode = 'STRICT_TRANS_TABLES';
PS:上述模式修改之后 一定要重新打開窗口
create table t6(name char);
insert into t6 values('SR'); # 報錯
char(寬度):寬度限制存放位數 如果超過則直接報錯 如果不夠自動用空格填充
varchar(寬度):寬度限制存放位數 如果超過則直接報錯 有幾個存幾個
create table t8(name char(10)); insert into t8 values('mysql'); create table t9(name varchar(10)); insert into t9 values('mysql'); # 查看某字段的長度 select char_length(name) from t8 select char_length(name) from t9
PS:
(1)在查看上述數據的時候 在取出來的時候sql會自動將空格給去除
(2)通過嚴格機制 修改不讓取出來的時候 空格被去除
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
PS:一定在以前修改的尾部追加 如果不追加則會將原來的覆蓋
char:
(1)浪費存儲空間 因為不夠加上空格符
(2)存取速度快
varchar:
(1)節省內存空間
(2)存儲速度慢
(1)存儲時候:添加一個固定包頭
(2)讀取時候:讀取固定長度包頭 由包頭告訴真實數據
(4)時間類型:
date:年月日
datetime:年月日時分秒
time:時分秒
year:年
例如:
create table student( id int, name char(16), born_year year, birth date, study_time time, reg_time datetime ); insert into student values(1,'SR','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');
(5)枚舉:
作用:限制某個字段存放的數據
PS:多選一
例如:
create table user( id int, name char(16), gender enum('male','female','others') ); insert into user values(1,'jason','xxx') # 報錯 insert into user values(2,'egon','female') # 正確!
集合:
作用:限制某個字段存放的數據
PS:多選多
例如:
create table teacher( id int, name char(16), gender enum('male','female','others'), hobby set('read','sleep','sanna','dbj') ); insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一個
(6)約束條件:
not null + default
例如:
create table user( id int, name char(16) ); insert into user values(1,null) # 可以修改 alter table user modify name char(16) not null; insert into user(name,id) values(null,2); # 報錯 插入數據可以在表名后面指定插入數據對應的字段 create table student( id int, name char(16) not null, gender enum('male','female','others') default 'male' ) insert into student(id,name) values(1,'jason') # 成功
(7)unique:
作用:限制某個字段是唯一的 不能重復
(1)單列唯一:
例如:
# 單列唯一 create table user1( id int unique, name char(16) ); insert into user1 values(1,'jason'),(1,'egon') # 報錯 insert into user1 values(1,'jason'),(2,'egon') # 成功
# 聯合唯一 create table server( id int, ip char(16), port int, unique(ip,port) ) insert into server values(1,'127.0.0.1',8080); insert into server values(2,'127.0.0.1',8080); # 報錯 insert into server values(1,'127.0.0.1',8081);
PS:聯合唯一 一定要在字段的末尾
(8)primary key:
作用:
(1)從約束條件看 其等於 not all + unique
例如:
create table t11(id int primary key);insert into t11 values(1),(1); # 報錯 insert into t11 values(1),(2);
(2)其還是innodb搜索的索引
PS:
(1)innodb在創建表的時候 必須要有一個主鍵
(2)當沒有創建主鍵的時候 其會按照代碼從上到下搜索將非空且唯一的字段設置成unique
(3)當上述條件都不滿足 innodb會采用自己內部的一個主鍵字段充當主鍵 (該主鍵在查詢的時候無法使用 導致innodb無法通過索引取值)
create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb;
(7)auto_increment:
作用:主鍵編號自動遞增
例如:
create table t13( id int primary key auto_increment, name char(16) ); insert into t13('jason'),('jason'),('jason');
PS:我們一般設置ID為我們的主鍵 因為ID一般用來標識一個數據的編號
delete from tb1;
作用:其可以將表中的某些數據刪除 但是不會將主鍵的ID給重置為0
truncate:
作用:其會清空所有的數據 主鍵ID也會被重置為0