计算机二级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
意思对每一行都发生作用,也考……
其他知识点:
- SHOW TRIGGERS [{from | in } db_name] 显示触发器
- DROP TRIGGER…… 删掉触发器
- INSERT 触发器,可引用NEW虚拟表访问被插入的行
- DELETE触发器,可引用OLD虚拟表访问被删除的数据
- 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 ;