14 mysql 函数

在mysql中,函数主要分为内置函数(系统函数)和自定义函数
不管是内置函数还是自定义函数,都是使用 select 函数名(参数列表);

字符串函数

char_length():判断字符串的字符数
length():判断字符串的字节数(字符集有关)

SELECT char_length('你好,中国'),length('你好,中国'); -- 返回结果:5 13

concat():连接字符串

SELECT CONCAT('你好','呀','中国');

instr():判断字符在字符串中是否存在,如果存在返回其位置,不存在返回0

SELECT instr('你好中国呀','国'); -- 返回结果:4

lcase():全部小写

SELECT LCASE('HELLO World'); -- 返回结果:hello world

left():从1开始,截取指定长度的字符串

SELECT left('hello world',3);

mid():从中间指定位置截取字符串,如果不指定截取长度,直接截取到最后

SELECT mid('hello world',2);

ltrim():消除左边对应的空格

日期函数

now():返回当前日期时间 yyyy-mm-dd hh:ii:ss

SELECT now();

curdate():返回当前日期 yyyy-mm-dd

SELECT CURDATE();

curtime():返回当前时间 hh:ii:ss

SELECT curtime();

datediff():判断2个日期之间的天数差:参数日期必须使用字符串格式

-- 只返回相差的天数:6
-- 第一个参数 比 第二个参数大
SELECT datediff('2024-07-07 12:20:23','2024-07-01 02:25:32');

date_add():时间的增加

-- 语法
date_add(日期,interval 数字时间 type);
type:day、hour、minute、second

SELECT date_add('2024-07-16 12:12:00',INTERVAL 20 day); -- 返回2024-08-05 12:12:00

unix_timestamp():获取时间戳

SELECT UNIX_TIMESTAMP();

from_unixtime():将指定时间戳转换为时间格式:yyyy-mm-dd hh:ii:ss

SELECT FROM_UNIXTIME(1721100277);

数学函数

abs():绝对值
ceiling():向上取整
floor():向下取整
round():四舍五入
pow():求指数,谁的多少次方
rand():获取0-1之间的随机数

其他函数

md5():对数据进行md5加密(在myqsl中的md5和其他任何地方使用md5加密出来的内容都是一样的)

SELECT MD5('a');

version():获取mysql版本号

SELECT VERSION();

database():获取当前所在数据库

SELECT DATABASE();

uuid():生成唯一标识符,作用和自增长差不多。自增长是单表唯一,uuid是整库唯一。一般不使用

自定义函数

函数:实现某个具体功能的语句块(语句块:多条语句组成)

函数内部的每条指令都是一个独立的个体:需要符合语句定义规范
函数是一个整体,而且函数是在调用的时候才会执行:那么当我们设计函数的时候,就不能中断,但是mysql有个特性就是一旦见到语句结束分号,就会自动执行
解决方案:在定义函数之前,尝试修改临时语句结束符

-- 语法:delimiter
-- 1. 修改临时语句结束符:
delimiter 新符号; -- 一般是使用2个 $$ 符号作为临时结束符
中间为正常的sql指令:可以使用分号结束,但是系统不会执行,因为此时已经修改了语句结束符
-- 2. 使用 新修改的符号结束符 结束
-- 3. 修改回原来的语句结束符
delimiter ;

自定义函数是属于用户级别的,只有当前客户端对应的数据库中可以调用函数使用
可以在不同的数据库下看到对应的函数,但是不可以调用
因为函数必须有规范的返回值,所以函数内部不能将select查询语句的结果返回,但是:select 字段 into @变量 可以使用

创建函数

-- 修改临时语句结束符
delimiter $$
-- 创建函数
-- DEFINER=`root`@`localhost` 加上,不加就报错了
create DEFINER=`root`@`localhost` function 函数名(形参) returns 返回值
begin
   -- 中间是函数体
   函数体
   return 返回值数据; -- 返回的数据类型必须与结构中定义的返回值类型一致
end
-- 语句结束符
$$
-- 再修改回原来的语句结束符
delimiter ;


-- 如果在创建的过程中,报错了,可以尝试将 log_bin_trust_function_creators 设置为 on:
-- og_bin_trust_function_creators是一个全局系统变量,其值为布尔型(0或1),主要影响MySQL对存储函数创建、修改权限的控制以及这些函数在二进制日志记录中的行为,默认是off
show VARIABLES like 'log_bin_trust_function_creators%' -- 查看值
SET GLOBAL log_bin_trust_function_creators=ON; -- 修改值

1. 构建一个返回值是int的无参函数

-- 修改语句结束符
delimiter $$
CREATE DEFINER=`root`@`localhost` FUNCTION stuCount() RETURNS int
BEGIN   
   
   -- 使用declare 定义一个num变量,默认值是0
   declare num int default 0;
   -- 将查询数量出的数值赋值num
   SELECT count(*) into num from student;
   RETURN num;
END
-- 函数结束
$$
-- 修改语句结束符,改回原来的
delimiter ;

SELECT stuCount();

并不是所有的函数都需要begin和end,如果函数体本身就只有一条return指令,可以省略begin和end

create function memo3() returns int 
return 100;

在mysql中,需要为形参指定数据类型,形参可以有多个

-- 语法
变量名 字段类型

查看函数

方式一:通过查看函数状态

show function status [like '匹配模式']

-- 查询 mydb 里面的函数
SHOW FUNCTION STATUS WHERE Db='mydb';

方式二:通过 函数创建语句

show create function 函数名;

-- 查看
show create function stuCount;

调用函数

select 函数名(实参列表);

删除函数

drop function 函数名;

-- 删除函数
drop FUNCTION sum1;
posted @ 2024-07-15 18:11  songxia777  阅读(2)  评论(0编辑  收藏  举报