MySQL - 系统函数和自定义使用详解

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL - 系统函数和自定义使用详解

MySQL 中函数分为两类:系统函数和自定义函数。

【1】系统函数

系统定义好的函数,直接调用即可。任何函数都有返回值,而存储过程无返回值(可以用inout或out型参数带值出来)。

点击查看常用函数(字符串函数)

(http://blog.csdn.net/j080624/article/details/71078067)。


字符串长度示例如下:

length表示字节长度,与charset有关;

char_length表示字符长度,不区分中英,与charset无关;

select LENGTH("中国"),length("zhongguo"),CHAR_LENGTH("中国"),CHAR_LENGTH("zhongguo");

20170629114437599.png

【2】自定义函数

  • 函数,是有返回值;
  • 存储过程无返回值;
  • 函数与存储过程都是属于数据库;
  • 触发器属于表;
  • java中,声明变量[数据类型 变量名] ; MySQL中,声明变量[变量名 数据类型]

【创建语法】

create function 函数名([形参列表]) returns 数据类型
begin
  -- 函数体;
  --返回值:return 类型(指定的数据类型);
end

示例如下:

CREATE FUNCTION fc1(v_age int(11)) returns int(11)
BEGIN
  DECLARE p_count int(11);
  set p_count := 0;
  SELECT COUNT(*) into p_count from p_user where age >v_age;
  RETURN p_count;
END

【函数参数】

和所有程序语言中函数的参数定义方式相似。定义时的参数叫形参,调用时的参数叫实参(MySQL中函数的实参可以是具体指也可以是变量)。

形参必须指定数据类型:参数名,数据类型。

Function 函数名(形参名字,数据类型) returns 数据类型。


【调用函数】

select fc1(10);

【查看函数】

show function status [like pattern];

20170705120820645.png


【查看函数创建语句】

show create function function_name;


示例如下:

show create function fc1;


20170705121331343.png


【删除函数】

DROP FUNCTION function_name;


示例如下:

DROP FUNCTION fc1

【函数与变量】

函数(存储过程)中,可以使用自定义变量(用户变量)。

示例如下:

create function addLoop(v_int int) returns int
begin
  set @i := 1;
  set @res := 0;
  while @i <= v_int do
    set @res := @res + @i;
    set @i := @i +1;
  end while;
  return @res;
end

调用如下:

select addLoop(10),@i,@res;
-- 第一次执行时,@i @res 为null;需要先执行函数,再查看变量值。

说明如下:存储过程或函数中,对用户变量(在函数内部定义)的操作是滞后的。是在存储过程或者函数调用结束后,才会重新将内部修改的值赋值给外部传入的用户变量。

如果测试环境下,用户变量在外部定义传入函数,则第一次同函数一起查询时,显示其值。函数内部定义的用户变量为null。

set @a:=11;
select addLoop2(@a),@a,@res;
select @a,@res;

20170705184030843.png

再次执行查看用户变量操作时,显示其正确值:

这里需要注意用户变量的几个关键词:

会话级别:即当前会话有效,关闭链接失效;与系统变量相对应。

全局变量:在函数外部可以查看;与局部变量对应。

故,谨慎使用用户变量,可以在测试时候使用用户变量监控。

那么什么是局部变量呢?look down…


【函数作用域】

MySQL中的作用域与js中作用域完全一样。

全局变量可以在任何地方使用,局部变量只能在函数内部使用。

全局变量:用户变量,set关键字定义赋值,@符号形式。

局部变量:declare声明,无@符号形式,同样可以使用set关键字赋值。

  • 所有的局部变量必须在函数体开始之前声明。
  • 无论局部还是全局变量,赋值形式都相同,大体分为两类
-- 第一种
set variable := 具体值或者表达式;
-- 第二种
select expr into variable from ...;
or
select expr from ... into variable;

这里:=说明一下,在MySQL中,无 ==比较符号,故=既可用于赋值亦可用于比较。在存储过程或者函数中,为了显示分辨赋值和比较,可使用:=作为赋值明确符号。

当然,你同样可以使用=用于赋值和比较,MySQL会自动鉴别。

全局变量和局部变量示例如下:

create function addLoop2(v_int int) returns int
begin
  declare i int default 1;
  set @res := 0;
  while i <=v_int do
    set @res := @res + i;
    set i = i +1;
  end while;
  return @res;
end

测试如下 :

select addLoop2(10),@res;
不可在函数外部查看declare声明的局部变量。

20170705143409785.png

【函数中迭代循环】

循环在函数中是常见结构,但有时候难免遇到continue情况。MySQL中并没有continue,break关键字。

这是,就需要用到 iterate,leave实现continue,break功能。

示例如下:

create function addLoop2(v_int int) returns int
begin
  declare i int default 1;
  set @res := 0;
    mywhile:while i <=v_int do
      -- 当i 为5的倍数时,跳出该次循环继续下一个循环
      IF i % 5 = 0 THEN
        set i := i+1;
        ITERATE mywhile;
      END IF;
      set @res := @res + i;
      set i := i +1;
    end while;
  return @res;
end

测试结果如下图所示:


上面示例演示的为continue功能,下面演示leave功能:

DROP FUNCTION IF EXISTS addLoop2 ;
create function addLoop2(v_int int) returns int
begin
  declare i int default 1;
  set @res := 0;
    mywhile:while i <=v_int do
      IF i = 10 THEN 
        LEAVE mywhile;
      END IF;
      set @res := @res + i;
      set i := i +1;
    end while [mywhile];
  return @res;
end

测试结果如下图所示:



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
存储 SQL 关系型数据库
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
27 0
|
1天前
|
关系型数据库 MySQL Python
mysql常见函数
mysql常见函数
|
1天前
|
关系型数据库 MySQL 索引
mysql常见函数
mysql常见函数
|
17天前
|
关系型数据库 MySQL
MySQL 函数-3
MySQL 函数-3
12 0
|
17天前
|
关系型数据库 MySQL
MySQL 函数-2
MySQL 函数-2
9 0
|
17天前
|
关系型数据库 MySQL
MySQL 函数-1
MySQL 函数-1
9 0
|
20天前
|
SQL 安全 关系型数据库
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
24 0
|
25天前
|
SQL 机器学习/深度学习 关系型数据库
【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数
【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数
26 0
|
29天前
|
SQL 存储 关系型数据库
MySQL 时间日期函数,流程控制函数,加密解密函数以及聚合查询函数
MySQL 时间日期函数,流程控制函数,加密解密函数以及聚合查询函数
40 0
|
29天前
|
SQL 关系型数据库 MySQL
MySQL 数值函数,字符串函数与多表查询
MySQL 数值函数,字符串函数与多表查询
9 0