視圖
什麼是視圖?視圖的作用是什麼?
視圖(view)是一種虛擬存在的表,是一個邏輯表,它本身是不包含數據的。作為一個select語句保存在數據字典中的。
通過視圖,可以展現基表(用來創建視圖的表叫做基表base table)的部分數據,說白了視圖的數據就是來自於基表。
視圖的優點:
簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來說已經是過濾好的複合條件的結果集。
安全:使用視圖的用戶只能訪問他們被允許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,但是通過視圖就可以簡單的實現。
數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響。
不佔用空間:視圖是邏輯上的表,不佔用內存空間。
總而言之,使用視圖的大部分情況是為了保障數據安全性,提高查詢效率。
視圖的缺點:
性能差:sql server 必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,sql server 也要把它變成一個複雜的結合體,需要花費一定的時間。
修改限制:當用戶試圖修改試圖的某些信息時,數據庫必須把它轉化為對基本表的某些信息的修改,對於簡單的試圖來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的。
視圖的創建以及修改
--創建的基本語法是: create view as select 語句; create view (字段) as select 語句; create or replace view ; --修改的語法是: alter view as select 語句; --視圖刪除語法: drop view ;
觸發器
什麼是觸發器?
觸發器就是監視某種情況,並觸發某種操作。
創建、刪除觸發器的語法:
--創建觸發器的語法: create trigger 觸發器名稱 after/before insert/update/delete on 表名 for each row begin sql語句; end --after/before:可以設置為事件發生前或後 --insert/update/delete:它們可以在執行insert、update或delete的過程中觸發 --for each row:每隔一行執行一次動作 --刪除觸發器的語法: drop trigger 觸發器名稱;
演示
--創建一個員工遲到表: create table work_time_delay( empno int not null comment '僱員編號', ename varchar(50) comment '僱員姓名', status int comment '狀態' ); --delimiter // 自定義語句的結束符號 delimiter // create trigger trig_work after insert on work_time_delay for each row begin update employee set sal=sal-100 where empno=new.empno; end // --new:指的是事件發生before或者after保存的新數據
存儲過程
什麼是存儲過程?
存儲過程就是把複雜的一系列操作,封裝成一個過程。類似於 shell,python 腳本等。
存儲過程的優點:
複雜操作,調用簡單
速度快
存儲過程的缺點:
封裝複雜
沒有靈活性
創建存儲過程語法
--創建存儲過程語法: create procedure 名稱 (參數....) begin 過程體; 過程體; end --參數: -- in|out|inout 參數名稱 類型(長度) -- in:表示調用者向過程傳入值(傳入值可以是字面量或變量) -- out:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量) -- inout:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量) --聲明變量:declare 變量名 類型(長度) default 默認值; --給變量賦值:set @變量名=值; --調用存儲命令:call 名稱(@變量名); --刪除存儲過程命令:drop procedure 名稱; --查看創建的存儲過程命令:show create procedure 名稱G;
演示
--創建一個簡單的存儲過程: delimiter // create procedure name(in n int) begin select * from employee limit n; end // --調用存儲過程 set @n=5; // call name(@n); create procedure name() begin declare n int default 6; select * from employee limit n; end // --調用存儲過程 call name(); //
[zmcjlove ] 淺談MySql 視圖、觸發器以及存儲過程已經有283次圍觀