mysql function加速_MySQL - 函数(FUNCTION)
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)相关推荐
- mysql sysdate 格式化_MySQL函数汇总
前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...
- mysql contains 无效_Mysql函数CONTAINS和GEOMFROMTEXT不起作用
所以我有这种方法,它包含来自mysql的几何函数: select *,(SELECT SUM(t_o.value) FROM tree_operations t_o WHERE t_o.operati ...
- mysql concat 性能_mysql 函数 concat() concat_ws()
标签(空格分隔): mysql concat concat_ws 1.concat(字段1,字段2,......) 函数的作用:将多个字符串连成一个字符串 select concat(name,age ...
- mysql存储加速_mysql存储过程加速
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 首先看一个存储过程,这个存储过程是为了构造数据使用的.当然贴出来的存储过程简化了一些不必要的表结构. CREATE PRO ...
- mysql php加速_mysql存储过程加速 - mysql数据库栏目 - 自学php
首先看一个存储过程,这个存储过程是为了构造数据使用的.当然贴出来的存储过程简化了一些不必要的表结构. CREATE PROCEDURE modifyRootEntry() BEGIN DECLARE ...
- mysql 计算工作日_MySQL函数查找两个日期之间的工作日数
该解决方案使用与Rodger基本相同的方法,除了生成矩阵的方法要复杂得多.注意:此解决方案的此输出与NETWORKDAYS不兼容. 与Rodger的解决方案一样,这可以计算开始日期(@S)和结束日期( ...
- MySQL 创建函数(Function)
目标 如何在MySQL数据库中创建函数(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,参数是可选的 RETU ...
- var和function谁先优先执行_变量var声明和函数function声明优先级
变量声明优先级 使用var关键字和function关键字声明的变量,会被JS的解释器优先解析执行,具有优先级 使用var关键字声明变量 1. 看代码说话 // 在script中直接打印输出变量a co ...
- mysql自定义函数的分号_mysql自定义function问题解决
最近公司生产环境的系统有个需求,需要往mysql数据库的一张表里批量添加数据,业务部门给的数据大致如下: 中心 3.5L箱子(条码) 8L箱子(条码) 15L箱子(条码) 20L箱子(条码) 浙江物流 ...
最新文章
- PCL点云库学习笔记 点云的欧式聚类
- 小撸 array map 源码
- 两种方式实现js, ajax跨域
- 程序员过关斩将--你的面向接口编程一定对吗?
- BZOJ 3282 Link Cut Tree (LCT)
- 社区生鲜招团长,物业优势何以难施展?
- 【2019年中总结】五种途径对接天猫精灵音响控制您的智能设备,打破传统产业,让语音AI控制无处不在!
- c++ 11/14新特性
- 【仿人机器人】双足机器人行走碰撞模型:Passive g walking of a compass robot
- golang操作sqlite3
- 持续发力Web技术 英特尔驱动万物智能互联
- 微信个人号API开发
- 算法——实现随机拿到30道不重复的20以内的加减法题目
- HTTP和MQTT协议实践
- c语言分离个位十位百位_用c语言如何表示出一个数的个位,百位,十位
- Err.number错误号和错误说明
- 基于Verilog HDL与虚拟实验平台的【计算机组成】与CPU实验第三章:三态门和多路器
- C++一行输入多个数字(利用cin和空格)
- 刘备和诸葛亮闹翻:无意说出蜀国灭亡的根源?
- 【嵌入式04.2】STM32F103C8T6的简易流水灯仿真(寄存器实现+STM32CubeMX实现)
热门文章
- C# 使用Linq递归查询数据库遇到的问题及解决方法
- 同一DIV内,两个行内块元素不对齐的解决方案
- hadoop--Unable to load native-hadoop library for your platform解决方法
- HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
- 离线数据处理与流数据处理的区别
- node.js浅入深出---之fs模块
- 监控摄像头使用率不足六成 还需提高维护力
- 第二章:搭建Android开发环境(读后感)
- 01--swift之基本运算符
- webService——学习(3):使用JDK开发webService