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 重命名表的操作方法及注意事项
May 21 MySQL
详解MySQL中的主键与事务
May 27 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
解析MySQL索引的作用
Mar 03 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 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
php生成文件
2007/01/15 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
vue使用websocket的方法实例分析
2019/06/22 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
python字典快速保存于读取的方法
2018/03/23 Python
python中返回矩阵的行列方法
2018/04/04 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
社团成立邀请函
2014/01/08 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
社区春季防火方案
2014/06/02 职场文书
农村党员对照检查材料
2014/09/24 职场文书
刑事申诉状范文
2015/05/20 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
Python 制作自动化翻译工具
2021/04/25 Python
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
nginx配置之并发频次限制
2022/04/18 Servers