关系数据库设计理论之自定义函数(数据库设计)
自定义函数
用户自定义函数(user-defined-function,UDf)是一种MySQL的扩展途径,其用法与内置函数相同
自定义函数的两个必要条件(参数和返回值之间没有必然联系)
(1) 参数
(2) 返回值(在MySQL的函数中,所有的函数都要有返回值)
函数可以返回任意类型的值,同样可以接收这些类型的参数
创建自定义函数
CREATE FUNCTION function_name
RETURNS(这个指的是返回值的类型)
{STRING|INTEGER|REAL|DECIMAL}
Routine_body(函数体)
关于函数体
(1) 函数体由合法的SQL语句构成
(2) 函数体可以是简单的SELECT或INSERT语句
(3) 函数体如果为复合结构(也就是有多条语句)则使用BEGIN….END语句
(4) 复合结构可以包含声明、循环、控制结构
创建一个带有两个参数的自定义函数
通过函数来实现向一个表中添加一条记录
DELIMITER // 意思是将//设置为结束标志
当函数体包含多条语句时,需要放在BEGIN和AND之间
删除函数 DROPFUNCTION[IF NOT EXISTS] function_name;
数据库中的存储过程
MySQL命令的执行流程
SQL命令-----MySQL引擎-----语法正确------可识别命令------执行结果------客户端
成功输入SQL语句以后,MySQL引擎会对输入的SQL命令进行分析,查看是否正确,如果正确再进行编译,编译成MySQL引擎可以识别的命令,之后开始执行,并且将执行的结果返回给客户端
存储过程
存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理
存储过程的优点
(1) 增强SQL语句的功能和灵活性(2)实现较快的执行速度(3)减少网络流量
创建存储过程
CREATE
[DEFINER={user|CURRENT_USER}]
PROCEDUREsp_name([proc_parameter[,…]])
[characteristic…]routine_body
pro_parameter:
[IN|OUT|INOUT]param_name type;
IN:表示该参数的值必须在调用存储过程时指定
OUT:表示该参数的值可以被存储过程改变,并且可以返回
INOUT:表示该参数在调用时指定,并且可以被改变和返回
过程体:
过程体由合法的SQL语句构成;
过程体可以是增、删、改、查、多表连接等SQL语句;
过程体如果为复合结构则使用BEGIN….END语句
复合结构可以包含声明、循环、控制结构
存储过程的调用 CALL sp_name([parameter[,…]]);
CALLso_name[()] 也就是说没有参数时,这里的()可以要也可以不要
创建一个没有参数的存储过程
创建一个包含IN类型的参数的存储过程(注意:这个参数的名字,不能和数据表中的记录名相同)
删除存储过程 DROP PROCEDURE [IF EXISTS] sp_name;
从数据表中删除id不固定的记录,并且返回剩余的记录数(第二个参数是要用来返回的,所以要定义成OUT型)
那里的INTO表示要将COUNT(id)的结果放入到userNums中
传一个变量来接收OUT类型的返回值
@nums这种写法代表的就是变量 像这种前边有一个@符号的变量称之为用户变量 它是和MySQL的客户端绑定的 只对当前的客户端生效
在BEGIN….AND之间的变量称之为局部变量
存储过程与自定义函数的区别
(1) 存储过程实现的功能要复杂一些;而函数的针对性更强
(2) 存储过程可以返回多个值;函数只能由一个返回值
(3) 存储过程一般独立的来执行;而函数可以作为其他SQL语句的组成部分来出现