前述3篇文章已经分享了Mysql的高级特性:窗口函数、wit通用表达式和json函数,本文将继续分前述3篇文章已经分享了Mysql的高级特性:窗口函数、wit通用表达式和json函数,本文将继续分享高级特性,自定义函数,分三部分呈现:
第一部分,介绍Mysql的自定义函数。
第二部分,实战,解决问题。
第三部分,总结。
一、自定义函数
通常编程语言中的函数是必备技能,不管是面向对象还是面向过程,都离不开函数。Mysql中也有函数功能,常用的是内置函数(built-infunctions),自定义函数功能也要学会,很实用。
1、创建函数
下面2个简单的实例找下整体的定义感觉。
1.1无参函数
1.2有参函数
函数的括号里有参数。
2、声明
函数定义必须声明方式,否则会报错。截取官方文档中的说明:
Whenyoucreateastoredfunction,youmustdeclareeitherthatitisdeterministicorthatitdoesnotmodifydata.Otherwise,itmaybeunsafefordatarecoveryorreplication.Bydefault,foraCREATEFUNCTIONstatementtobeaccepted,atleastoneofDETERMINISTIC,NOSQL,orREADSSQLDATAmustbespecifiedexplicitly.Otherwiseanerroroccurs:
ERROR(HY):ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAinitsdeclarationandbinaryloggingisenabled(you*might*wanttousethelesssafelog_bin_trust_function_creatorsvariable)
3、复杂函数体
在函数体body中,可以实现复杂的逻辑,这样就把很多不断重复做的查询统计预先定义好,直接调用函数即可。
函数体中的语法更丰富,相当于就是编程语言,有控制、逻辑、分析、流程、变量等。之前分享的语法也可以运用中body中。
3、函数的增删改查
数据表通常说增删改查,函数也有这个说法,谁让是自定义的呢,不让改和删还了得。
3.1增
在上面已经呈现。
3.2查列表
3.3查定义
3.4删
3.3改
官方文档显示,不允许修改,所以只能先删再建。
Forstoredproceduresandfunctionsandfortriggers,youmustdroptheobjectandre-createittoassignadifferentDEFINERaccount.
查到原来定义,修改好,删掉原来的函数,再执行新增修改后的函数。
二、实战
1、类数组转为json数组
继续之前案例,这样就方便很多了。在同一个分析主题内,f_json()函数会让sql清爽许多。
2、计算字符中匹配字符的个数
这也是此前案例中用到的场景,补充了字符函数的缺失功能——字符计数。
三、总结
(1)函数,把复杂的逻辑封装起来,直接调用,会使sql看起来清爽许多。
(2)笔者,常常唠叨的就是,重复操作的一定要封装为函数(不过用的R语言,后续也有R专栏)。
(3)使用自定义函数,就不得不提存储过程。