16. Mysql 自定义函数

文章目录

    • 概述
    • 常见操作
      • 创建自定义函数
      • 自定义函数局部变量定义和赋值
      • 查看自定义函数
      • 删除自定义函数
      • 使用自定义函数
    • 扩展-流程控制
    • 精选示例
    • 总结
    • 参考资料

概述

自定义函数,顾名思义就是是MySQL中用户自定义的函数,用于执行特定的操作或计算,并返回一个结果。与内置函数不同,自定义函数是根据用户的需求自定义的,可以根据具体的业务需求来编写和调用。

自定义函数具有以下的优势:

  • 提高代码的重用性:通过将一些常用的操作封装成函数,可以在多个地方重复使用,减少了代码的重复编写。
  • 提高代码的可读性:将一些复杂的操作封装成函数,可以使主程序的逻辑更加清晰,易于理解。
  • 提高代码的可维护性:当业务需求变化时,只需要修改函数的实现,而不需要修改调用函数的地方,降低了维护成本。

常见操作

创建自定义函数

基本语法

create function function_name ([parameter datatype[, ...]])returns return_datatype[[not] deterministic]
begin-- 函数的逻辑代码-- 可以包含多条sql语句return result_values
end;

语法解释

  • 第一行create function关键字后是指定的自定义函数名称和可选变量。
  • 第二行为返回值的数据类型,可以是任何Mysql的有效类型。
  • 第三行表示函数是否是确定性的,默认为非确定性。确定性函数是指在给定相同的输入参数时,总是返回相同的结果。
  • 最后begin … end中间为函数的逻辑代码,可包含多条sql语句,直到return 返回值后,才会立即终止存储函数的执行。

自定义函数局部变量定义和赋值

局部变量的定义和赋值,在上一节有提到过,具体可查看:Mysql 变量的使用。

declare <变量名> <变量类型> default <默认值>;
set <变量名>=<>;

查看自定义函数

show function status;-- 查看所有的自定义函数
show create function <自定义函数名>;-- 查看指定自定义函数

删除自定义函数

删除是必修课,在任何一个DDL语句中都必须学习创建和删除,语法如下:

drop function [if exists] <自定义函数名>;

使用自定义函数

使用自定义函数和平时使用的内部函数一样,正常调用就行。

# 自定义加法函数
create function two_add(a int, b int)returns intdeterministic
begindeclare result int;set result = a + b;return result;
end;
# 使用自定义的加法函数
select two_add(3,3);
+--------------+
| two_add(3,3) |
+--------------+
|            6 |
+--------------+
select a, b, two_add(a, b) as c
from (select 2 as a, 3 as bunion allselect 6 as a, 8 as b) as t1;
+---+---+------+
| a | b | c    |
+---+---+------+
| 2 | 3 |    5 |
| 6 | 8 |   14 |
+---+---+------+

扩展-流程控制

当遇到复杂逻辑时,我们需要执行多个 SQL 操作,这时候就要用到流程控制,流程控制语句的作用就是控制存储过程中 SQL 语句的执行顺序。大概分为以下三类:

  • 顺序结构:从上往下依次按照顺序执行。
  • 分支结构:按条件进行选择执行,从两条或多条路径中选择一条执行。
  • 循环结构:满足一定条件下,重复执行一组语句。

常见的语法有条件判断语句、循环语句和跳转语句,注意这些只用于存储过程和存储函数。

分支结构:if 和 case 语句

# if 分支语法
if 表达式1 then 操作1;
[elseif 表达式2 then 操作2;]
...
[else 操作n;]
end if;
# case 分支语法1
case 表达式
when1 then 操作1;
when2 then 操作2;
...
else 操作n
end case;
# case 分支语法2
case
when 条件1 then 操作1;
when 条件2 then 操作2;
...
else 操作n;
end case;

分支结构和select中的有点相似,只不过结尾要加if或者case,并且每一个操作后面都要分号。

