about

MySQL提供了丰富的内置函数自定义函数。

而我们也对这些函数有所了解,比如聚合函数。

本篇再来了解一些内置函数和自定义函数的编写。

写在前面的话:默认情况下,函数名称和其后的括号之间必须没有空格。这有助于MySQL解析器区分函数调用和对与函数名称相同的表或列的引用。但是,函数参数周围可以有空格。

内置函数

字符串相关

SELECT CONCAT('root','@','127.0.0.1');

SELECT CONCAT(USER,'@',HOST) FROM mysql.user; -- 在合适的位置添加分隔符,较为灵活

SELECT CONCAT_WS('@',USER,HOST) FROM mysql.user; -- 第一个参数为分隔符

SELECT USER,GROUP_CONCAT(HOST) FROM mysql.user GROUP BY USER; -- 适用于分组,行转列

SELECT CHAR_LENGTH('ABCD');-- 返回字符串的长度

SELECT CHARACTER_LENGTH('ABCD'); -- 和 CHAR_LENGTH 的同义词

SELECT LOWER('ABCD');-- 以小写形式返回字符串

SELECT UPPER('abcd');-- 以大写形式返回字符串, UPPER 是 UCASE 的同义词

SELECT TRIM(' ABCD '); -- 去除字符串两边的空格

SELECT BIN(12); -- 返回十进制数字的二进制表示

SELECT OCT(12); -- 返回十进制数字的八进制表示

SELECT HEX(12), HEX('ABCD'); -- 返回十进制数字或者字符串的十六进制的表示形式

SELECT UNHEX(HEX('ABCD')); -- 返回被转化为十六进制表示的原始数字或字符串

数值相关

SELECT ABS(123);-- 返回数值的绝对值

SELECT 5 / 2,5 DIV 2; -- 向下整除

SELECT TRUNCATE(1.1234,2),TRUNCATE(-1.1234,2); -- 包括指定位数小数,数值可为负数

SELECT PI();-- 返回6为小数的 Π 值

SELECT SQRT(2); -- 返回参数的平方根

加密相关

先来说AES加密:

-- AES_ENCRYPT:加密函数,第一个参数是需要加密的字符串,第二个参数是key

SELECT AES_ENCRYPT('ABCD', 'KEY'); -- 返回结果为乱码,表的字符集为拉丁或者utf8mb4可解决

SELECT CHAR_LENGTH(AES_ENCRYPT('ABCDE', 'KEY')); -- 加密字符串长度取决于原始字符串的长度

SELECT AES_DECRYPT(AES_ENCRYPT('ABCDE', 'KEY'), 'KEY')

-- AES_DECRYPT:解密函数,第一个参数是AES_ENCRYPT加密后的字符串,第二个参数是key

-- 示例

CREATE TABLE t2(

id INT PRIMARY KEY AUTO_INCREMENT,

USER VARCHAR(32) NOT NULL,

pwd VARCHAR(512) DEFAULT NULL

)ENGINE=INNODB CHARSET=utf8mb4;

-- 由于ASE加密后的字符串长度不定,这里使用 HEX函数强转为16进制字符串

INSERT INTO t2(USER,pwd) VALUE('张开', HEX(AES_ENCRYPT('加密字符串','KEY')));

-- 再通过 UNHEX 函数转换16进制字符串为加密后的字符,再AES_DECRYPT解密

SELECT USER,AES_DECRYPT(UNHEX(pwd),'KEY') AS pwd FROM t2;

再来说MD5和SHA系列:

-- MD5加密

SELECT MD5('ABCD'),CHAR_LENGTH(MD5('ABCD')); -- MD5没啥好说的

-- SHA1

SELECT SHA1('ABCD'),CHAR_LENGTH(SHA1('ABCD')); -- 以40个十六进制数字的字符串形式返回

-- SHA1 是 SHA 的同义词

-- SHA2系列

SELECT SHA2('ABCD', 0),CHAR_LENGTH(SHA2('ABCD',0)); -- 64

SELECT SHA2('ABCD', 224),CHAR_LENGTH(SHA2('ABCD',224)); -- 56

SELECT SHA2('ABCD', 256),CHAR_LENGTH(SHA2('ABCD',256)); -- 64

SELECT SHA2('ABCD', 384),CHAR_LENGTH(SHA2('ABCD',384)); -- 96

SELECT SHA2('ABCD', 512),CHAR_LENGTH(SHA2('ABCD',512)); -- 128

SELECT SHA2('ABCD', 5122),CHAR_LENGTH(SHA2('ABCD',5122)); -- NULL

