存儲引擎:
不同的數據應該有不同的處理機制
mysql存儲引擎:
Innodb:現在版本默認的存儲引擎
myisam:mysql老版本的存儲引擎
memory:內存引擎(數據全部存在內存中)也叫臨時的存儲引擎
blackhole:無論存什么,都會立馬消失(被稱為黑洞引擎)寫進去就會消失
每個存儲引擎的特點:
Innodb:支持事務,支持行鎖(當一個人在操作這一條數據的時候別人不能操作)。
使用Innodb建表的時候,它會幫你建兩個文件,第一個文件存的是這個表的結構,第二
個文件存的是你的真實的數據,兩者是分開的。
myisam:使用myisam建表的時候,它會幫你建三個文件,第一個文件存的是表結構,第二個存的是真實數據,
第三個文件存的是索引,索引就類似你輸得目錄,目錄能幫你更快速的找到你想要的數據。
memory:使用memory建表的時候,它只會幫你建一個文件夾,這個文件夾是幫你存表結構的,因為memory
存數據是存在內存中的所以不需要建文件來存數據,所以它只有一個表結構。
blackhole:使用blackhole建表的時候,它也只會幫你建一個文件夾,因為blackhole的特點是無論存什么都會消失,
所以blackhole也不需要存數據的文件夾。
當往這些引擎中添入新數據的時候會發現只有使用blackhole所建的表是沒有數據的,因為它是黑洞引擎存什么消失什么,
而使用memory引擎間建的表里面雖然能添加新的數據,但是當你重啟數據庫的時候會發現剛才存的數據消失了,因為memory
存的數據是存在內存當中的,當你應用重啟或者關閉的時候它的數據就會消失。
查看所有的存儲引擎:
show engines;
創建表的完整語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);
1.字段名和字段類型都是必須的,中括號內的參數都是可選參數,也就是說可寫可不寫不影響創建
表。如果不寫字段名和字段類型會報語法錯誤。
2.同一張表中,字段名不能重復,最后一個字段內不能加逗號,否則會報錯。
char如果不寫寬度,默認是1,char的寬度表示的是對存儲數據的限制,數字是幾只能存幾個字符
如果超出了你設置的字符長度,mysql會幫你自動截取。所以使用數據庫的准則是:能盡量讓他少干活就讓他少干活,
采取嚴格模式。數據庫字段允許插空,在數據庫里null表示為空,但是如果你不想讓它為空,可以使用sql語句限制它不能為空,
語句為:alter table 表名 modify name char not null
當你輸入這個語句時之前插入的空值會直接被清除掉
類型和約束條件都是限制數據的,那他們有什么區別呢?
類型約束的是數據的存儲類型
而約束是基於類型之上的額外限制。
字段類型:
整形:SMALLINT(小整形) TINYINT(小型) INT(整型) BIGINT(大整型)
TINYINT :
默認是否有符號 :默認是帶有符號的
超出限制會如何 :超出之后只會存最大值或者最小值
INT:
默認是有符號的,超出后只會存最大值或者最小值
要想讓他沒有符號呢 可以用sql語句限制它,語句為:unsigned 作用就是無正負符號
char后面的數字是用來限制存儲數據的長度的。
特例:只有整型后面的數字不是用來限制存儲數據的長度,而是用來展示數據的位數
int[填入的數字] 就是你填入的數字是幾位存幾位或者超出你填入的數字也會全部存完,不夠八位默
認空格填充
使用sql語句修改約束條件 不夠位數的情況下用0填充,語句為:zerofill 但是有限制最大是429496725,但是超了也沒關系
對於整型來說:
數據類型后的寬度並不是存儲限制,而是顯示限制,所以在創建表時,
如果字段采用的是整型類型,完全無需指定顯示寬度, 默認的顯示寬度,足夠顯示完整當初存放的數據,
只要是整型 都不需要指定寬度 因為有默認的寬度 足夠顯示對應的數據
區別:
嚴格模式:
在我們插入多余數據的時候,數據庫會自動幫我們截掉。 但是我們應該遵循盡量讓數據庫少干活的原則,針對這種情況,
數據庫應該報錯,但是它沒報錯,因為5.6版本沒有遵循嚴格模式,如果是5.7或者5.7以上都是嚴格模式。我們可以使用sql語句設置嚴格模式。
模糊匹配:
like 關鍵字
%匹配任意多個字符
_匹配任意一個字符
查看嚴格模式:
show variables %mode% (百分號內放要匹配的字符)
設置嚴格模式語句:
set session 臨時有效:只在當前操作的窗口有效,一旦你退出登陸了再登進來就沒用了
set global 全局有效 終身有效
set global sql_mode = 'STRICT_TRANS_TABLES'
設置完之后重新進入客戶端即可
這樣設置完成之后就能減輕MySQL的壓力了,超出的數據直接就給報錯。
浮點型:
FLOAT(255,30)總共255位,小數部分占30位
DOUBLE(255,30)總共255位,小數部分占30位
DECIMAL(65,30)總共65位,小數部分占30位
驗證他們三個不一樣的時候可以創三張表並插入相同的數據來對比一下來對比一下:
創建表:
給三張表中插入相同的數據並查看:
對比發現,他們三個小數位都是一樣的,但是精確度不一樣:FLOAT < DOUBLE < DECIMAL
字符類型:
char(定長) 只能存固定字符,超出了會直接報錯。如果少了會自動用空格填充
varchar (變成) 只能存固定字符,超出了會直接報錯。如果少了 有幾個存幾個
mysql在存儲char類型字段的時候,硬盤上確確實實存的是固定長度的數據,但是在取出來的
一瞬間,mysql會自動將填充的空格去除。看着給我們的感覺跟varchar是一樣的,就是你存入幾個
數據長度查看的就是幾個數據長度,但是它內部有一個處理機制,會自動去除空格。
查看插入的字符長度sql語句為:
select char_length(你要查的字段名,比如name) from 表名;
通過嚴格模式來修改不自動去除空格的機制:
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
然后先quit退出,再進來查看有沒有修改成功,圖片右下角顯示已經修改成功。
寫修改嚴格模式的時候,兩個一定要都寫,因為這是一個替換的過程,不是新增一個模式。
char 與 varchar的區別
char 定長
存浪費空間
存取速度快
取的時候方便,直接按固定長度取值即可,
varchar 變長
存節省空間
存取速度慢:存的時候需要給數據加一個記錄長度的報頭,
取的時候需要先讀取報頭才能讀取真實數據。
取的時候比較繁瑣,因為無法知道數據有多長。
日期類型:
date 年月日
datetime 年月日時分秒
year 存年份
time 時分秒
創建表,插入數據並查看表:
枚舉與集合類型:
枚舉:
關鍵字 :enum
多選一(限制某個字段能夠存儲的數據內容)
集合:多選多或者多選一
約束條件:
not null 不能為空
default 給某個字段設置默認值,當用戶寫了的時候用用戶寫的,用戶沒寫就用默認值
sql語句:create table t17(id int,name char(16) default '插入的數據');
往表中插入數據的時候 可以指定字段進行插入 不需要全部都插
insert into t17(name,id) values('jack',2);
單例唯一:限制某一個字段是唯一的 sql語句為:unique
聯合唯一(在語句的最后 用括號的形式 表示哪幾個字段組合的結果是唯一的)
primary key 主鍵
限制效果跟 not null + unique 組合效果一致 非空且唯一
create table 表名(id int primary key);
primary key也是innodb引擎查詢必備的索引,索引你就把當成書的目錄。
innodb引擎在創建表的時候 必須要有一個主鍵,當你沒有指定主鍵的時候:
1.會將非空切唯一的字段自動升級成主鍵
2.當你的表中沒有任何的約束條件 innodb會采用自己的內部默認的一個主鍵字段
該主鍵字段你在查詢時候是無法使用的,查詢數據的速度就會很慢,類似於一頁一頁的翻書。
主鍵字段到底設置給誰呢?
通常每張表里面都應該有一個id字段,並且應該將id設置為表的主鍵字段
通常每張表里面都應該有能標識數據編號的這么一個字段,默認情況下都是將標識數據編號的這么一個字段設置為主鍵。
聯合主鍵:多個字段聯合起來作為表的一個主鍵,本質還是一個主鍵!
innodb引擎中一張表有且只有一個主鍵
主鍵字段應該具備自動遞增的特點
每次添加數據 不需要用戶手動輸入
auto_increment 自動遞增
delete from 僅僅是刪除數據 不會重置主鍵
truncate 初始化表 會重置主鍵