logo头像
Snippet 博客主题

Mysql的函数的创建

本文于 2139 天之前发表,文中内容可能已经过时。

Mysql的函数的创建

一、什么是mysql的自定义函数?

官方解释:A user-defined function (UDF) is a way to extend MySQL with a new function that works like a native (built-in) MySQL function such as ABS() or CONCAT().
翻译:用户自定义函数,英文缩写:(UDF),是一种对于扩展mysql功能的方法,类似于ABS()或者CONCAT()。

二、为什么要学会mysql的自定义函数的创建?

因为我们在项目开发的过程中,总是会遇到各种各样的对于不同的业务而需要对数据进行不同展示和处理的情况,而直接查询保存在数据库中的数据,即使使用了数据库内置的函数,依然不能很好的完成这部分功能,在以前,这一部分的工作往往是交给编程语言在开发的过程中完成的,但其实,在某些情况下,我们可以使用mysql的自定义函数来完成我们对于数据的处理,所以从今天起,我们又将学习一门新的技能。

三、那么如何学习mysql的自定义函数呢?

这一部分我们将会分成三部分进行讲解

  1. mysql自定义函数的结构
  2. 对结构的每一部分进行解释
  3. 学习几个小栗子,进行实战模拟

四、接下来,开始我们的学习

1、函数结构

先看看mysql官方对于mysql函数创建的描述。
在页面的上方你会很方便的看到对于自定义函数结构的展示,就是下面这个样子。

CREATE [AGGREGATE] FUNCTION function_name
    RETURNS {STRING|INTEGER|REAL|DECIMAL}
    SONAME shared_library_name

但是实质上,自定义函数的结构应该是下面这个样子的。

CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...])

  RETURNS {STRING|INTEGER|REAL}

  runtime_body

接下来我们来看一下这个结构中的每项的含义。
a. 中括号[]
在学习编程开发的过程中,在很多文档里边你会看到这个符号,请记住,这个符号的含义是
括号包起来的内容在实际使用中是需要根据实际情况选择使用的。换句话说,就是可以使用,也可以不使用,而[]是不需要写进程序的。谨记!
b. AGGREGATE
这个单词在mysql中,往往是在创建聚合函数的过程中使用到,那么什么是聚合函数?
在mysql中,类似于sum(),count(),max()
等都是聚合函数,这些函数在实际项目开发中的作用很大,建议多储备。关于聚合函数,可以参考博主的另一篇文章关于mysql聚合函数的学习
c.parameter_name
解释:参数名
d.type
解释:参数类型
e.runtime_body
解释:运行代码(函数体)

2、实际上手

注意:所有自定义函数的目的都是为了输出数据,所以每个自定义函数必须规定返回值,函数的参数可有可无,具体按照实际情况而定
需求:(无参函数)需要输出当前日期的年月数据,格式为”yyyy-MM”,类似”2012-12”

CREATE FUNCTION cur_year_month()
RETURNS VARCHAR(20)
RETURN (select DATE_FORMAT(now(),'%Y-%m'));
 
 注:1. 函数无论有无参数函数后面的括号必须存在,
       2.当return后面是一个查询语句时,必须将查询语句放到括号里边,否则会报错。
       3.当函数体存在多条语句时,需使用BEGIN 和 END将函数体包含。
       

附加知识:mysql中format的格式有一下几种:

format样式整理:
        年:  %Y  显示四位 : 2015            %y    只显示后两位  :15
        月:  %M 月份的英文显示:October %m  月份的阿拉伯显示:01-12  %b 月份的英文缩略显示:Oct  %c  月份的阿拉伯显示:1-12
        日:  %d 阿拉伯显示:00-31        %D 带有英文后缀:1st-31th     %e 阿拉伯显示:1-31          %j   年的天:001-366   
        时:  %H :00-23           %h:01-12        %I:01-12      %k:0-23      %l:1-12
        分:   %i:00-59
        秒:   %S:00-59        %s:00-59
        微妙: %f
        AM/PM:%p
        12小时制时间:%r:   02:02:44 PM
        24小时制时间: %T:  14:02:44
         周: %W:周的英文显示      %w 周的阿拉伯显示 :0(星期日)-6(星期六)  %a   周的英文缩略显示:Mon-

需求:(有参函数)需要输出两个数字的商

CREATE FUNCTION shang(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(7,2)
RETURN num1/num2;

注:SMALLINT 数据类型是一种精确数值数据类型,其精度在算术运算后不变。它需要 2 个字节存储。
有符号的 SMALLINT 值的范围是 –2^15(2^15表示2的15次幂) 到2^15 – 1,即 –32768 到 32767。
无符号的 SMALLINT 值范围是 0 到 2^16 – 1,即 0 到 65535。 INT 是4字节数据,取值范围 -2^31 - 2^31,
所以在考虑最大数据范围的前提下,优先使用smallint类型。

UNSIGNED 代表无符号。
所以我们在调用上面的函数时,最大可传的参数是65535,假如我们去掉了UNSIGNED的限制,最大就只能传
–32768 到 32767的数字。
因为我们定义FLOAT的限制为(7,2),表示结果的整数最多为(7-2=5)位,而小数位最多为2位,谨记。

3、删除函数

当我们自定义的函数不再使用的时候,可以使用下面的方式来删除

DROP FUNCTION FUNCTION_NAME

举例:比如我们要删除我们上面创建的函数就可以执行下面这个语句。

DROP FUNCTION  shang

上述为mysql具体创建函数的过程,希望可以看到此篇博文的同学对mysql的函数有一个初步的了解,和学会简单的使用。
加油!