SHA2函数的第一个参数是需要加密的字符串,第二个参数必须是:

0/256:·0等于256,返回64位加密字符串

224:返回56位加密字符串

384:返回96位加密字符串

512:返回128位加密字符串

如果是其它数值,返回NULL

日期时间相关

SELECT NOW(); -- 返回当前日期时间

SELECT CURRENT_TIME(); -- 返回当前时间

SELECT CURRENT_DATE(); -- 返回当前日期

SELECT UNIX_TIMESTAMP() -- 返回时间戳时间

SELECT DAYOFMONTH(NOW()); -- 返回月份中的一天(0-31)

SELECT DAYOFYEAR(NOW()); -- 返回当前天位于一年中的第多少天

SELECT YEAR(NOW()); -- 提取年

SELECT HOUR(NOW()); -- 提取小时

SELECT DAY(NOW()); -- 提取天

SELECT MINUTE(NOW()); -- 提取分钟

SELECT MONTHNAME(NOW()); -- 返回当前月份

SELECT QUARTER(NOW()); -- 根据日期返回当前位于第几个季度

SELECT LAST_DAY(NOW()), LAST_DAY('2020-09-30'); -- 返回参数的月份的最后一天

SELECT DAYNAME(NOW()); -- 返回工作日的名称

SELECT WEEK(NOW()); -- 返回当前位于一年中位于第几个星期

SELECT WEEKDAY(NOW()); -- 返回工作日索引,0:星期一、1:星期二.....

SELECT WEEKOFYEAR(NOW()); -- 返回日期的日历周,范围是从1到的数字53

再来看日期时间的格式化转换:

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2020-09-17 15:18:53

SELECT DATE_FORMAT(NOW(), '%y-%m-%d %H:%i:%s'); -- 20-09-17 15:19:40

SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -- Sunday October 2009

SELECT DATE_FORMAT('1900-10-04 22:23:00','%D %y %a %d %m %b %j'); -- 4th 00 Thu 04 10 Oct 277

SELECT DATE_FORMAT('1997-10-04 22:23:00','%H %k %I %r %T %S %w'); -- 22 22 10 10:23:00 PM 22:23:00 00 6

SELECT DATE_FORMAT('1999-01-01', '%X %V'); -- 1998 52

SELECT DATE_FORMAT('2006-06-00', '%d'); -- 00

上面是关于日期格式化的常见用法,而时间格式化参考日期格式化即可:

SELECT TIME_FORMAT(NOW(), '%H:%i:%s'); -- 15:18:26

TIME_FORMAT的用法类似于DATE_FORMAT,但是格式字符串可能只包含小时、分钟、秒和微秒的格式说明符。其他说明符生成空值或0。

其他

SELECT UUID(); -- 返回 UUID

SELECT SLEEP(3); -- 睡指定秒数

ISNULL() -- 在查询中,可以用来判断值是否为null

更多MySQL内置函数及用法参考:

自定义函数

除了内置函数,MySQL还支持自定义函数。

创建

-- 创建一个函数,返回两个整数之和

DELIMITER //

CREATE FUNCTION f1(

n1 INT,

n2 INT) -- 创建函数 f1 参数可以是MySQL支持的那些类型

RETURNS INT -- 该函数的返回值也是 int 类型

BEGIN-- 标识函数体开始

DECLARE num INT;-- 定义一个int类型的变量

SET num = n1 + n2;

RETURN(num);

END //-- 标识函数体结束

DELIMITER ;

另外,函数中不能有SELECT语句

执行

SELECT f1(1,1);

-- 在查询中使用

CREATE TABLE t3(

n1 INT NOT NULL DEFAULT 0,

n2 INT NOT NULL DEFAULT 0

)ENGINE=INNODB CHARSET=utf8mb4;

INSERT INTO t3(n1,n2) VALUES(2,3),(3,4);

SELECT n1,n2,f1(n1,n2) AS '两数相加' FROM t3;

+----+----+--------------+

| n1 | n2 | 两数相加 |

+----+----+--------------+

| 2 | 3 | 5 |

| 3 | 4 | 7 |

+----+----+--------------+

2 rows in set (0.01 sec)

修改

ALTER FUNCTION 函数名 选项;

函数的修改只能修改一些如COMMENT的选项,不能修改内部的SQL语句和参数列表,所以直接删了重建就完了。

查看

SHOW FUNCTION STATUS; -- 返回所有自定义函数

SHOW FUNCTION STATUS LIKE 'f%' -- 过滤

