mysql 高階 mysql高階知識

2021-10-25 14:33:06 字數 4814 閱讀 3361

一.儲存引擎

引擎 指的是乙個系統的核心部分

引擎有不同分類是為了適應不同的使用場景

檢視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...