MySQL数据库之内置函数和自定义函数 function


Posted in MySQL onJune 16, 2022

前言:

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

使用函数:

select 函数名(参数列表);

1、内置函数

1.1、字符串函数

函数名 说明
char_length 判断字符串的字符数
length 判断字符串的字节数,与字符集有关
concat 连接字符串
insrt 检查字符是否在目标字符串中,存在返回其位置,不存在返回 0
lcase 全部小写
ltrim 消除左边的空格
left(str, length) 左侧开始截取字符串,直到指定位置
right(str, length) 右侧开始截取字符串,直到指定位置
mid 从中间指定位置开始截取,如果不指定截取长度,直接到最后
substring(str, index, [length]) 从指定位置开始,指定截取长度
substring_index(str, delim, count) 按照关键字截取

示例:

select char_length('你好中国'); // 4
select length('你好中国'); // 12
select length('hello'); // 5
select char_length('hello'); // 5
select concat('你好', '中国'); // 你好中国
-- 下标从 1 开始
select instr('你好中国', '中国'); // 3
select instr('你好中国', '我'); // 0
select lcase('aBcd'); // abcd
select left('aBcd', 2); // aB
select right('abcdef', 2); // ef
select substring('abcdef', 2, 3); // bcd
select substring('abcdef', -2, 3); // ef
select ltrim(' abc d '); // abc d
select mid('你好中国', 3); // 中国
select substring_index('www.baidu.com', '.', 2); // www.baidu
select substring_index('www.baidu.com', '.', -2); // baidu.com

1.2、时间函数

函数名 说明
now() 返回当前时间,日期 时间
curdate() 当前日期
curtime() 当前时间
datediff() 判断两个日期之间的天数之差,日期使用字符串格式(用引号)
date_add(日期, interval 时间数字 type) 时间增加(type:
unix_timestamp() 获取时间戳
from_unixtime() 将指定时间戳转换成对应的日期时间格式

示例:

select now(); // 2022-04-10 22:05:38
select curdate(); // 2022-04-10
select curtime(); // 22:05:51
select datediff('2022-01-09', '2022-01-01'); // 8
select date_add('2000-10-01', interval 10 day); // 2000-10-11
select unix_timestamp(); // 1649599799
select from_unixtime(1649599799); // 2022-04-10 22:09:59

1.3、数学函数

函数名 说明
abs 绝对值
ceiling 向上取整
floor 向下取整
pow 指数
rand 随机数(0-1)
round 四舍五入

示例:

select abs(-1); // 1
select ceiling(1.1); // 2
select floor(1.9); // 1
select pow(2, 4); // 16
select rand(); // 0.2616088308967732
select round(1.5); // 2

1.4、其他函数

函数名 说明
md5() MD5
version() 版本号
database() 显示当前所在数据库
uuid() 生成一个唯一标识符,全局唯一

示例:

select md5('abc'); // 900150983cd24fb0d6963f7d28e17f72
select version(); // 8.0.16
select database(); // mydatabase
select uuid(); // c44a06a2-b8d8-11ec-a53c-504259f9d746

2、自定义函数

mysql一旦见到分号结束符,就会开始执行

修改语句结束符

基本语法:

delimiter 符号;

2.1、创建函数

基本语法:

-- 修改语句结束符
delimiter $$;
create function 函数名(形参) returns 返回值类型
begin
    // 函数体
    return 返回值数据;
end
语句结束符
-- 将语句结束符修改回来
delimiter ;

示例:

-- 修改语句结束符
delimiter $$
create function my_func1() returns int
begin
    return 10;
end
-- 结束
$$
-- 将语句结束符改回来
delimiter ;

如果只有一条语句,可以省略begin 和 end

-- 最简单的函数
create function foo() returns int
return 10;

为函数的形参指定数据类型

基本语法:

形参 数据类型

示例:

create function my_func2(a int, b int) returns int
return a * b;

2.2、查看函数

基本语法:

show function status [like 'pattern'];

示例:

-- 查看所有函数
show function status\G
-- 查看单个函数
mysql> show function status like 'foo'\G
*************************** 1. row ***************************
                  Db: mydatabase
                Name: foo
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2022-04-10 22:34:06
             Created: 2022-04-10 22:34:06
       Security_type: DEFINER
             Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_general_ci
1 row in set (0.00 sec)
-- 查看函数创建语句
mysql> show create function foo\G
*************************** 1. row ***************************
            Function: foo
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
     Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `foo`() RETURNS int(11)
return 10
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_general_ci
1 row in set (0.01 sec)

2.3、调用函数

基本语法

select 函数名(实参列表);

示例:

mysql> select foo();
+-------+
| foo() |
+-------+
|    10 |
+-------+
mysql> select my_func2(2, 3);
+----------------+
| my_func2(2, 3) |
+----------------+
|              6 |
+----------------+

2.4、删除函数

基本语法

drop function 函数名;

示例:

drop function my_func1;

2.5、注意事项

  • 自定义函数属于用户级别,只有当前客户端对应的数据库中可以使用
  • 可以在不同数据库下看到函数,但是不可以调用
  • 自定义函数通常是为了将多行代码集合到一起解决一个重复性的问题

4.函数必须规范返回值,那么在函数内部不能使用select指令,select一旦执行就会的到一个结果集 result set;

可以使用给变量赋值语句

select 字段 into @变量;

3、函数流程结构案例

需求:

从1开始,直到用户传入的对应的值位置,自动求和,凡是5的倍数都不要

设计:

  • 创建函数
  • 需要一个形参,确定要累加到什么位置
  • 需要定义一个变量来保存对应的结果
  • 内容部需要一个循环来实现迭代累加
  • 循环内部需要进行条件判断控制,5的倍数

定义函数:

-- 创建一个自动求和的函数
-- 修改语句结束符
delimiter $$
-- 创建函数
create function my_sum(end_value int) returns int
begin
    -- 声明局部变量
    declare res int default 0;
    declare i int default 0;
    -- 循环处理
    mywhile: while i <= end_value do
        -- mysql中没有++
        set i = i + 1; 
        --  判断当前数据是否合理
        if i % 5 = 0 then
            iterate mywhile;
        end if;
        -- 修改变量,累加
        set res = res + i;
    end while;
    -- 返回值
    return res;
end

-- 结束
$$
-- 修改语句结束符
delimiter ;

调用函数:

-- 实参个数必须等于形参个数
select my_sum(10);

Tags in this post...

MySQL 相关文章推荐
mysql字符串截取函数小结
Apr 05 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
SQL Server数据库的三种创建方法汇总
May 08 MySQL
MySQL数据库之存储过程 procedure
Jun 16 #MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 #MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 #MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 #MySQL
MySQL聚簇索引和非聚簇索引的区别详情
关于mysql中string和number的转换问题
Jun 14 #MySQL
You might like
晶体管单管来复再生式收音机
2021/03/02 无线电
繁体中文转换为简体中文的PHP函数
2006/10/09 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
对python requests的content和text方法的区别详解
2018/10/11 Python
实例详解Python模块decimal
2019/06/26 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
小学毕业感言300字
2014/02/19 职场文书
525心理活动总结
2014/07/04 职场文书
本科应届生求职信
2014/08/05 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
办公室主任岗位职责
2015/01/31 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server