您好,登錄后才能下訂單哦!
視圖
視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,并為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,并可以將其當作表來使用。
創建視圖:
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;
注意:使用視圖時,將其當作表進行操作即可,由于視圖是虛擬表,所以使用其對真實表進行創建、更新和刪除操作,僅能做查詢用。
觸發器
對某個表進行【增/刪/改】操作的前后如果希望觸發某個特定的行為時,可以使用觸發器,觸發器用于定制用戶對表的行進行【增/刪/改】前后的行為。
創建觸發器:
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 表示插入之后執行觸發器中語句,還有其他操作:before update、after update、before delete 、after delete
注意:NEW表示即將插入的數據行,OLD表示即將刪除的數據行
刪除觸發器:drop tgigger tg_before_insert_student
觸發器無法由用戶直接調用,而知由于對表的【增/刪/改】操作被動引發的。
存儲過程
存儲過程是一個SQL語句集合,當主動去調用存儲過程時,其中內部的SQL語句會按照邏輯執行。
-- 創建存儲過程 delimiter // create procedure p1() BEGIN select * from t1; END// delimiter ; -- 執行存儲過程 call p1()
對于存儲過程,可以接受參數,其參數類型有三類:
in 只用于傳入參數
out 用于返回值
inout 即可以傳入又可以當作返回值
有參數的存儲過程:
-- 創建存儲過程 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 ; -- 執行存儲過程 set @t1 =4; set @t2 = 0; CALL p1 (1, 2 ,@t1, @t2); SELECT @t1,@t2;
結果集加返回值:
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 ;
事務型存儲過程:
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 ;
動態執行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;
執行存儲過程:
-- 無參數 call proc_name() -- 有參數,全in call proc_name(1,2) -- 有參數,有in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2)
函數
MySql中的函數分為:內置函數、自定義函數
內置函數參考:
http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions
自定義函數:
delimiter \\ create function f1( i1 int, i2 int) returns int BEGIN declare num int; set num = i1 + i2; return(num); END \\ delimiter ;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。