SQL 函数 function 讲解+代码实例
文章目录
- 1. 对存储程序的说明
- 2. 创建函数 create function
- 3. 调用函数 select
- 4. 查看函数
- 4.1. 查看函数状态 show status
- 4.2. 查看函数定义 show create
- 4.3. 查看全部函数信息 information_schema.Routines
- 5. 修改函数 alter function
- 6. 删除函数 drop function
1. 对存储程序的说明
与应用程序(Java或者.NET或者PHP等应用程序)相比,存储程序可维护性高,更新存储程序通常比更改、测试以及重新部署应用程序需要更少的时间和精力。使用存储程序与使用大量离散的SQL语句写出的应用程序相比,更易于代码优化、重用和维护。
不过这并不意味着可以将所有的业务逻辑代码全部封装成存储程序,把业务处理的所有负担全部压在数据库服务器上。事实上数据库服务器的核心任务是存储数据,保证数据的安全性、完整性以及一致性,如果数据库承担了过多业务逻辑方面的工作,势必会对数据库服务器的性能造成负面影响。
对于简单的业务逻辑,在不影响数据库性能的前提下,为了节省网络资源,可以将业务逻辑封装成存储程序。
对于较为复杂的业务逻辑,建议使用高级语言(Java或者.NET或者PHP等)实现,让应用服务器(例如Apache、 IIS等) 承担更多的业务逻辑,保持负载均衡。
最后,无论初学者还是有经验的数据库开发人员,都应该对自己开发的存储程序进行严格的测试,并尽量保存测试步骤、测试数据以及测试结果。
2. 创建函数 create function
创建函数的语法如下:
create [definer = {user|current_user}] function [函数名](参数列表)
returns [返回值类型] [函数特性]
begin[SQL代码]
end-- definer 用于指定存储过程由哪个用户定义,默认是当前用户,注意不是指定存储过程的使用权限
-- [参数列表],参数列表只支持in类型的参数,因此写参数时不需要写in,因为默认就是in
-- [函数特征] 特征是存储过程的属性,它包括了如下几个可选特征
-- -- -- comment '' 注释信息,例如:commet '这是一个存储过程'
-- -- -- language sql 指定存储过程使用的语言为sql
-- -- -- [not] deterministic 是否指定一个输入仅对应一个输出(映射),包含下面2个可选参数
-- -- -- -- -- not deterministic(默认),表示不指定映射关系;
-- -- -- -- -- deterministic,表示指定映射关系
-- -- -- [contains sql | no sql | reads sql data | modifies sql data] 明确子程序对数据的操作,包含下面4个可选参数
-- -- -- -- -- contains sql(默认),表示子程序不包含读或者写数据的语句
-- -- -- -- -- no sql,表示子程序不包含sql
-- -- -- -- -- reads sql data,表示子程序包含读数据的语句,但是不包含写数据的语句
-- -- -- -- -- modifies sql data,表示子程序包含写数据的语句
-- -- -- sql security [definer|invoker] 指定调用权限,包含下面两个可选参数
-- -- -- -- -- sql security definer(默认),使用创建者权限调用存储过程,不受限制
-- -- -- -- -- sql security invoker,使用调用者权限调用存储过程,只有被赋予权限的调用者才能调用
例如:
create function test(id int, user_name varchar(20))returns int(5)deterministic
beginif user_name='111' thenreturn 1;else return 0;end if;
end
3. 调用函数 select
自定义函数的调用十分简单,和sql内置函数一样的使用方法,就是直接select就行
例如:
-- 定义函数
create function test(id int, user_name varchar(20))returns int(5)deterministic
beginif user_name='111' thenreturn 1;else return 0;end if;
end-- 调用函数
select test(1, '111');
4. 查看函数
4.1. 查看函数状态 show status
查看函数状态的语法如下:
show function status like '[函数名]';
例如:
show function status like 'test';
结果样例如下表所示:
Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
---|---|---|---|---|---|---|---|---|---|---|
sql7 | test | FUNCTION | root@localhost | 2020/4/20 16:19 | 2020/4/20 16:19 | DEFINER | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
4.2. 查看函数定义 show create
查看函数定义的语法如下:
show create function [函数名];
例如:
show create function test;
结果样例如下表所示:
Function | sql_mode | Create Function | character_set_client | collation_connection | Database Collation |
---|---|---|---|---|---|
test | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
CREATE DEFINER=`root@ localhostFUNCTION test`(id int, user_name varchar(20)) RETURNS int(5)DETERMINISTICbeginif user_name=‘111’ thenreturn 1;else return 0;end if;end
|
utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
4.3. 查看全部函数信息 information_schema.Routines
同存储过程一样,MySQL中函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。
例如:
select * from information_schema.routines
where routine_name='test5';
结果如下表所示:
ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME | COLLATION_NAME | DTD_IDENTIFIER | ROUTINE_BODY | ROUTINE_DEFINITION | EXTERNAL_NAME | EXTERNAL_LANGUAGE | PARAMETER_STYLE | IS_DETERMINISTIC | SQL_DATA_ACCESS | SQL_PATH | SECURITY_TYPE | CREATED | LAST_ALTERED | SQL_MODE | ROUTINE_COMMENT | DEFINER | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sqlcourse4 | test | PROCEDURE | SQL | SQL | SQL | NO | CONTAINS SQL | DEFINER | 2020/4/8 15:42 | 2020/4/8 15:42 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | root@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci | ||||||||||||||
sqlcourse7 | test | FUNCTION | int | 10 | 0 | int(5) | SQL | SQL | SQL | YES | CONTAINS SQL | DEFINER | 2020/4/20 16:19 | 2020/4/20 16:19 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | root@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
5. 修改函数 alter function
修改函数的特性可以使用alter function关键字,语法如下:
alter function [函数名] [特性];
例如:
-- 修改函数test,使它可以写数据(modifies sql data)
alter function test modifies sql data;
6. 删除函数 drop function
删除函数可以使用drop function关键字,语法如下:
drop function [if exists] [函数名]
例如有一个函数test,则要删除它,可以写成:
-- 如果函数test存在,则删除它
drop procedure if exists test;
存储过程和函数的博客分为三章,链接分别为:
- SQL 存储过程 procedure 讲解+代码实例
- SQL 函数 function 讲解+代码实例
- SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例
SQL 函数 function 讲解+代码实例相关推荐
- SQL 存储过程 procedure 讲解+代码实例
文章目录 1. 存储过程概述 2. 创建存储过程 create procedure 2.1. 参数 in.out.inout 3. 调用存储过程 call 4. 查看存储过程 4.1. 查看存储过程的 ...
- python list join函数_Python中join()函数多种操作代码实例
这篇文章主要介绍了Python中join()函数多种操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python中有.join()和os ...
- python返回值return用法_Python中return函数返回值代码实例用法
本篇文章小编给大家分享一下Python中return函数返回值代码实例用法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. return 添加返回值 r ...
- oracle查视图的sql,oracle通过v$sql视图查询sql的平均执行时间(代码实例)
oracle通过v$sql视图查询sql的平均执行时间(代码实例) select sql_text,executions 总执行次数,elapsed_time/1000 总耗时(秒), elapsed ...
- php中的ltrim,PHP中ltrim()函数的用法与实例讲解
PHP中ltrim()函数的用法与实例讲解 PHP ltrim() 函数 实例 移除字符串左侧的字符: $str = "Hello World!"; echo $str . &qu ...
- 粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 ...
- 使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码
使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码 Oracle数据库系统自带的PL/SQL对象(包,存储过程,函数等)的代码绝大部分都是使用了wrap程序加 ...
- 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解...
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...
- php hincrby,Thinkphp5+Redis实现商品秒杀代码实例讲解
这篇文章主要介绍了Thinkphp5+Redis实现商品秒杀代码实例讲解,代码和步骤讲解的很清楚,有需要的同学可以借鉴参考下: 环境:wamp,redis 要求:安装WAMP,Redis,以及为PHP ...
最新文章
- [译]ChipMunk 教程1 - 设置
- mfc编程消息机制中消息汇总
- 找出最具竞争力的子序列_力扣300——最长上升子序列
- 操作系统基础:进程知识笔记(二)
- Java番外篇2——jdk8新特性
- 海报合成_新年元旦创意合成设计之跨年海报!这组海报我打99分!
- 地球物理模型-薄互层-桔灯勘探
- Phonegap集成angular/bootstrap/animate.css教程
- The peopleware papers
- 数百万的 Android 手机预装了危险的恶意软件!
- 文件流的使用以及序列化和反序列化的方法使用
- jenkins war包_Jenkins 集成postman 自动化运行接口测试用例
- android测试tf卡读写速度,手机TF卡速度的研究经验sandisk/金士顿 C2,C4,C6测速软件测速图数据...
- 计算机硬件大型作业报告,计算机硬件技术大作业报告 (2).doc
- 番红-固绿染色(植物)
- 弱加密算法有哪几种_不安全的加密算法有哪几种
- weblogic修改密码
- Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB
- Gitlab的介绍及使用
- 操作系统概念(九)——虚拟内存