上一篇:sql拆分文本为数组,实际案例带你2分钟学会
前述3篇文章已经分享了Mysql的高级特性:窗口函数、wit通用表达式和json函数,本文将继续分享高级特性,自定义函数,分三部分呈现:
第一部分,介绍Mysql的自定义函数。
第二部分,实战,解决问题。
第三部分,总结。
一、自定义函数通常编程语言中的函数是必备技能,不管是面向对象还是面向过程,都离不开函数。Mysql中也有函数功能,常用的是内置函数(built-in functions),自定义函数功能也要学会,很实用。
1、创建函数
下面2个简单的实例找下整体的定义感觉。
1.1 无参函数
1.2 有参函数
函数的括号里有参数。
2、声明
函数定义必须声明方式,否则会报错。截取官方文档中的说明:
When you create a stored function, you must declare either that it is deterministic or that it does not modify data. Otherwise, it may be unsafe for data recovery or replication. By default, for a CREATE FUNCTION statement to be accepted, at least one of DETERMINISTIC, NO sql, or READS SQL DATA must be specified explicitly. Otherwise an error occurs: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
3、复杂函数体
在函数体body中,可以实现复杂的逻辑,这样就把很多不断重复做的查询统计预先定义好,直接调用函数即可。
函数体中的语法更丰富,相当于就是编程语言,有控制、逻辑、分析、流程、变量等。之前分享的语法也可以运用到body中。
3、函数的增删改查
数据表通常说增删改查,函数也有这个说法,谁让是自定义的呢,不让改和删还了得。
3.1 增
在上面已经呈现。
3.2 查列表
3.3 查定义
3.4 删
3.3 改
官方文档显示,不允许修改,所以只能先删再建。
For stored procedures and functions and for triggers, you must drop the object and re-create it to assign a different DEFINER account.
查到原来定义,修改好,删掉原来的函数,再执行新增修改后的函数。
二、实战1、类数组转为json数组
继续之前案例,这样就方便很多了。在同一个分析主题内,f_json()函数会让sql清爽许多。
2、计算字符中匹配字符的个数
这也是此前案例中用到的场景,补充了字符函数的缺失功能——字符计数。
三、总结
(1)函数,把复杂的逻辑封装起来,直接调用,会使sql看起来清爽许多。
(2)笔者,常常唠叨的就是,重复操作的一定要封装为函数(不过用的R语言,后续也有R专栏)。
(3)使用自定义函数,就不得不提存储过程。关注后续文章。
上一篇:sql拆分文本为数组,实际案例带你2分钟学会
,