mysql中创建用户自定义函数

总有一些复杂的逻辑我们还需要多处使用,此时就显现出函数的重要性。

mysql函数的要素

  • 函数名
  • 参数列表
  • 函数体
  • 返回值

    定义语法

    create function fun_name(参数列表)
    returns 返回值类型
    函数体

    示例

    不带参数

    delimiter $$
    create function sayhello()
    returns varchar(20)
    begin
    return ‘hello‘;
    end$$
    delimiter ;

    调用示例:
    select sayhello();

sayhello()
hello

带参数(参数需要标明数据类型)

    delimiter $$
    create function sayHelloToSomeOne(name varchar(20))
    returns varchar(25)
    begin
    set @str = concat(‘hello ‘,name);
    return @str;
    end
    $$
    delimiter ;

调用示例:
select sayHelloToSomeOne(‘Dany‘);

sayHelloToSomeOne(‘Dany‘)
hello Dany

函数调用过后我们验证一下@str变量是否依然可以访问。
select @str;

@str
hello Dany

@str依然可用,说明@str的作用域是全局的。

带多个参数

多个参数用逗号 , 分隔。

函数中的局部变量

  1. 参数(勉强认为是局部变量),因为参数传递进来只能在函数内部使用。
  2. declare 定义局部变量
    之前研究过以@开头的变量是全局变量,因为即使是在函数内部定义的变量例如:@aa ,在调用过函数后,@aa的值在外部我们依然可以得到,这就很明显的告诉我们,@aa是全局变量。
    全局变量容易引发变量污染,所以我们需要局部变量,来保证程序独立。declare就是为了解决这一问题。

语法:
DECLARE var_name [, var_name] ... type [DEFAULT value];
例如:

    delimiter $$
    create function sayHelloToSomeOneVarLocal(name varchar(20))
    returns varchar(30)
    begin
    declare str varchar(30);
    set str = concat(‘hello ‘,name);
    return str;
    end
    $$
    delimiter ;

select sayHelloToSomeOneVarLocal(‘xiaogang‘);

sayHelloToSomeOneVarLocal(‘xiaogang‘)
hello xiaogang

函数调用之后我们再试图去访问变量str,会报错。

原文地址:http://blog.51cto.com/7859800/2122245

时间: 2024-10-01 20:59:16

mysql中创建用户自定义函数的相关文章

MySql中创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句.特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗.现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高. 一.MySQL 创建存储过程 "pr_add" 是个简单的

mysql 中创建存储过程

mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表employee为例写一个简单的sql存储过程: 下边通过创建一个存储过程实现:输入性别,找出与输入性别相匹配的人的平均年龄,并将平均年龄输出. 这里首先通过delimiter &&,将sql语句的结束符换成&&(默认sql语句的结束符是;) 然后如下所示输入: 此时可以把语句的结束

Mysql中使用find_in_set函数查找字符串

mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不是非常准确.那就试试mysql中的find_in_set函数吧. SELECT find_in_set('a','a,b,c,d') as test

Mysql中使用聚合函数对null值的处理

平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t是表中一个类型int型的字段,可为null,有三行数据,三行中的数据分别为:10,null,20,请问最后的结果是什么? 我的回答是15,在面试结束之后我尝试了一下结果没错,不过我对于聚集函数对null的处理貌似错了,我认为是聚合函数会将null值看作0,找了一番,博客中都认为是忽略null值,因为

MySQL 中的 FOUND_ROWS() 函数

移植sql server 的存储过程到mysql中,遇到了sql server中的: IF @@ROWCOUNT < 1 对应到mysql中可以使用 FOUND_ROWS() 函数来替换. 1. found_rows() 函数的文档: http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_found-rows 1)found_rows() 的第一种使用情况(带有SQL_CALC_FOUND_ROWS,

Mysql中关于 group_concat函数详解

group_concat()主要功能:能将相同的行组合起来 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 Sql代码   select * from aa; +------+------+| id| name |+------+------+|1 | 10||1 | 20||1 | 20||2 | 20||3 | 200 ||3 | 500 |+------+---

Mysql中常用的函数汇总

Mysql中常用的函数汇总: 一.数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)ceiling(x) 返回大于x的最小整数值exp(x) 返回值e(自然对数的底)的x次方floor(x) 返回小于x的最大整数值greatest(x1,x2,...,xn)返回集合中最大的值least(x1,x2,...,xn) 返回集合中最小的值ln(x) 返回x的自然对数log(x,y)返回x的以y为底的对数mod(x,y) 返回x/y的模(余数)pi(

SQLServer 中实现类似MySQL中的group_concat函数的功能

SQLServer中没有MySQL中的group_concat函数,可以把分组的数据连接在一起. 后在网上查找,找到了可以实现此功能的方法,特此记录下. SELECT a, stuff((SELECT ',' + b FROM #tb WHERE a = t.a FOR xml path('')), 1, 1, '' )AS b from  # tb AS t GROUP BY a; 先对a列进行分组,对分组中的b以Xml形式输出,再使用stuff将开关多出的,删掉. 具体实现参考:http:/

mysql中的group_concat函数的用法

1 本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 2 MySQL中group_concat函数 3 完整的语法如下: 4 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 5 基本查询 6 mysql> select * from aa; 7 +------+------+ 8 | id| name | 9 +-