MySQL自定义函数

一、什么是MYSQL自定义函数?

  mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同。

二、自定义函数应该具备哪些条件?

  我们先来回想一下内置函数是怎么使用的,首先函数一定要有一个名字,还有每个函数后面都有一个小括号,小括号里面写的内容我们称之为参数,当函数正常运行时,往往会得到一个信息,这个信息我们称之为返回值。所以我们可以发现,自定义函数应该具备两个条件:

(1)参数

(2)返回值

  不仅是自定义函数需要这两个条件,我们可以发下系统自定义函数也需要这两个条件,当然参数并不是任何函数必备的条件,比如之前学的那个查看mysql版本的函数VERSION(),他并没有参数,但是有返回值,所以说参数和返回值之间并没有必然的联系。更详细点说,就是可以没有参数,但是会有返回值,当然也可以有两个或多个参数但是只有一个返回值,所以说函数一定有返回值,但是参数就不一定了。

  函数可以返回任意类型的值,同样可以接收这些类型的参数,这句话就说明函数的返回值和参数可以为我们之前所学的任意一种数据类型,那么参数的数目有什么要求呢?在mysql当中,理论上讲,参数的数目不能超过1024个,我想这对于任何的函数都足够了,这就是对参数和返回值的一个简单的说明。

三、自定义函数的语法结构

CREATE FUNCTION function_name

RETURNS

{STRING|INTEGER|REAL|DECIMAL}

routine_body

  那么如果我现在要创建一个函数,就需要通过CREATE FUNCTION 这个语句,后面加上函数名,RETURNS后面跟上返回值类型,routine_body指函数体。

四、关于函数体的几点说明

(1)函数体由合法的SQL语句构成;

(2)函数体可以是简单的SELECT或INSERT语句;

(3)函数体如果为复合结构则使用BEGIN....END语句;

(4)复合结构可以包含声明、循环、控制语句;

五、创建自定义函数

  我们先来改一下编码方式为gbk,我们输入SET NAMES gbk;这里改变只影响我们客户端的编码方式,不影响服务器的编码方式,也就是说如果我在客户端写汉字的话,我们需要gbk,但是写入到数据库中,仍然是我们数据库当中默认的编码方式,因为我们的数据库是存在服务器端的。

  1、我们先来创建一个无参的自定义函数,比如我们前面学过NOW()函数,我们输入SELECT NOW();

  我们发现是这种形式,如果我们现在要改成汉字的形式,就是X年X月X日,类似这种,那么就需要用到DATA_FORMAT()这个函数,比如我们输入SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');

  我们发现就变成了这种形式,如果我要经常使用这个功能,如果每次使用我都这样写,是不是会很麻烦呀,我们可不可以将这个过程封装成一个自定义函数,答案是肯定的,所以我们就可以这样写,我们输入

CREATE FUNCTION f1() RETURNS VARCHAR(30)

RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') ;

  OK,这个函数我们就创建成功了,当我们需要用的时候,我们就调用它,比如我们可以直接输入SELECT f1();

  我们发现也能达到我们想要的结果,很明显这样调用起来就更方便了。这就是简单的给大家演示一个简单的无参的自定义函数。

2、我们也可以自定义有参的自定义函数,假设我们现在写一个可以计算两个数平均值的函数,比如我们输入

CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)

RETURNS FLOAT(10,2) UNSIGNED

RETURN (num1+num2)/2;

  OK,这个函数创建成功,现在我们来调用一下,我们输入SELECT f2();

  我们发现报错,因为我们没有传入参数,那我们就传入俩参数。

  OK。我们发现就计算出来了平均值。当然我们也可以按照这种方式去定义3个参数或更多。

3、下面我们再来定义一个带有多个参数的函数,我们还以test表为例,我们先来看一下test表的结构,我们输入DESC test;

  我们发现只有id和username字段,而且id字段还是自增的,现在我们想通过函数往数据表中插入数据,我们先来看一下表中的数据,我们输入SELECT * FROM test;

  现在我们来定义一个函数来插入数据,我们输入CREATE FUNCTION adduser(username

VARCHAR(20))

RETURNS INT UNSIGNED

RETURN

