数据库的存储过程,触发器,视图,函数

存储过程

存储过程是数据库的一个对象,存储在服务端,用来封装多条SQL语句且带有逻辑性,可以实现一个功能,由于在创建时,已经对SQL进行编译,所以执行效率高,而且可以重复调用,类似JAVA中的方法
创建存储过程需要获得管理员分配权限
参数:
IN:输入参数
OUT:输出参数
INOUT:输入输出参数
语法:

DELIMITER $$
CREATE
    PROCEDURE `performance_schema`.`myTestPro`(in num int ,out r int)
  	DELETE FROM emp WHERE empno=num;
	SELECT COUNT(*) FROM emp INTO r;
   BEGIN
   END$$
DELIMITER ;

delimiter是MySQL定义结束标记的,在MySQL客户端中结束标记默认是( ; ),在写存储过程中需要制定一个特殊的结束符。
MySQL用$$表示语句结束,delimiter;表示存储过程结束。

调用存储过程 call
语法:call myTestPro(9527,@rr);
查询结果:select @rr

删除存储过程 drop
语法:drop procedure myTestPro;

带有IF逻辑的存储过程
DELIMITER $$
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
BEGIN
	IF num=1 THEN
		SET str='星期一';
	ELSEIF num=2 THEN              --注意elseif  连在一块
		SET str='星期二';
	ELSEIF num=3 THEN
		SET str='星期三';             -- 注意要用分号结束
	ELSE
		SET str='输入错误';
	END IF;                        --注意要结束if  后面有分号
END $$

带有循环的存储过程(while do)
控制循环的两个关键字
leave相当于JAVA中的break,iterate相当于JAVA中的continue

DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
	-- 定义一个局部变量
	DECLARE i INT DEFAULT 1;
	DECLARE vsum INT DEFAULT 0;
	WHILE i<=num DO
	      SET vsum = vsum+i;
	      SET i=i+1;
	END WHILE;  -- 要记得结束循环
	SET result=vsum;
END $

loop 循环

DELIMITER $$

CREATE
    PROCEDURE `mydemo3`.`proLoop`(OUT outnum INT)
   
    BEGIN
	DECLARE i INT DEFAULT 0;
      myloop:LOOP    -- myloop是循环名,可更改
         SET i=i+1;
        IF i>=5 THEN
            LEAVE myloop;  -- leave中断循环
         END IF;
    END LOOP;
     SET outnum=i;
    END$$

DELIMITER ;
触发器

触发器是数据库中的一个对象,相当于JS中的监听器,触发器可以监听表中的 增删改 三个动作,当表中的数据发生更改的时候,我们可以通过触发器去记录日志。
BEFORE 行为发生之前就触发
AFTER 行为发生之后触发
FOR EACH ROW 行级触发,每操作一行就触发

DELIMITER $$
--当test表中删除一条数据,触发器就会在logger表中添加一条日志
CREATE
    TRIGGER `mytestdb`.`myTriger`   AFTER DELETE ON test FOR EACH ROW 
    ON `mytestdb`.`<Table Name>`
    FOR EACH ROW 
    BEGIN
    INSERT INTO logger VALUES(NULL,"你删除了一条数据",NOW());
    END$$
DELIMITER ;

old和new
old.字段 可以获取到被监听的表中的字段的旧值
new.字段 可以获取到被监听的表中的字段的插入的新值或者更新后的值

DELIMITER $$
--往t1表中添加数据后,触发器往t2表中添加同样的数据
CREATE
    TRIGGER `mytestdb`.`myTri6` AFTER INSERT
    ON `mytestdb`.`t1`
    FOR EACH ROW BEGIN


	INSERT INTO t2 VALUES(new.id,new.username,new.age);
    END$$
DELIMITER ;
视图

视图是有结构(有行列)但是没有结果(结构中不真实的存储数据)的虚拟的表,虚拟表的结构来源不是自己定义,而是从对应的基表(视图数据的来源)中产生
创建语法:
create view 视图名称 as select语句(这个语句可以是一张或多张表的的普通查询,或多表查询)

  • 视图被创建后,系统会在视图对应的数据库文件夹下,创建一个对应的结构文件:frm文件
  • 视图的作用只是为了简化查询

删除视图:drop view 视图名

视图的意义:

  • 视图可以节省SQL语句,将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作
  • 数据安全,视图操作主要是针对查询语句的,如果对视图进行删除,不会影响基表的数据
  • 视图在对外项目中,可以选择性的对外提供数据
  • 视图可以更好的进行权限控制
函数

内置函数与自定义函数

DELIMITER $$  
  CREATE     
      FUNCTION `mytestdb`.`myFun`(num INT)
      RETURNS INT
      BEGIN
  	DECLARE i INT DEFAULT 100;
  	SET i=i+num;
      RETURN i;
      END$$  
  DELIMITER ;

函数调用:select 函数名();
函数和存储过程的区别
1.存储过程没有返回值,函数必须要有返回值。但是存储过程可以用out能实现返回值这个作用
2.存储过程有in out inout 这几个参数类型 函数的参数全是用来收实参

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值