循环结构loopwhile repeat 语句

在这里只介绍while的用法,while在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。

# 语法1
while 循环条件do循环体操作语句end while;

跳转语句iterateleave语句

[while_label:] while 循环条件do循环体操作语句iterate while_labelleave while_labelend while;

精选示例

判断一个数是否为偶数

# 定义是否偶数函数,返回布尔值1或0
create function is_even(num int)returns booleandeterministic
begindeclare even boolean;if num % 2 = 0 thenset even = true;elseset even = false;end if;return even;
end;
# 调用
select is_even(6) as a,is_even(13) as b;
+------+------+
| a    | b    |
+------+------+
|    1 |    0 |
+------+------+

自定义等级划分函数

# 定义函数
create function customerlevel(credit decimal(10, 2))returns varchar(20)deterministic
begindeclare level varchar(20);if credit > 50000 thenset level = 'platinum';elseif (credit <= 50000 andcredit >= 10000) thenset level = 'gold';elseif credit < 10000 thenset level = 'silver';end if;return level;
end;
# 调用
select a,customerlevel(a) as b
from
(select floor(rand()*50000)+10000 as a
union all
select floor(rand()*50000)+50000 as a
union all
select floor(rand()*10000) as a) as t1
;
+-------+----------+
| a     | b        |
+-------+----------+
| 53753 | platinum |
| 62311 | platinum |
|  6059 | silver   |
+-------+----------+

随机给娃取名

# 定义
create function generatename()returns varchar(3) charset utf8deterministic
begindeclare frist varchar(2056) default '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';declare last varchar(2056) default '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';declare frist_num int default length(frist) / 3;declare last_num int default length(last) / 3;declare return_str varchar(255) default '';set return_str = concat(return_str, substring(frist, floor(1 + rand() * frist_num), 1));set return_str = concat(return_str, substring(last, floor(1 + rand() * last_num), 1));set return_str = concat(return_str, substring(last, floor(1 + rand() * last_num), 1));return return_str;
end;
# 调用
select generatename();
+----------------+
| generatename() |
+----------------+
| 丁辉寒         |
+----------------+

可以将第一个return_str固定为指定的姓,剩下的两位随机生成,还有如果要生成四位的姓名,可以再加一个 return_str 变量,这样就可以随机给娃取名了。

随机生成手机号

# 定义
create function generatephone()returns char(11) charset utf8deterministic
begindeclare front varchar(100) default '000,156,136,176,183,157,150';declare behind char(10) default '0123456789';declare phone char(11) default substring(front, 1 + (floor((rand() * 6)) * 4), 3); -- 从1开始 4n+1 共6次declare i int default 1;declare len int default length(behind);-- 记录后面号码长度while i <= 8doset i = i + 1;set phone = concat(phone, substring(behind, floor(1 + rand() * len), 1));-- 合并前面取到的号码,根据后面号码一位位取并合并,满足8位后跳出end while;return phone;
end;
# 调用
select generatephone();
+-----------------+
| generatephone() |
+-----------------+
| 15663636107     |
+-----------------+

随机生成指定长度的密码

# 定义
create function generatepwd(n int)returns varchar(255) charset utf8deterministic
begindeclare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789';declare return_str varchar(255) default '';declare i int default 0;while i < ndoset return_str = concat(return_str, substring(chars_str, floor(1 + rand() * 62), 1));set i = i + 1;end while;return return_str;
end;
# 调用
select generatepwd(30);
+--------------------------------+
| generatepwd(30)                |
+--------------------------------+
| podmtwtsrfq5lljmhevmxjwxxzuqgs |
+--------------------------------+
select a,generatepwd(30) as b
from
(select 1 as a
union all
select 2 as a
union all
select 3 as a) as t1;
+---+--------------------------------+
| a | b                              |
+---+--------------------------------+
| 1 | ph16j7rgwvzaw2dnahlnx7qhni3zbq |
| 2 | jrcepatj3taxaooobizz08w0iirbqn |
| 3 | uabfzvmxgjbuzz39rcynaimtwuwipt |
+---+--------------------------------+

