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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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

测试结果如下图所示:



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
存储 SQL 关系型数据库
MySQL基础:函数
本文介绍了MySQL中几种常用的内建函数,包括字符串函数、数值函数、日期函数和流程函数。字符串函数如`CONCAT()`用于拼接字符串,`TRIM()`用于去除字符串两端的空格,`MOD()`求余数,`RAND()`生成随机数,`ROUND()`四舍五入。日期函数如`CURDATE()`返回当前日期,`NOW()`返回当前日期和时间,`DATE_ADD()`添加时间间隔,`DATEDIFF()`计算日期差。流程函数如`IF()`和`CASE WHEN THEN ELSE END`用于条件判断。聚合函数如`COUNT()`统计行数,`SUM()`求和,`AVG()`求平均值
24 8
MySQL基础:函数
|
12天前
|
JSON 关系型数据库 MySQL
MySQL 8.0常用函数汇总与应用实例
这些函数只是MySQL 8.0提供的众多强大功能的一部分。通过结合使用这些函数,你可以有效地处理各种数据,优化数据库查询,并提高应用程序的性能和效率。
18 3
|
2月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 `RIGHT` 函数
【8月更文挑战第8天】
236 7
在 MySQL 中使用 `RIGHT` 函数
|
2月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
637 7
在 MySQL 中使用 `REPLACE` 函数
|
2月前
|
存储 SQL 关系型数据库
在 MySQL 中使用 `RTRIM` 函数
【8月更文挑战第8天】
142 8
在 MySQL 中使用 `RTRIM` 函数
|
2月前
|
缓存 关系型数据库 MySQL
在 MySQL 中使用 SPACE 函数
【8月更文挑战第5天】
102 3
在 MySQL 中使用 SPACE 函数
|
1月前
|
存储 关系型数据库 MySQL
MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
【9月更文挑战第2天】MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
30 0
|
3月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
228 2
mysql中find_in_set()函数用法详解及增强函数
|
2月前
|
存储 关系型数据库 MySQL
|
2月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
133 0
下一篇
无影云桌面