1、視圖mysql
視圖是個虛擬表,只存在於內存中,可是它的表結構是存在於硬盤上的。爲何要用視圖:使用視圖咱們能夠把查詢過程當中的臨時表摘出來,保存下來,用視圖去實現,這樣之後再想操做該臨時表的數據時就無需重寫複雜的sql了,直接去視圖中查找便可,但視圖有明顯地效率問題,而且視圖是存放在數據庫中的,若是咱們程序中使用的sql過度依賴數據庫中的視圖,即強耦合,那就意味着擴展sql極爲不便,所以並不推薦使用。程序員
create view t1_view as select *from t1;sql
Create view 視圖名 as sql語句;數據庫
update t1 set age=88 where id = 4;網絡
insert into t1_view(name,age) values('mm',67),('uiui',90);ui
drop view t1_view;spa
drop view 視圖名;事務
alter view tt_view as select *from t2;內存
alter view 視圖名 as 新sql語句;開發
#!!!注意注意注意:
#1. 使用視圖之後就無需每次都重寫子查詢的sql,開發的時候是方便了不少,可是這麼效率並不高,還不如咱們寫子查詢的效率高
#2. 並且有一個致命的問題:視圖是存放到數據庫裏的,若是咱們程序中的sql過度依賴於數據庫中存放的視圖,那麼意味着,一旦sql須要修改且涉及到視圖的部分,則必須去數據庫中進行修改,而後再到本身的應用程序裏面將那個sql語句改一改,須要不少的修改工做,並而對視圖的更改一般在通常中型及以上公司中數據庫有專門的DBA負責,你要想完成修改,必須付出大量的溝通成本DBA可能纔會幫你完成修改,極其地不方便
這麼多的弊端,爲何mysql還要提供這個東西呢,有一點是由於mysql想把全部數據處理的工做所有接手過來,但其實還有其餘的緣由,等咱們講完存儲過程在和你們說吧。
#3 而且注意:視圖通常都是用於查詢,儘可能不要修改(插入、刪除等)視圖中的數據,雖然有時候能夠修改爲功,可是儘可能不要這樣作,由於這個視圖多是多個表聯合起來生成的一個結果,若是你修改它,可能會形成不少表裏面的數據都跟着被修改了
小總結:單表查詢時,能夠對錶實現插入和修改,可是聯表時,能夠插入,但不能修改。插入數據時,values()括號內寫的哪一個表的字段,那麼就就會給哪一個表插入數據。
2、觸發器
實現對一張表操做前或者後,進行一些其餘的操做。觸發器是被動調用的,而且會一直伴隨這張表。
表1--t1
Id name age
表2--t2
Id content tid(這個是t1表的id)
Delimiter //#從新聲明一個結束符
Create trigger tri_1 after(befor) insert(update,delete) on t2 for each row #建立一個觸發器,沒有結束符
If new.tid > 5 then #使用if判斷
Insert into t1(name,age) values(‘uuuu’,new.tid);#對t2操做完後,對t1進行的操做
End if;# if操做結束
End // #觸發器內容執行完畢
Delimiter ;#把結束符再聲明回分號「;」
刪除觸發器:
drop trigger 觸發器名字;
3、事務
把多個sql語句綁定在一塊兒執行,而且其中某個沒有執行成功,只要沒有commit,就還能夠回滾rollback。
start transaction;
insert into t1(name,age) values('11211aaaaa',24);
insert into t3(name,age) values('bbbbbbb',67);#實際沒有t3表,因此會報錯
insert into t2(content,tid) values('ccccccc', 13);
上面第二條插入數據的sql語句報錯,因此rollback回滾一下,回到原來的數據。
4、存儲過程
把sql語句作成一個過程,這樣方便程序員調用。存儲過程有其本身的優缺點:
優勢:
#1. 用於替代程序寫的SQL語句,實現程序與sql解耦
#2. 基於網絡傳輸,傳別名的數據量小,而直接傳sql數據量大
缺點:
#1. 程序員擴展功能不方便
delimiter // #聲明一個結束符
create procedure p1() #建立一個存儲過程
Begin #開始
select *from t1;#過程當中執行的sql語句
insert into t2(content,tid) values('9090ooiioijkkj',6);#過程當中執行的sql語句
end // #執行完畢
delimiter ; #把結束符從新聲明回「;」
delimiter // #聲明一個新的結束符
create procedure p5(
in arg1 int,
out arg2 char,
inout arg3 int
) #建立一個存儲過程
Begin#過程開始執行
select *from t1 where name='tom'; #過程當中的sql語句
select *from t1 where id > arg1; #過程當中的sql語句
insert into t1(name,age) values('Moon',27); #過程當中的sql語句
set arg2 = 'finish';#爲out類型的變量從新賦值
set arg3 = 20; #爲inout類型的變量從新設置值
end // #過程執行完畢
delimiter ; #把結束符從新聲明回來
set @res1='tom'; #建立一個變量
set @res2=10; #建立一個變量
call p2(2,@res1,@res2); #調用存儲過程
select @res1; #查詢out類型的值被修改成什麼了
select @res2; #查詢inout類型的值被修改成什麼了
Drop procedure 過程名;