从随机生成指定长度的密码函数可见,想要生成单个或者批量都可以信手拈来,比之前使用查询实现的方法(Mysql 生成批量随机密码)简便了许多.

总结

自定义函数是MySQL中的一种强大的功能,可以根据业务需求自定义函数来执行特定的操作或计算。建议多自己操作实践一下,相信你一定会发现他的好处的。

参考资料

  • Mysql 变量的使用:https://blog.csdn.net/weixin_50357986/article/details/135282438
  • MySQL官方文档:https://dev.mysql.com/doc/refman/8.0/en/create-function.html
  • MySQL Tutoria:https://www.mysqltutorial.org/mysql-stored-procedure/mysql-stored-function/
  • Mysql 生成批量随机密码:https://blog.csdn.net/weixin_50357986/article/details/134123708

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目实战--Message Queue

一. 概念篇 我们在学习多线程的时候,学习过生产者-消费者模型,为了实现解耦合和削峰填谷,引入了阻塞队列. 在实际的后端开发中,跨主机之间使用生产者消费者模型,也是非常普遍的需求,因此,阻塞队列会被封装成一个独立的服务器程序,实现更丰富的功能.这样的程序称为"消息队列…

GTK4 环境配置

1 安装gtk4包裹: # sudo yum install gtk4 gtk4-devel gtk4-devel-docs devhelp glib2 glib2-devel glib2-doc 2 安装 glade 4 git clone https://github.com/ag-python/cambalache.git 记住 把软件目录 复制到 一个你不会移动删除的地方(千万别删除这个软件文件夹 因为运行…

面试要点,算法,数据结构等练习大全

有趣的算法&#xff0c;面试常常碰到&#xff0c;多种语言实现~ 1 从数组中找出两个数字使得他们的和是给定的数字 tags: #hash 使用一个散列&#xff0c;存储数字和他对应的索引。然后遍历数组&#xff0c;如果另一半在散列当中&#xff0c;那么返回 这两个数的索引&#x…

Grafana监控数据可视化

Grafana 是一个可视化面板&#xff0c;有着非常漂亮的图表和布局展示&#xff0c;功能齐全的度量仪表盘和图形编辑器&#xff0c;支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源&#xff0c;比 Prometheus 自带的图表展示功能强大太多&am…

LeetCode第69题 - x 的平方根

