Mysql 視圖、觸發器、事務、存儲過程、流程控制、索引

 1、視圖:

本質:就是根據sql語句獲取的動態數據集合,也就是一張虛擬表python

注意:視圖通常只用來查詢數據,不做修改,由於涉及多張表的數據mysql

基本語法:sql

建立:create view 視圖名字 as sql語句
修改:alter view 視圖名稱 as sql語句
刪除:drop view 視圖名字

 2、觸發器:

本質:定製用戶對錶進行增刪改操做時先後的行爲數據庫

注意:觸發器要在開頭修改結束符號,結束後再修改回來安全

基本語法:併發

#建立觸發器
delimiter $$ #修改mysql的結束符,只做用於當前窗口。create trigger 觸發器名字 before/after insert/update/delete on 表名 for each rowbegin sql語句end $$
delimiter ; #將mysql的結束符修改回默認的

#刪除觸發器drop trigger 觸發器名字

3、事務

做用:保證數據操做的安全性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

4、存儲過程

本質:相似於咱們自定義的函數,將一系列可執行的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())

5、流程控制:

一、條件語句:

#基本語法:
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 ;

6、索引:

本質:經過不斷地縮小想要獲取數據的範圍來篩選出最終想要的結果。
索引結構(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';
相關文章
相關標籤/搜索