计算机二级MySQL大题系列02-触发器、事件、存储过程和函数必考题

计算机二级MySQL大题系列02-触发器、事件、存储过程和函数必考题

做了很多套二级MySQL大题,要进行一个总结。这一部分是第二道大题,一共两个小题。一般组合是触发器和存储过程。

20分到手!

1 基本知识介绍

1.1 触发器

  • 创建触发器
CREATE 
	TRIGGER trigger_name trigger_time trigger_event
	ON tbl_name
	FOR EACH ROW trigger_body

解释一下:

考点1: TRIGGER这个单词要考,给个空一看是触发器要考填单词……

考点2: trigger_time trigger_event

trigger_time一共就两种,BEFORE和AFTER。

trigger_event一共就三种,INSERT\UPDATE和DELETE。

因此time和event排列组合一共六种。

注意,每个event是一个触发器。

考点3: ON

没错,写完触发器的event,就要写对那个表的发生作用。用的单词是ON。

考点4: FOR EACH ROW

意思对每一行都发生作用,也考……

其他知识点:

  1. SHOW TRIGGERS [{from | in } db_name] 显示触发器
  2. DROP TRIGGER…… 删掉触发器
  3. INSERT 触发器,可引用NEW虚拟表访问被插入的行
  4. DELETE触发器,可引用OLD虚拟表访问被删除的数据
  5. UPDATE触发器,可引用OLD和NEW访问相应的数据

1.2 事件

  • 创建事件
CREATE 
	EVENT
	[IF NOT EXISTS]
	event_name
	ON SCHEDULE schedule
	[ENABLE | DISABLE | DISABLE ON SLAVE]
	DO event_body
	
#SCHEDULE用法
AT timestamp[+INTERVAL interval]...
	| EVERY interval
		[STARTS timestamp[+INTERVAL interval]...]
		[ENDS timestamp[+INTERVAL interval]...]

太详细的不用管。

AT用于指定某个时刻,EVERY字句用于确定事件发生的时刻。STARTS和ENDS事开始和关闭的时刻。

修改事件使用 ALTER,删除使用DROP。

考点1 : 单词 EVENT

考点2 : 单词 SCHEDULE

1.3 存储过程与函数

存储过程
CREATE
	PROCEDURE sp_name (IN | OUT | INOUT param_name type)
	[characteristic...] routine_body

考点1:单词 PROCEDURE

考点2: IN OUT INOUT。输入参数就是IN 输出参数就是OUT。输入输出参数用INOUT。

考点3:单词 DELIMITER $$ 定义新的结束符号。对应结尾用END $$ 这俩都考。

考点4: 声明局部变量 DECLARE

考点5: 赋值 SET

考点6: SELECT… INTO…

该语句将选定列存储到局部变量。

考点7: 语句词

  • IF THEN ELSEIF THEN ELSE
  • CASE WHEN THEN WHEN THEN ELSE
  • WHILE… DO…
  • REPEAT… UNTIL…
  • LOOP…
  • 以上结束都用END 例如 END IF

考点8:游标【难啊】

游标是一个被SELECT语句检索出来的结果集。在存储游标后,可以根据需要滚动或者浏览数据。

第一步- 声明游标

DECLARE cursor_name CURSOR FOR select_statement

一般考 DECLAER这个单词

第二步-打开游标

OPEN cursor_name

一般不考,只考顺序

第三步-读取数据

FETCH cursor_name INTO ...

一般考单词 FETCH

第四步-关闭游标

CLOSE cursor_name

一般考单词CLOSE。

考点9: CALL sp_name

存储函数

定义

CREATE
 FUNCTION sp_name()
 RETURNS type
 routin_body

考点1: 单词 FUNCTION 定义函数

考点2: RETURNS 记得加S这里返回的是数据类型。

考点3:调用: SELECT sp_name()

2 一些题目参考

  • 触发器
CREATE ________ tr_emp after DELETE
ON tb_dept 
FOR EACH ________
UPDATE tb_employee 
SET deptno='' 
WHERE deptno=________;
delete from tb_dept WHERE deptno='D2';
SELECT * FROM tb_employee;

DELIMITER $$
CREATE TRIGGER tri_price BEFORE INSERT ON tb_commodity FOR EACH ROW
  BEGIN
    DECLARE tmp1 CHAR(20);
    DECLARE tmp2 CHAR(20);
    SET tmp1 = NEW.cname;
    SET tmp2 = ________;
    IF (tmp1= '电视机') && (_____= '上海') THEN
      SET ________ = 2800;
    END IF;
  END $$
DELIMITER ;
  • 函数
DELIMITER $$
CREATE FUNCTION fn_emp (dept CHAR(20)) 
RETURNS FLOAT 
DETERMINISTIC
BEGIN 
Declare sum_salary float;
SELECT sum(salary) ______ sum_salary 
FROM tb_employee INNER JOIN tb_dept 
______ tb_employee.deptno=tb_dept.deptno 
WHERE ___________
GROUP BY dname  ; 
return  sum_salary ;
END $$
DELIMITER ;

  • 存储过程
DELIMITER $$
CREATE PROCEDURE sp_counter(________ ROWS INT)
BEGIN
  DECLARE cid INT;
  DECLARE FOUND BOOLEAN DEFAULT TRUE;
  DECLARE cur_cid CURSOR FOR 
    SELECT cno FROM tb_commodity;
  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET FOUND=FALSE;
  SET ROWS=0;
  OPEN cur_cid;
  FETCH cur_cid INTO cid;
  WHILE FOUND DO
    SET ROWS=ROWS+1;
    ________ cur_cid INTO cid;
  END WHILE;
  ________ cur_cid;
  END $$
DELIMITER ;

  • 事件
DELIMITER $$
CREATE (1) ev_bak ON SCHEDULE (2) 1 DAY
DO
BEGIN
    SELECT * FROM(3) INTO OUTFILE 'bakfile.txt' FIELDS TERMINATED BY ',';
END $$
DELIMITER ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值