转自:https://zhuanlan.zhihu.com/p/28491458
http://www.cnblogs.com/chenpi/p/5136483.html
http://www.cnblogs.com/kissdodog/p/4168721.html
https://www.cnblogs.com/geaozhang/p/6817698.html
https://zhuanlan.zhihu.com/p/31839179
函数
创建:
CREATE FUNCTION function_name
RETURNS
{STRING|INTEGER|REAL|DECIMAL}
routine_body
删除:
DROP FUNCTION [if exists] function_name
存储过程
创建:
CREATE [DEFINER={user|CURRENT_USER}] PROCEDURE sp_name([IN|OUT|INOUT] param_name type [, ..])
[characterisitic ..] routine_body
修改:
ALTER PROCEDURE sp_name [characteristic..]
COMMENT 'string'
|LANGUAGE SQL
|{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
|SQL SECURITY { DEFINER | INVOKER }
修改语句只能改变存储过程的特征,不能修改过程的参数以及过程体。如果想做这样的修改,必须先使用DROP PROCEDURE 删除过程,然后使用and CREATE PROCEDURE重建过程。
删除:
DROP PROCEDIRE [IF EXISTS] sp_name
存储过程弊端:
不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;
不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;
区别:
存储过程实现的功能更复杂;函数的针对性更强;
存储过程可返回多个参数;函数只能返回一个值或表对象
存储过程一般独立执行(EXEC执行);函数可通过SQL语句调用
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少
当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。
存储过程和触发器
存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用
MySQL存储引擎:将数据以不同的技术存储在文件(内存)中。每种存储引擎存储机制、索引技巧、锁定水平不同,最终提供广泛且不同的功能