MySQL学习笔记(Day014:触发器下/存储过程/自定义函数)
@(MySQL学习)
[TOC]
一. 作业讲解
查询employees表中非基层用户的最近详细信息
关于
Group By
在《SQL必知必会》中提及的部分规定:GROUP BY
子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY
子句中指定相同的表达式。不能使用别名。- 除聚集计算语句外,
SELECT语句中的每一列都必须在GROUP BY子句中给出
。
1 | SELECT |
1 | -- |
- Rank排名一条SQL语句
1 | mysql> select * from test_rank_2; |
二. 触发器 ・ 下
1. 触发器总结
- 触发器对性能有损耗,应当非常慎重使用;
- 对于事物表,
触发器执行失败则整个语句回滚
; - Row格式主从复制,
触发器不会在从库上执行
;- 因为从库复制的肯定是主库已经提交的数据,既然已经提交了说明触发器已经被触发过了,所以从库不会执行。
使用触发器时应防止递归执行;
1
2
3
4
5
6
7delimiter //
create trigger trg_test
before update on 'test_trigger'
for each row
begin
update test_trigger set score=20 where name = old.name; -- 又触发了update操作,循环触发了
end;//
2. 触发器模拟物化视图
物化视图的概念
- 不是基于基表的虚表
- 根据基表实际存在的实表
- 预先计算并保存耗时较多的SQL操作结果(如多表链接(join)或者group by等)
模拟物化视图
1 | mysql> create table Orders |
三. 存储过程
1. 存储过程介绍
- 存储在数据库端的一组SQL语句集;
- 用户可以通过存储过程名和传参多次调用的程序模块;
- 存储过程的特点:
- 使用灵活,可以使用流控语句、自定义变量等完成复杂的业务逻辑;
- 提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计;
- 减少网络传输;
- 提高代码维护的复杂度,实际使用需要结合业务评估;
1 | CREATE |
2. 存储过程举例与流程控制语句
1 | -- |
三. 自定义函数
- 自定义函数和存储过程很类似,但是必须要有返回值;
- 与内置的函数(sum(), max()等)使用方法类似
- select fun(val);
- select * from t where col= fun(val);
- 自定义函数可能在遍历每条记录中使用;
1 | CREATE |
1 | -- 老师给的例子,还是阶乘,用自定义函数的方式 |
原文链接
部分原文:
By default, for a CREATE FUNCTION statement to be accepted, at least one of DETERMINISTIC, NO SQL, or READS SQL DATA must be specified explicitly. Otherwise an error occurs:
默认情况下,在创建自定义函数时,必须显示的指定关键字DETERMINISTIC, NO SQL, 或者是 READS SQL DATA
中的至少一个(可以多个),否则就会有如下错误
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators
variable)