INSERT test(username) VALUES(username);

  这个时候,系统提示我们错误,为什么会出现这个错误呢?原因很简单,就是我们的分号被认为是mysql命令的结束,因为这里边根本就不存在int类型的返回值,这个时候我们就要通过DELIMITER来修改mysql默认的分隔符,我们输入DELIMITER//这两条斜线是什么意思呢,就是说以后你所有的命令都是通过//来结束的。

  比如我们输入SELECT VERSION();这里我们输入分号就不管用,必须输入//(我们重新指定的两条斜线),这样就可以避免掉我们在上一条命令中再出现分号结束的情况,当然你也可以指定其他的结束符。

  下面我们重新执行上面的命令,比如再加上LAST_INSERT_ID;我们再在后面加上//

  我们发现又报错了,这是为什么呢?因为现在我们有两个语句要返回执行,那么我们就需要加上BEGIN。。。AND,构成一个聚合体,好,我们重新输入,(一二行不变),然后输入BEGIN

INSERT test(username) VALUES(username);

RETURN LAST_INSERT_ID();

END

//

  OK,命令执行成,下面我们来调用我们刚刚自定义的函数,看是否能插入这个字段。

  我们输入SELECT adduser('Hello');

//

  ok,命令执行成功,字段也插入成功,说明这个自定义函数定义成功,下面我们再把这个结束符改为分号,我们输入DELIMITER ;

  OK,我们再来插入一条,我们输入SELECT adduser('Tom');

  OK,插入成功,下面我们来查看一下,SELECT * FROM test;

  我们发现这就是我们想要的结果,OK,这就是最简单的自定义函数,实际上在开发过程中,用到系统内置的函数比较少,所以我们最好掌握一下标准的自定义函数。

六、删除函数

  删除函数的语法结构

DROP FUNCTION [IF EXISTS] function_name

  这个相对比较简单,大家自己练习一下就行。

MySQL自定义函数(四十六)的更多相关文章

  1. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  2. NeHe OpenGL教程 第四十六课:全屏反走样

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  4. 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么

    第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...

  5. mysql 自定义函数

    原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...

  6. 四十六、android中的Bitmap

    四十六.android中的Bitmap: http://www.cnblogs.com/linjiqin/archive/2011/12/28/2304940.html 四十七.实现调用Android ...

  7. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

  8. MySQL 自定义函数CREATE FUNCTION实例

    分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...

  9. “全栈2019”Java第四十六章:继承与字段

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Linux学习总结(10)——Linux查看CPU和内存使用情况

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  2. less01

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. pyspark.mllib.feature module

    Feature Extraction Feature Extraction converts vague features in the raw data into concrete numbers ...

  4. Mysql-in查询问题

    Mysql-in查询问题 标签(空格分隔): mysql 问题:mysql用in语法查询出来的数据少了好多! 我的实际情况: 数据表: content字段记录着一些选项的id,多个选项用逗号隔开,比如 ...

  5. POJ 3671 DP or 乱搞

    思路: 1.DP f[i][j]:前i个数 最后一个数是j的最小花费 f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j));1<=k<=j 这种做法比较有普遍性 ...

  6. Kali linux 2016.2(Rolling)中metasploit的搜集特定网站的目录结构

    不多说,直接上干货! parent directory site: testfire.net 至于这里怎么FQ,很简单,请见我下面的博客! kali 2.0安装 lantern(成功FQ) shado ...

  7. Hadoop 框架基础(四)

    ** Hadoop 框架基础(四) 上一节虽然大概了解了一下 mapreduce,徒手抓了海胆,不对,徒手写了 mapreduce 代码,也运行了出来.但是没有做更深入的理解和探讨. 那么…… 本节目 ...

  8. iOS中关于字符 “&”的作用?

    如NSFileManager中关于判断是否目录的 iOS中关于字符 "&"的作用? >> ios这个答案描述的挺清楚的:http://www.goodpm.ne ...

  9. 《剑指offer》反转链表

    一.题目描述 输入一个链表,反转链表后,输出链表的所有元素. 二.输入描述 输入一个链表 三.输出描述 返回逆转后的链表 四.牛客网提供的框架 /* struct ListNode { int val ...

  10. Debian9.5 系统配置FTP

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application ...