create view 視圖名[(視圖字段列表)]
as
select 語句
[with [local | cascaded] check option]
建視圖名中統(tǒng)一添加前綴view_或后綴_view
視圖的作用
1:是操作變得簡單
2:避免冗余數(shù)據(jù)
3:增強安全性
同一個數(shù)據(jù)可以創(chuàng)建不同的視圖,為不同的用戶分配不同的視圖奥裸,這樣可以實現(xiàn)不同的用戶只能查詢和修改對應的數(shù)據(jù)险掀,從而增強數(shù)據(jù)的安全性。
4:提高數(shù)據(jù)的邏輯獨立性
有了視圖湾宙,應用程序可以建立在視圖之上樟氢,從而使應用程序和數(shù)據(jù)表結構在一定程度上邏輯分離。
a: 視圖可以向應用程序屏蔽表結構侠鳄,如果表結構發(fā)生變化埠啃,只需修改視圖,無需修改應用程序
b:使用視圖可以向數(shù)據(jù)庫屏蔽應用程序伟恶。如果應用程序發(fā)現(xiàn)變化碴开,只需重新定義或修改視圖,無需修改數(shù)據(jù)庫表結構博秫。
drop view視圖名
create trigger 觸發(fā)器名 觸發(fā)時間 觸發(fā)事件 on 表名 for each row
begin
觸發(fā)程序
end;
查看觸發(fā)器定義
show triggers;
刪除觸發(fā)器 drop trigger 觸發(fā)器名潦牛;
觸發(fā)器注意事項:
1:如果觸發(fā)程序包含select語句,select不能返回結果集
2:同一個表不能創(chuàng)建兩個相同的觸發(fā)器
3:觸發(fā)程序中不能顯示或隱式的打開台盯,開始或結束事務罢绽。
4:觸發(fā)器針對記錄操作,當批量操作時静盅,性能降低良价。
5:MyISAM引擎中,觸發(fā)器不能保證原子性蒿叠。
8:MySQL觸發(fā)程序不能對本表執(zhí)行update操作明垢,可以用set命令代替,否則會出錯市咽。
9:before觸發(fā)程序中痊银,auto_increment字段的new值為0,不是實際插入記錄時自動生成的自增類型字段施绎。
臨時表分為內(nèi)存臨時表(in-memory)以及外存臨時表(on-disk)
手工創(chuàng)建臨時表溯革,就是正常create table語句加上temporary
如:
create temporary table temp(name char(100));
insert into temp values('test');
select * from temp;
查看臨時表 show create table臨時表名;
刪除 drop temporary table臨時表名谷醉;
注意事項:
臨時表是數(shù)據(jù)庫對象致稀,因此創(chuàng)建臨時表需要指定該臨時表屬于哪個數(shù)據(jù)庫。
臨時表如果與基表重名俱尼,那么基表將被隱藏抖单,除非臨時表刪除,基表才能被訪問。
MyISAM,Merge ,InnoDB引擎都支持臨時表
臨時表引擎由default_tmp_storage_engine決定
show table 命令不會顯示臨時表
rename不能重命名臨時表矛绘,但可以使用alter table 來重命名
通過視圖雖然可以更新基表數(shù)據(jù)耍休,但不建議這么做,因為通過視圖更新基表數(shù)據(jù)货矮,并不會觸發(fā)觸發(fā)器運行羊精。
存儲過程
create procedure 存儲過程名(參數(shù)1,參數(shù)2,……)
[存儲過程選項]
begin
存儲過程語句塊;
end;
存儲過程參數(shù)有in , out , inout
存儲過程必須通過call來調(diào)用
查看存儲過程 show procedure status;
show procedure status like模式 過濾查找
select name from mysql.proc where db='choose' and type ='procedure';
通過命令 show create procedure存儲過程名; 可以查看指定數(shù)據(jù)庫指定存儲過程的詳細信息次屠,存儲過程信息保存在information_schema數(shù)據(jù)庫中routines表
Select * from information_schema.routines where routine_name = '存儲過程名';
drop procedure存儲過程名; 來刪除存儲過程
存儲過程與函數(shù)的區(qū)別:
1:函數(shù)有且僅有一個返回值园匹,且必須指定返回值類型。存儲過程可以沒有返回值劫灶,也可以有裸违,甚至多個,返回值需要使用out或者inout參數(shù)定義本昏。
2:函數(shù)可以使用select……into語句為變量賦值供汛,但不能使用select返回結果集。存儲過程則都可以涌穆。
3:函數(shù)可以直接嵌入到sql語句或表達式中怔昨,可以擴展標準的sql語句,存儲過程則需要單獨調(diào)用宿稀,并使用call關鍵字趁舀。
4:函數(shù)中的函數(shù)體限制比較多,比如不能顯示或隱式的打開祝沸,開始或結束事務矮烹。存儲過程則限制較少,可以使用事務罩锐,可以使用預處理SQL語句奉狈。
5:應用程序調(diào)用函數(shù)時,通常將函數(shù)封裝成sql字符串進行調(diào)用涩惑,而調(diào)用存儲過程必須使用call關鍵字仁期。存儲過程返回值通過out或inout參數(shù)傳遞給mysql會話變量。
自定義錯誤處理程序:
declare 錯誤處理類型 handler for 錯誤觸發(fā)條件 自定義錯誤處理程序竭恬;
自定義錯誤觸發(fā)條件
declare 錯誤觸發(fā)條件 condition for MySQL錯誤代碼或者ANSI標準錯誤代碼
如:
declare continue handler for 1452
begin
set @error1='外鍵約束錯誤!';
end;
可以修改為:
declare foreign_key_error condition for sqlstate '23000';
declare continue handler for foreign_key_error
begin
set @error1='外鍵約束錯誤!';
end;
說明:
MySQL預定義了sqlexception,sqlwarning,not found等錯誤觸發(fā)條件跛蛋,這些錯誤觸發(fā)條件無需數(shù)據(jù)庫開發(fā)人員定義,可以直接使用痊硕。
declare游標 --聲明游標
opne游標-- 打開游標
fetch游標 --提取數(shù)據(jù)
處理結果集中的數(shù)據(jù)
close游標--關閉游標
declare游標名 cursor for select語句
聲明游標后赊级,游標中select語句并沒有執(zhí)行,沒有select語句集寿桨。
open 游標名
打開游標名,select語句被執(zhí)行,MySQL服務器內(nèi)存有select語句結果集亭螟。
從游標中取數(shù)據(jù)
fetch 游標名 into 變量名1挡鞍,變量名2,……
說明:變量名個數(shù)必須與聲明游標時使用的select語句結果集中字段個數(shù)保存一致预烙。
fetch語句需要循環(huán)語句配合墨微,才能實現(xiàn)整個結果集的遍歷。
當fetch語句取出最后一個記錄扁掸,再次執(zhí)行fetch語句將產(chǎn)生“ERROR 1329(02000):No data to FETCH”錯誤信息翘县,數(shù)據(jù)庫開發(fā)時可以針對1329自定義錯誤處理程序,以便結束結果集遍歷谴分。
關閉游標:
close 游標名
預處理SQL
1:創(chuàng)建預處理SQL
prepare 預處理SQL語句名 from SQL字符串
如:
prepare select_class_pre from 'select * from classes';
預處理語句是數(shù)據(jù)庫對象锈麸,因此創(chuàng)建預處理語句SQL時,需要指定屬于哪個數(shù)據(jù)庫牺蹄。
執(zhí)行預處理語句:
execute預處名[using 填充數(shù)據(jù)[,填充數(shù)據(jù)……]]
using 將填充數(shù)據(jù)到SQL語句中對應位置的“?”問號忘伞。
如: execute select_class_pre;
釋放預處理語句
deallocate prepare預處理名;
MySQL的存儲程序分為4類:函數(shù),觸發(fā)器沙兰,存儲過程以及事件氓奈。