在数据库中,函数是指完成特定功能的SQL语句集。函数分为内部函数和自定义函数。
内部函数 | 内部函数是MySQL开发者定义的,比如我们接触过的那些常用函数:
|
(1)自定义函数是由一条或多条SQL语句组成的程序,可用于封装代码以便进行重用
(2)用户可以根据需求自己去编写函数的逻辑和实现方式,并将其存储在数据库中,以便在需要的时候调用。这些自定义函数可以提高数据库的灵活性和可扩展性,使得用户可以根据自己的需求实现定制化的功能
(1)参数:可以有零个或者多个;
(2)返回值:必须有且只有一个;
自定义函数 | 存储过程 | |
---|---|---|
定义 | 一种可重复使用的数据库对象,接受参数在执行一系列操作后返回一个值 | 一种可重复使用的数据库对象,接受参数并执行一系列操作 |
功能 | 用于执行特定的操作并返回结果,功能的针对性较强 | 用于执行一系列操作,可以包含条件判断、循环等控制语句,功能较复杂 |
参数 | 只能有输入参数 | 有IN、OUT、INOUT三个参数 |
返回值 | 可以返回一个单一的值,并且需要描述返回值的类型,一个函数体中必须要有一个有效的return语句 | 通常不返回值,返回的是数据集。 但可以使用OUT或INOUT参数传递结果 |
调用方式 | 作为查询语句(SELECT)的一个部分来调用 | 作为一个独立的部分来执行(call语句),可以通过存储过程名称进行调用 |
事务支持 | 可以包含在事务中,可以回滚 | 可以包含在事务中,可以回滚 |
数据库操作 | 可以读取和修改数据库中的数据 | |
执行速度 | 通常比存储过程慢,因为每次调用都需要连接数据库 | 通常比函数快,因为可以在同一连接中多次调用 |
适用场景 | 适用于需要计算、转换或处理数据并返回结果的场景 | 适用于需要执行多个步骤或复杂逻辑的场景 |
?MySQL中创建自定义函数的语法如下:
CREATE FUNCTION function_name(parameter_name type, [parameter_name type,...]) RETURNS type [characteristic ...] fun_body
a. function_name——函数名
b.parameter_name type——输入参数名及其类型,可以0个也可以多个
c.RETURNS type——返回参数的类型
d.characteristic——指定函数的特征,和存储过程一样
e.fun_body——函数体,Begin开始标志、end结束标志
?MySQL调用自定义函数和内置函数用法一样,语法如下:
select function_name[(传参)];
其中,function_name为所需调用的函数名称,
传参表示根据函数定义时的参数进行传参。
用户可以查看指定的自定义函数的详细信息,语法如下:
show create function func_name;
其中,func_name表示需要查看的自定义函数的名称。
?删除自定义函数语法如下:
DROP FUNCTION function_name;
其中,function_name为需删除的自定义函数的名称。
1.创建一函数f_jysl,基于读者表reader:
根据传入参数读者姓名查询出其借阅书籍的数量,如果借阅书籍数量为空,则返回0。写出该自定义函数的代码,调用该函数分别查询出读者姓名为“陈晨”“叶子”的读者借阅书籍的数量。
delimiter // create function f_jysl(rname varchar(30)) returns int begin ? ? ? ? declare lendnum int; ? ? ? ? select num into lendnum from reader where readername=rname; ? ? ? ? if? lendnum is null?then ? ? ? ? ? ? set? lendnum=0; ? ? ? ? end if; ? ? ? ? return lendnum; end // delimiter;
创建函数成功:
调用函数:
ps:记录一下写这个函数时出现的语法错误
- 第一:在第三行也就是returns int 这里,少写了s
- 第二:declare单词打错,打成了daclare
- 第三:if语句 写完条件后没有写then
- 第四:return lendnum;这里没有加分号
2.创建一函数f_sjzt1,基于书籍表bookinfo:
根据传入参数书籍名称和出版社查询出书籍的状态,如果书籍状态为空,则返回“该书籍不存在”。写出该自定义函数的代码,及调用该函数分别查询出“人民邮电出版社”出版的《数据结构》书籍的状态及“电子工业出版社”出版的《数据结构》书籍的状态。
delimiter // create function f_sjzt1(bname varchar(30),pub?varchar(30)) returns varchar(10) begin declare state varchar(10); select bookstatus into state from bookinfo where bookname=bname and Publisher=pub; ? ? ?if state is null then ? ? ????set state='该书籍不存在'; ?????end if; ?????return state; end // delimiter;
创建成功:
调用函数:
ps:记录一下写这个函数时出现的语法错误
出现的所有问题都是中英文输入分号问题:分号使用不正确,应该是英文分号
;
而不是中文分号;