Mysql 存储过程,触发器,视图 学习记录
存储过程:是将对应的SQL查询等写到服务器中,在查询是直接调用存储过程相关数据。
1、 delimiter $$ 修改执行命令符变为 $$
创建存储过程:
//procedure
//参数 IN|OUT|INOUT
//
//特征值
//{CONTAINS SQL|NO SQL |READS SQL DATA|MODIFIES SQL DATA}:这些特征值提供子程序使用数据的内在信息,这些特征值目前只提供给服务器,并没有根据这些特征值来约束过程实际使用数据情况。CONTAINS SQL 表示子程序不包含读或写数据的语句。NO SQL表示子程序不包含SQL语句。READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。MODIFIES SQL DATA 表示子程序包含写数据的语句。如果特征没有明确给定,默认使用的值是CONTAINS SQL。
//
CREATE PROCEDURE findz(IN startid int,IN endid int,OUT gettotal int)
READS SQL DATA
BEGIN
select username from user where id>startid and id<endid;
select found_rows() into gettotal;
END $$
//调用procedure
//call findz(4,10,@love)
//
//select @love
//show create procedure findz
//show procedure status {like 'patter'}
定义变量
//Declare va_name type [default value]
//变量赋值1
//set var_name = expr[,var_name=expr]
//Select col_name[,] into var_name
//function 参数只能 IN
CREATE FUNCTION updates(val varchar(30),wid int)
RETURNS varchar(30)
READS SQL DATA
BEGIN
DECLARE name varchar(30);
update user set username='val' where id=wid;
select username INTO name from user where id=wid;
RETURN name;
END $$
//调用函数
//select updates();
//show create function findz
//show function status
触发器
可以协助应用在数据库端确保数据的完整性。
CREATE TRIGGGER chufa 触发时间 触发事件 ON 表 FOR EACH ROW
触发时间:BEFORE AFTER
触发事件:INSERT UPDATE DELETE
对ON表:old. 旧表 new. 新表
create trigger yangsa before insert on user for each row
insert into user_bk (id,username) values (new.id,new.username);
视图
视图(view)是一种虚似存在的表
CREATE VIEW shitu AS SELECT id,username,price FROM user;
用视图:
SELECT id,username FROM shitu;