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. Mean, Median, Mode, Range, and Standard Deviation

    Descriptive statistics tell you about the distribution of data points in data set. The most common m ...

  2. vue-cli解析

    前言 这段时间,算是空出手来写几篇文章了.由于很久都没有时间整理现在所用的东西了,所以,接下来会慢慢整理出一些文档来记录前段时间的工作和生活. 这篇文章的主题是vue-cli的理解.或许,很多人在开发 ...

  3. mysql-汇总(聚集)函数

    我们需要汇总数据而不用把他们实际检索出来,他们主要用来进行分析和报表数据的生成. 1.AVG:通过对表中行数计数并计算特定列值之和,求得该列的平均值.可用来返回所有列的平均值,也可以用来返回特定列或行 ...

  4. Android4.2.2下Stagefright下OMX编解码器组件的控制流

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...

  5. Cube Simulation zoj3429 模拟

    Description Here's a cube whose size of its 3 dimensions are all infinite. Meanwhile, there're 6 pro ...

  6. select多选 multiple的使用

    select多选  multiple的使用 <html> <head> <script type="text/javascript"> func ...

  7. RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

    RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...

  8. sass09

    scss /* 1.使用自定义function和@each实现栅格布局. @function buildLayout($num: 5){ } 结果: col1{width: 20%} col2{wid ...

  9. hdoj--2516--取石子游戏(博弈)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  10. Redis的好处知识

    参考文章 http://www.cnblogs.com/wupeiqi/articles/5132791.html 使用Redis有哪些好处? () 速度快,因为数据存在内存中,类似于HashMap, ...