题目 解答 方案一 class Solution {public int mySqrt(int x) {if (x 0) {return 0;}if (x < 4) {return 1;}for (int i 2, length Math.min(46342, x / 2 2); i < length; i) {int value i * i;if (value x) {return i;}if (value > x || value < 0) {re…

MySQL中常用的数据类型

整型 int 有符号范围: -2147483648 ~ 2147483647 int unsigned 无符号范围: 0 ~ 4294967295 int(5) zerofill 仅用于显示&#xff0c;当不满足5位时&#xff0c;按照左边补0&#xff0c;例如: 00002满足时&#xff0c;正常显示 tinyint[(m)] [unsigned] [zerofill] 有符号&a…

运行时错误‘53’文件未找到:MathPage.WLL,安装MathType后Word不能复制粘贴问题的解决

两步解决&#xff1a; 1. 打开Word-->文件-->选项-->信任中心-->信任中心设置-->受信任位置&#xff0c;解决宏问题 添加如下受信任位置&#xff0c; 我的路径&#xff1a;C:\Program Files\Microsoft Office\root\Office16\STARTUP\ 2. 找到MathType下的MathT…

Unity关于动画混合树(Blend Tree)的使用

在动画与动画的切换过程中&#xff0c;常因为两个动画之间的差距过大&#xff0c;而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起&#xff0c;例如在处理角色的移动中&#xff0c;走动画与跑动画切换的时候&#x…

数据结构算法-穷举搜索算法

引言 穷举搜索是一种基本的搜索策略&#xff0c;其基本思想是逐一检查所有可能的解&#xff0c;直到找到一个有效的解或确定不存在解为止。在现实生活中&#xff0c;穷举搜索的应用非常广泛&#xff0c;以下是一些例子&#xff1a; 密码破解&#xff1a;在密码学中&#xff0…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…

HarmonyOS4.0系统性深入开发09卡片使用动效能力

卡片使用动效能力 ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 名称参数说明限制描述duration动画播放时长限制最长的动效播放时长为1秒&#xff0c;当…

【华为数据之道学习笔记】8-3异常数据监控

质量控制是通过监控质量形成过程&#xff0c;消除全过程中引起不合格或不满意效果的因素&#xff0c;以达到质量要求而采用的各种质量作业技术和活动。要保证最终交付质量&#xff0c;必须对过程进行质量控制&#xff0c;通常是在过程中设置关键质量控制点。例如&#xff0c;可…

Dockerfile学习文档

Dockerfile详解 Dockerfile是一个组合映像命令的文本&#xff1b;可以使用在命令行中调用任何命令&#xff1b;Docker通过dockerfile中的指令自动生成镜像。 通过docker build -t repository:tag ./ 即可构建&#xff0c;要求&#xff1a;./下存在Dockerfile文件 之前我们聊的…

SpringMVC源码解析——DispatcherServlet的逻辑处理

DispatcherServlet类相关的结构图如下&#xff1a; 其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet&#xff0c;实现接口jakarta.servlet.Servlet。我们先看一下jakarta.servlet.Servlet接口的源码如下&#xff1a; /*** 定义所有servlet必须实…

PHP8的JIT(Just-In-Time)编译器是什么?

PHP8的JIT&#xff08;Just-In-Time&#xff09;编译器是什么&#xff1f; PHP8是最新的PHP版本&#xff0c;引入了JIT&#xff08;Just-In-Time&#xff09;编译器&#xff0c;以进一步提高性能和执行速度。 JIT编译器是一种在运行时将解释性语言转化为机器码的技术。在过去…

【网络安全】网络隔离设备

一、网络和终端隔离产品 网络和终端隔离产品分为终端隔离产品和网络隔离产品两大类。终端隔离产品一般指隔离卡或者隔离计算机。网络隔离产品根据产品形态和功能上的不同&#xff0c;该类产品可以分为协议转换产品、网闸和网络单向导入产品三种。 图1为终端隔离产品的一个典型…

2022-2023年度广东省职业院校学生专业技能大赛“软件测试”赛项性能测试题目-Jmeter

性能测试-JM 1、脚本添加: 脚本文件名称:SuppAndComp,测试计划名称:SuppAndComp。测试计划下添加两个线程组: (1)线程组一操作内容:系统管理员登录、进行新增供应商操作。 线程组名称SuppAdd。具体要求如下: 登录操作存放到仅一次控制器中,供应商名称前4位为固定…

dash 中的模式匹配回调函数Pattern-Matching Callbacks 8

模式匹配 模式匹配回调选择器 MATCH、ALL 和 ALLSMALLER 允许您编写可以响应或更新任意或动态数量组件的回调函数。 此示例呈现任意数量的 dcc. Dropdown 元素&#xff0c;并且只要任何 dcc. Dropdown 元素发生更改&#xff0c;就会触发回调。尝试添加几个下拉菜单并选择它们的…

Grafana增加仪表盘

1.Grafana介绍 grafana 是一款采用Go语言编写的开源应用&#xff0c;主要用于大规模指标数据的可视化展现&#xff0c;是网络架构和应用分析中最流行的时序数据展示工具&#xff0c;目前已经支持绝大部分常用的时序数据库。 Grafana下载地址&#xff1a;https://grafana.com/g…