上一篇:sql拆分文本为数组,实际案例带你2分钟学会


前述3篇文章已经分享了Mysql的高级特性:窗口函数、wit通用表达式和json函数,本文将继续分享高级特性,自定义函数,分三部分呈现:

第一部分,介绍Mysql的自定义函数。

第二部分,实战,解决问题。

第三部分,总结。

一、自定义函数

通常编程语言中的函数是必备技能,不管是面向对象还是面向过程,都离不开函数。Mysql中也有函数功能,常用的是内置函数(built-in functions),自定义函数功能也要学会,很实用。

1、创建函数

下面2个简单的实例找下整体的定义感觉。

1.1 无参函数

mysqlsql语句会超长吗(Mysql高级特性函数)(1)

1.2 有参函数

函数的括号里有参数。

mysqlsql语句会超长吗(Mysql高级特性函数)(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)

mysqlsql语句会超长吗(Mysql高级特性函数)(3)

mysqlsql语句会超长吗(Mysql高级特性函数)(4)

3、复杂函数体

在函数体body中,可以实现复杂的逻辑,这样就把很多不断重复做的查询统计预先定义好,直接调用函数即可。

函数体中的语法更丰富,相当于就是编程语言,有控制、逻辑、分析、流程、变量等。之前分享的语法也可以运用到body中。

mysqlsql语句会超长吗(Mysql高级特性函数)(5)

3、函数的增删改查

数据表通常说增删改查,函数也有这个说法,谁让是自定义的呢,不让改和删还了得。

3.1 增

在上面已经呈现。

3.2 查列表

mysqlsql语句会超长吗(Mysql高级特性函数)(6)

3.3 查定义

mysqlsql语句会超长吗(Mysql高级特性函数)(7)

3.4 删

mysqlsql语句会超长吗(Mysql高级特性函数)(8)

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清爽许多。

mysqlsql语句会超长吗(Mysql高级特性函数)(9)

2、计算字符中匹配字符的个数

这也是此前案例中用到的场景,补充了字符函数的缺失功能——字符计数。

mysqlsql语句会超长吗(Mysql高级特性函数)(10)

三、总结

(1)函数,把复杂的逻辑封装起来,直接调用,会使sql看起来清爽许多。

(2)笔者,常常唠叨的就是,重复操作的一定要封装为函数(不过用的R语言,后续也有R专栏)。

(3)使用自定义函数,就不得不提存储过程。关注后续文章。


上一篇:sql拆分文本为数组,实际案例带你2分钟学会

,