1. 程式人生 > 實用技巧 >資料庫進階一

資料庫進階一

一:儲存引擎

在日常生活中有很多中,並且針對不同的檔案型別會有對應不同儲存方式和處理機制(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

# 基本資料型別
	整型
	浮點型
	字元型別
	日期型別
	列舉與集合型別