您好,登錄后才能下訂單哦!
視圖
視圖是一個虛擬表(非真實存在),其本質(zhì)是【根據(jù)SQL語句獲取動態(tài)的數(shù)據(jù)集,并為其命名】,用戶使用時只需使用【名稱】即可獲取結(jié)果集,并可以將其當作表來使用。
創(chuàng)建視圖:
create view v1 as select * from student where id > 100;
今后可以直接通過:
select * from v1; #直接訪問學生ID大于100的信息
刪除視圖:
drop view v1;
修改視圖:
alter view v1 as select id,name from student where id<10 and name=dandan;
注意:使用視圖時,將其當作表進行操作即可,由于視圖是虛擬表,所以使用其對真實表進行創(chuàng)建、更新和刪除操作,僅能做查詢用。
觸發(fā)器
對某個表進行【增/刪/改】操作的前后如果希望觸發(fā)某個特定的行為時,可以使用觸發(fā)器,觸發(fā)器用于定制用戶對表的行進行【增/刪/改】前后的行為。
創(chuàng)建觸發(fā)器:
delimiter // create trigger tg_before_insert_student before insert on student for each row begin if new.name=='alex' then insert into student_back (name) values ('alex_back'); end // delimiter ;
也可以用 after insert 表示插入之后執(zhí)行觸發(fā)器中語句,還有其他操作:before update、after update、before delete 、after delete
注意:NEW表示即將插入的數(shù)據(jù)行,OLD表示即將刪除的數(shù)據(jù)行
刪除觸發(fā)器:drop tgigger tg_before_insert_student
觸發(fā)器無法由用戶直接調(diào)用,而知由于對表的【增/刪/改】操作被動引發(fā)的。
存儲過程
存儲過程是一個SQL語句集合,當主動去調(diào)用存儲過程時,其中內(nèi)部的SQL語句會按照邏輯執(zhí)行。
-- 創(chuàng)建存儲過程 delimiter // create procedure p1() BEGIN select * from t1; END// delimiter ; -- 執(zhí)行存儲過程 call p1()
對于存儲過程,可以接受參數(shù),其參數(shù)類型有三類:
in 只用于傳入?yún)?shù)
out 用于返回值
inout 即可以傳入又可以當作返回值
有參數(shù)的存儲過程:
-- 創(chuàng)建存儲過程 delimiter \\ create procedure p1( in i1 int, in i2 int, inout i3 int, out r1 int ) BEGIN DECLARE temp1 int; DECLARE temp2 int default 0; set temp1 = 1; set r1 = i1 + i2 + temp1 + temp2; set i3 = i3 + 100; end\\ delimiter ; -- 執(zhí)行存儲過程 set @t1 =4; set @t2 = 0; CALL p1 (1, 2 ,@t1, @t2); SELECT @t1,@t2;
結(jié)果集加返回值:
delimiter // create procedure p2( in n1 int, inout n3 int, out n2 int, ) begin declare temp1 int ; declare temp2 int default 0; select * from v1; set n2 = n1 + 100; set n3 = n3 + n1 + 100; end // delimiter ;
事務(wù)型存儲過程:
delimiter \\ create PROCEDURE p1( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; rollback; END; DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2; rollback; END; START TRANSACTION; DELETE from tb1; insert into tb2(name)values('seven'); COMMIT; -- SUCCESS set p_return_code = 0; END\\ delimiter ;
游標:
delimiter // create procedure p3() begin declare ssid int; -- 自定義變量1 declare ssname varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE; DECLARE my_cursor CURSOR FOR select sid,sname from student; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor; xxoo: LOOP fetch my_cursor into ssid,ssname; if done then leave xxoo; END IF; insert into teacher(tname) values(ssname); end loop xxoo; close my_cursor; end // delimter ;
動態(tài)執(zhí)行SQL:
delimiter \\ CREATE PROCEDURE p4 ( in nid int ) BEGIN PREPARE prod FROM 'select * from student where sid > ?'; EXECUTE prod USING @nid; DEALLOCATE prepare prod; END\\ delimiter ;
刪除存儲過程:drop procedure proc_name;
執(zhí)行存儲過程:
-- 無參數(shù) call proc_name() -- 有參數(shù),全in call proc_name(1,2) -- 有參數(shù),有in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2)
函數(shù)
MySql中的函數(shù)分為:內(nèi)置函數(shù)、自定義函數(shù)
內(nèi)置函數(shù)參考:
http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions
自定義函數(shù):
delimiter \\ create function f1( i1 int, i2 int) returns int BEGIN declare num int; set num = i1 + i2; return(num); END \\ delimiter ;
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。