本質:就是根據sql語句獲取的動態數據集合,也就是一張虛擬表python
注意:視圖通常只用來查詢數據,不做修改,由於涉及多張表的數據mysql
基本語法:sql
建立:create view 視圖名字 as sql語句 修改:alter view 視圖名稱 as sql語句 刪除:drop view 視圖名字
本質:定製用戶對錶進行增刪改操做時先後的行爲數據庫
注意:觸發器要在開頭修改結束符號,結束後再修改回來安全
基本語法:併發
#建立觸發器 delimiter $$ #修改mysql的結束符,只做用於當前窗口。create trigger 觸發器名字 before/after insert/update/delete on 表名 for each rowbegin sql語句end $$ delimiter ; #將mysql的結束符修改回默認的 #刪除觸發器drop trigger 觸發器名字
做用:保證數據操做的安全性ide
四大特性(ACID):函數
原子性(A):事務裏包含的全部操做要麼一塊兒成功,要麼一塊兒失敗oop
一致性(C):事務必須是使數據庫從一個一致性的狀態變到另一個一致性 的狀態,該特性跟原子性密切相關。fetch
隔離性(I): 併發事務內部操做是隔離的,不會互相干擾的。
持久性(D): 事務一旦執行成,對數據庫中的修改是永久的。
三大關鍵字:
一、開始事務:start transaction
二、回滾(回到事務執行以前的狀態): rollback
三、肯定(肯定後就沒法回滾):commit
#例子:(持卡人去銀行取1000,原來存款(cunkuan=3000),現金(xianjin=0) start transactionupdate user set xianjin=1000 where name="持卡人";update user set cunkuan=2000 where name="持卡人儲戶"; #rollbak 若事務執行異常就能夠添加回滾。 commit
本質:相似於咱們自定義的函數,將一系列可執行的sql語句封裝在存儲過程內部。
基本語法:
#建立存儲過程,能夠接收三類參數: #in 僅用於傳入參數使用 #out 僅用於返回值使用 #inout 既能夠用於傳入又能夠看成返回值。 delimiter //create procedure 存儲過程的名字 (in 形參名 形參類型, out 形參名 形參類型, inout 形參名 形參類型, )beginsql代碼end //delimiter ; #調用存儲過程 call 存儲過程的名字(); #在python中基於pymysql模塊調用 cusor.callproc('存儲過程名字')
實例代碼:
delimiter //create procedure p1(in n1 int, out res int)begin select * from user where id>n1;set res=1; #res用來判斷存儲過程是否執行end //delimiter ; #在mysql 中調用set @res=0; #定義一個變量res用來接收res的值 call p1(2,@res);select @res; #查看#res的值,若@res=1,則存儲過程執行了,=0,則沒有執行 #在python中基於pymysql模塊調用cursor.callproc('p1',(2,0)) #0至關於set @res=0#@_p1_0,@_p1_1,表示第一個參數,第二個參數,依此類推。。。。cursor.execute('select @_p1_1');print(cursor.fetchall())
一、條件語句:
#基本語法: delimiter // create procedure proc_if() begin declare i int default 0; if i=1 then select 1; elseif i=2 then select 2; else select 7; end if; end // delimiter;
二、循環語句:
delimiter //create procedure proc_while()begin declare num int; set num =0; whiele num <10 do select num; set num= num+1; end while;end //delimiter ;
#repeat循環 delimiter //create procedure proc_repeat()begin declare i int; set i=0; repeat select i; set i=i+1; until i>=5; end repeat;end //delimiter ;
#loop循環 delimiter //create procedure proc_loop()begin declare i int default 0; loop_label: loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label;end //delimiter ;
本質:經過不斷地縮小想要獲取數據的範圍來篩選出最終想要的結果。
索引結構(b+樹)
注意:
(1)最下面一行是葉子結點,只有葉子結點存放的是真實數據,其餘結點存放的是虛擬數據。
b+樹查找過程:
磁盤塊1,紅色表示數據項,黃色表示指針,數據項17,35,表示小於17的去P1找,大於35的去P3找,剩下的去P2找。依次類推,往下尋找,直到葉子結點。
b+ 樹的性質:
(1)索引字段要儘可能小:由於數據頁大小是固定的,索引字段越小,佔用空間越小,數據項存放的數據就會越多,樹的高度就越低
(2)索引的最左匹配特性:好比查一個數據(姓名,性別,年齡),會先通姓名來肯定搜索方向,若出現兩個名字相同的,則會再根據性別來肯定搜索方向,若性別相同,則會繼續根據年齡來肯定方向。若出現沒有姓名的數據項(性別,年齡)則會不知往那個方向查。由於一開始是以姓名爲比較因子的。
PS: 平常數據建表之因此建議將id字段做爲主鍵(索引),是由於id佔用空間少,這樣一個磁盤塊存儲的數據就會多,進而能夠下降樹的高度,從而減小查詢次數
一、彙集索引(primary key)
定義:就是按照每張表的主鍵構造一顆B+樹,同時,葉子結點存放的即爲整張表的行記錄數據,也將彙集索引的葉子節點稱爲數據頁。
好處:對主鍵的範圍查找和排序查找的速度很是快,葉子結點的數據就是 用戶要查詢的數據
能夠根據範圍查詢,經過葉子節點的上層中間節點就能夠獲得頁的範圍,最後直接讀取數據頁。
二、輔助索引(unique,index)
定義:查詢數據的時候,使用的是非主鍵字段的時候,就能夠給該字段設置成輔助索引。
注意:葉子節點存放的是數據對應的主鍵值
輔助索引拿到的是數據的主鍵值,最終,仍是須要去主鍵的彙集索引 裏面查數據
三、覆蓋索引
在輔助索引的葉子結點就已經拿到了須要的數據
#覆蓋索引 #給name設置輔助索引select name from user where name='hell'; #非覆蓋索引select age from user where name='hell';