SHOW CREATE FUNCTION f1; -- 返回自定义函数的创建信息

SHOW CREATE FUNCTION tt.f1; -- 指定数据库下的自定义函数

删除

无需多说:

DROP FUNCTION f1;

that's all,see also:

mysql function加速_MySQL - 函数(FUNCTION)相关推荐

  1. mysql sysdate 格式化_MySQL函数汇总

    前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...

  2. mysql contains 无效_Mysql函数CONTAINS和GEOMFROMTEXT不起作用

    所以我有这种方法,它包含来自mysql的几何函数: select *,(SELECT SUM(t_o.value) FROM tree_operations t_o WHERE t_o.operati ...

  3. mysql concat 性能_mysql 函数 concat() concat_ws()

    标签(空格分隔): mysql concat concat_ws 1.concat(字段1,字段2,......) 函数的作用:将多个字符串连成一个字符串 select concat(name,age ...

  4. mysql存储加速_mysql存储过程加速

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 首先看一个存储过程,这个存储过程是为了构造数据使用的.当然贴出来的存储过程简化了一些不必要的表结构. CREATE PRO ...

  5. mysql php加速_mysql存储过程加速 - mysql数据库栏目 - 自学php

    首先看一个存储过程,这个存储过程是为了构造数据使用的.当然贴出来的存储过程简化了一些不必要的表结构. CREATE PROCEDURE modifyRootEntry() BEGIN DECLARE ...

  6. mysql 计算工作日_MySQL函数查找两个日期之间的工作日数

    该解决方案使用与Rodger基本相同的方法,除了生成矩阵的方法要复杂得多.注意:此解决方案的此输出与NETWORKDAYS不兼容. 与Rodger的解决方案一样,这可以计算开始日期(@S)和结束日期( ...

  7. MySQL 创建函数(Function)

    目标 如何在MySQL数据库中创建函数(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,参数是可选的 RETU ...

  8. var和function谁先优先执行_变量var声明和函数function声明优先级

    变量声明优先级 使用var关键字和function关键字声明的变量,会被JS的解释器优先解析执行,具有优先级 使用var关键字声明变量 1. 看代码说话 // 在script中直接打印输出变量a co ...

  9. mysql自定义函数的分号_mysql自定义function问题解决

    最近公司生产环境的系统有个需求,需要往mysql数据库的一张表里批量添加数据,业务部门给的数据大致如下: 中心 3.5L箱子(条码) 8L箱子(条码) 15L箱子(条码) 20L箱子(条码) 浙江物流 ...

最新文章

  1. PCL点云库学习笔记 点云的欧式聚类
  2. 小撸 array map 源码
  3. 两种方式实现js, ajax跨域
  4. 程序员过关斩将--你的面向接口编程一定对吗?
  5. BZOJ 3282 Link Cut Tree (LCT)
  6. 社区生鲜招团长,物业优势何以难施展?
  7. 【2019年中总结】五种途径对接天猫精灵音响控制您的智能设备,打破传统产业,让语音AI控制无处不在!
  8. c++ 11/14新特性
  9. 【仿人机器人】双足机器人行走碰撞模型:Passive g walking of a compass robot
  10. golang操作sqlite3
  11. 持续发力Web技术 英特尔驱动万物智能互联
  12. 微信个人号API开发
  13. 算法——实现随机拿到30道不重复的20以内的加减法题目
  14. HTTP和MQTT协议实践
  15. c语言分离个位十位百位_用c语言如何表示出一个数的个位,百位,十位
  16. Err.number错误号和错误说明
  17. 基于Verilog HDL与虚拟实验平台的【计算机组成】与CPU实验第三章:三态门和多路器
  18. C++一行输入多个数字(利用cin和空格)
  19. 刘备和诸葛亮闹翻:无意说出蜀国灭亡的根源?
  20. 【嵌入式04.2】STM32F103C8T6的简易流水灯仿真(寄存器实现+STM32CubeMX实现)

热门文章

  1. C# 使用Linq递归查询数据库遇到的问题及解决方法
  2. 同一DIV内,两个行内块元素不对齐的解决方案
  3. hadoop--Unable to load native-hadoop library for your platform解决方法
  4. HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
  5. 离线数据处理与流数据处理的区别
  6. node.js浅入深出---之fs模块
  7. 监控摄像头使用率不足六成 还需提高维护力
  8. 第二章:搭建Android开发环境(读后感)
  9. 01--swift之基本运算符
  10. webService——学习(3):使用JDK开发webService