淺談MySql 視圖、觸發(fā)器以及存儲(chǔ)過程
視圖
什么是視圖?視圖的作用是什么?
視圖(view)是一種虛擬存在的表,是一個(gè)邏輯表,它本身是不包含數(shù)據(jù)的。作為一個(gè)select語(yǔ)句保存在數(shù)據(jù)字典中的。
通過視圖,可以展現(xiàn)基表(用來(lái)創(chuàng)建視圖的表叫做基表base table)的部分?jǐn)?shù)據(jù),說白了視圖的數(shù)據(jù)就是來(lái)自于基表。
視圖的優(yōu)點(diǎn):
- 簡(jiǎn)單:使用視圖的用戶完全不需要關(guān)心后面對(duì)應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件,對(duì)用戶來(lái)說已經(jīng)是過濾好的復(fù)合條件的結(jié)果集。
- 安全:使用視圖的用戶只能訪問他們被允許查詢的結(jié)果集,對(duì)表的權(quán)限管理并不能限制到某個(gè)行某個(gè)列,但是通過視圖就可以簡(jiǎn)單的實(shí)現(xiàn)。
- 數(shù)據(jù)獨(dú)立:一旦視圖的結(jié)構(gòu)確定了,可以屏蔽表結(jié)構(gòu)變化對(duì)用戶的影響,源表增加列對(duì)視圖沒有影響;源表修改列名,則可以通過修改視圖來(lái)解決,不會(huì)造成對(duì)訪問者的影響。
- 不占用空間:視圖是邏輯上的表,不占用內(nèi)存空間。
總而言之,使用視圖的大部分情況是為了保障數(shù)據(jù)安全性,提高查詢效率。
視圖的缺點(diǎn):
- 性能差:sql server 必須把視圖查詢轉(zhuǎn)化成對(duì)基本表的查詢,如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢所定義,那么,即使是視圖的一個(gè)簡(jiǎn)單查詢,sql server 也要把它變成一個(gè)復(fù)雜的結(jié)合體,需要花費(fèi)一定的時(shí)間。
- 修改限制:當(dāng)用戶試圖修改試圖的某些信息時(shí),數(shù)據(jù)庫(kù)必須把它轉(zhuǎn)化為對(duì)基本表的某些信息的修改,對(duì)于簡(jiǎn)單的試圖來(lái)說,這是很方便的,但是,對(duì)于比較復(fù)雜的試圖,可能是不可修改的。
視圖的創(chuàng)建以及修改
--創(chuàng)建的基本語(yǔ)法是: create view <視圖名稱> as select 語(yǔ)句; create view <視圖名稱> (字段) as select 語(yǔ)句; create or replace view <視圖名稱>; --修改的語(yǔ)法是: alter view <視圖名稱> as select 語(yǔ)句; --視圖刪除語(yǔ)法: drop view <視圖名稱> ;
觸發(fā)器
什么是觸發(fā)器?
觸發(fā)器就是監(jiān)視某種情況,并觸發(fā)某種操作。
創(chuàng)建、刪除觸發(fā)器的語(yǔ)法:
--創(chuàng)建觸發(fā)器的語(yǔ)法: create trigger 觸發(fā)器名稱 after/before insert/update/delete on 表名 for each row begin sql語(yǔ)句; end --after/before:可以設(shè)置為事件發(fā)生前或后 --insert/update/delete:它們可以在執(zhí)行insert、update或delete的過程中觸發(fā) --for each row:每隔一行執(zhí)行一次動(dòng)作 --刪除觸發(fā)器的語(yǔ)法: drop trigger 觸發(fā)器名稱;
演示
--創(chuàng)建一個(gè)員工遲到表: create table work_time_delay( empno int not null comment '雇員編號(hào)', ename varchar(50) comment '雇員姓名', status int comment '狀態(tài)' ); --delimiter // 自定義語(yǔ)句的結(jié)束符號(hào) 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:指的是事件發(fā)生before或者after保存的新數(shù)據(jù)
存儲(chǔ)過程
什么是存儲(chǔ)過程?
存儲(chǔ)過程就是把復(fù)雜的一系列操作,封裝成一個(gè)過程。類似于 shell,python 腳本等。
存儲(chǔ)過程的優(yōu)點(diǎn):
- 復(fù)雜操作,調(diào)用簡(jiǎn)單
- 速度快
存儲(chǔ)過程的缺點(diǎn):
- 封裝復(fù)雜
- 沒有靈活性
創(chuàng)建存儲(chǔ)過程語(yǔ)法
--創(chuàng)建存儲(chǔ)過程語(yǔ)法: create procedure 名稱 (參數(shù)....) begin 過程體; 過程體; end --參數(shù): -- in|out|inout 參數(shù)名稱 類型(長(zhǎng)度) -- in:表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量) -- out:表示過程向調(diào)用者傳出值(可以返回多個(gè)值)(傳出值只能是變量) -- inout:既表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(值只能是變量) --聲明變量:declare 變量名 類型(長(zhǎng)度) default 默認(rèn)值; --給變量賦值:set @變量名=值; --調(diào)用存儲(chǔ)命令:call 名稱(@變量名); --刪除存儲(chǔ)過程命令:drop procedure 名稱; --查看創(chuàng)建的存儲(chǔ)過程命令:show create procedure 名稱\G;
演示
--創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過程: delimiter // create procedure name(in n int) begin select * from employee limit n; end // --調(diào)用存儲(chǔ)過程 set @n=5; // call name(@n); create procedure name() begin declare n int default 6; select * from employee limit n; end // --調(diào)用存儲(chǔ)過程 call name(); //
以上就是淺談MySql 視圖、觸發(fā)器以及存儲(chǔ)過程的詳細(xì)內(nèi)容,更多關(guān)于MySql 視圖、觸發(fā)器以及存儲(chǔ)過程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql數(shù)據(jù)庫(kù)視圖和執(zhí)行計(jì)劃實(shí)戰(zhàn)案例
這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)視圖和執(zhí)行計(jì)劃的相關(guān)資料,在使用MySQL過程中視圖和執(zhí)行計(jì)劃是一個(gè)很好的工具,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02mysql 如何使用JSON_EXTRACT() 取json值
這篇文章主要介紹了mysql如何使用JSON_EXTRACT() 取json值的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07mysql根據(jù)json字段內(nèi)容作為查詢條件(包括json數(shù)組)檢索數(shù)據(jù)
本文主要介紹了mysql根據(jù)json字段內(nèi)容作為查詢條件(包括json數(shù)組)檢索數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02MySQL根據(jù)某一個(gè)或者多個(gè)字段查找重復(fù)數(shù)據(jù)的sql語(yǔ)句
這篇文章主要介紹了MySQL根據(jù)某一個(gè)或者多個(gè)字段查找重復(fù)數(shù)據(jù)的sql語(yǔ)句,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12