一.儲存引擎
引擎 指的是乙個系統的核心部分
引擎有不同分類是為了適應不同的使用場景
檢視mysql支援所有引擎
show engines;
mrg_myisam 是一堆myisam表的集合
用於做水平分表,如果乙個表中資料量太大 將導致效率降低
水平分表就是把整個大表拆成不同的小表,每一次查詢 會判斷資料在哪乙個表中 然後對應去查詢 以此來提高效率
name age ***
jerry 40 woman
name age ***
bgon 30 man
垂直分表
name age *** phone addr gf bf idcard number
jerry 40 woman 110 上海 xx xx 身份證 學號
當乙個表中 欄位太多 然而常用的資訊就那麼一兩個 那就可以把不常用字段 切到另乙個表中 然後建立關聯關係
innodb 是最最常用的引擎 因為支援 事務 行鎖 外來鍵一系列功能....
myisam 沒有上述一堆功能 但是 儲存效率比innodb要高 並且支援分表
memory 速度快 不能永久儲存 沒有特別的功能
二.詳細建表語句
表示可選
create table 名稱(字段 型別[(寬度) 約束條件],字段 型別,......)
三.mysql資料型別
為什麼要給資料分類?
1.不同的資料型別 描述資訊可以更加方便準確
2.在計算機中對資料分類可以減少記憶體開銷
1.數字
整型 預設都是有符號的
tinyint 1個位元組 8個二進位制 0-255 -128 - 127
smallint 2個字
mediumint 3個位元組
int 4個位元組
bigint 8個位元組
設定為無符號 需要在型別後新增unsigned
create table t8(a tinyint unsigned);
寬度在整型資料中 不是用來設定可儲存的資料範圍的
用於控制最先小顯示長度(字元數) 如果長度不足 就幫你補0 但是需要指定zerofill
create table t12(a tinyint(5) zerofill);
結論是: 使用整型資料 寬度這個屬性一般不用管它
浮點float 4個位元組
float(a,b)
double 8個位元組
double(a,b)
decimal 不固定
decimal(a,b)
a代表總位數 b表示小數字數
5,3 最大值99.999
共同點: 小數字最大為30
float與double總長最大為255
都是不精確的 double比float精確點
不同點:
decimal總長最大為65 並且是精確的
2.字串
char固定長度 和 varchar 可變長度
char(l) varchar(l)
l 都是表示最大可儲存的長度 不是位元組
a char(4) b varchar(4)
a:s 最終還是佔4個字元長度
b:s 最終佔1個字元長度 + 標識資訊的長度(1-2位元組)
s s s
如果有三個資料要存 每個資料都是乙個s字元 最終3 * 4 12個字元長度
占用空間較多 訪問速度較快
1s1s1s varchar 儲存時必須儲存乙個長度標識資訊 所以所佔空間為實際內容長度+標識首席資訊官度
相比較char 空間節省了 但是效率降低了
char採取的空間換時間 提高效率
字串型別的bug 由於char型別是定長 mysql會在末尾填充空格來達到定長的效果
所以char型別 不能儲存末尾帶有空格的資料 會直接把空格給去了
固定長度的字串型別 不常用
tinytext 1字元
text 2字元
mediumtext 3字元
longtext 4字元
3.二進位制資料型別 單位都是位元組
binary varbinary
binary是固定長度的二進位制
varbinary 可變長度的二進位制
長度固定無法修改的二進位制
tinyblob
blob
mediumblob
longblob
強調:需要將其放到ftp檔案伺服器上 然後資料庫中只儲存連線即可
4.時間型別
year 4為年份
date 日期 yyyy-mm-dd
time 時間 hh:mm:ss
datetime yyyy-mm-dd hh:mm:ss
timestamp 時間戳 乙個浮點型別 從unix元年到現在的秒數
year 可以是數字 也可以是字串
可以用四位字串 也可以2位字元 或數字
00-69 == 2001-2069
70-99 == 1970 - 1999
甭管什麼時間型別 照著標準格式字串寫 就行
timestamp 會自動更新時間 當你插入時 或修改時
current_time 和 now() 所有的時間 日期型別 都可以使用這兩個方法來輸入當前時間
所有的日期時間 資料庫返回的都是字串型別
嚴格模式
5.7以下的版本 預設是非嚴格模式的 例如你的型別為tinyint 儲存的是128 最終儲存的是127
set global sql_mode = "strict_trans_tables" 可以將其設定為嚴格模式
最好寫到配置檔案中 永久有效
enum 提前規定該字段能選的值的範圍 多選1
set 提前規定該字段能選的值的範圍 區別是 set欄位 可以有多個值 用逗號隔開 多選多
資料庫正規化
就是指導你該如何設計資料庫
資料型別 整型 int 浮點 float-double decimal 字串 char varchar 時間-日期 列舉-集合 二進位制
在保證資料足夠儲存情況下 選用占用空間最小的型別
四.約束
完整的建表語句
create table 名稱(字段 型別[(寬度) 約束條件],字段 型別,......)
約束 是指 給資料的值加上一些限制
型別就是一種限制 寬度對於整型資料 沒有儲存限制 其他型別的寬度是有限制作用的
約束就是除了 資料型別以及寬度之外的其他限制
unsigned就是約束中第一種 表示你的整數 不能包含符號 僅針對數字型別
約束 是為了保證資料的完整性
完整性約束
not null 非空
限制該欄位 必須有值
例如賬號密碼
default 預設值
例如 多數使用者都是男的 遊戲賬號的金幣可以預設
1.建表直接指定
create table t(name char(10) not null default 預設值);
2.後期增加約束
alter table t modify name char(10) not null default 已有的字段
alter table t add *** char(10) not null default 新增字段
unique 唯一性約束 並且是乙個索引
要求該字段的值 不能重複
單字段:
create table olbperson(name char(20) unique,school char(10));
多欄位聯合唯一約束
create table olbperson(name char(20),school char(10), unique(name,school));
例如:姓名和校區兩個字段 如果兩個校區有相同的姓名 這時候就可以把這兩個字段作為聯合唯一索引
這些欄位都相同才算是重複
primary key 主鍵約束
從約束角度來看 和 非空 + 唯一 是相同的效果
不能為空且不能重複
需要強調的是:
主鍵除了有約束的效果 還是乙個索引 並且是非常重要的索引
在該innodb 主鍵是必不可少的
innodb 組織資料結構是按照樹形結構來組織的,該結構中 必須有乙個資料 不能為空且唯一的
如果沒有這樣的資料 樹形結構也就不存在.
mysql在建立表的時候 會檢測 是否存在主鍵
如果沒有 它就找乙個具有非空且唯一約束的字段提公升為主鍵
如果也沒有這樣的字段 mysql就建立乙個隱藏字段作為主鍵
索引 可以提高查詢速度
結論是: 只要你是用innodb引擎 你就應該建表時設定乙個主鍵 通常主鍵字段叫做id
id 有唯一標識的意思
索引 就像是 字典裡目錄 用於快速定位資料所在位置
自動增長
主鍵在使用中 需要我們自己來維護 其正確性 你需要知道上一次寫的是什麼 然後找乙個之前沒用過的主鍵
mysql 提高了自動增長約束 可以幫你自動管理主鍵的值
要求必須是整型,每次插入資料都會自動+1 程式中就不要再自己管理主鍵了
語法:create table table_name(id int primary key auto_increment,name char(10));
# 插入帶有自動增長的字段時 可以直接忽略該欄位 也可以插入乙個null
insert into table_name values(null,"jack");
insert into table_name(name) values("jack");
只要你建立乙個表 就應該有主鍵 並且自動增長.
foreign key 外來鍵約束
MySQL高階高階
1 mysql的開窗函式 row number 從 1 開始,按照順序生成組內的記錄編號 rank 從 1 開始,按照順序,相同會重複,名次會留下空的位置,生成組內的記錄編號 dense rank 從 1 開始,按照順序生成組內的記錄編號,相同會重複,名次不會留下空的位置 開窗函式區別如下圖所示 f...
mysql高階3 MYSQL高階
檢視 create view v employee asselect a.empid,a.empname,a.gender,b.deptname from employee a left join dept b on a.deptid b.deptid select from v employee ...
MySQL必知必會 13MySQL高階聯結
使用表別名 select cust name cust contact from customers as c orders as o orderitems as oi where c cust id o cust id and oi order num o order num and prod i...