@[MySql函数]
MySQL函数,是一种控制流程函数,属于数据库用语言。
接下来,将从以下几个方面,分别介绍和讲解每个函数的用法
字符串函数 | 时间函数 | 流程控制函数 |
---|---|---|
数学函数 | 聚合函数 | 加密函数 |
信息函数 | 搜索函数 | 其他函数 |
ASCII():返回值为字符串 str 的最左字符的数值。假如 str 为空字符串,则返回值为 0 。假如 str 为 NULL ,则返回值为 NULL 。 ASCII() 用于带有从 0 到 255 的数值的字符
SELECT ASCII('A'); //结果65
SELECT ASCII('a'); //结果97
SELECT ASCII(''); //结果0
SELECT ASCII(null); //结果null
CONV(N, from_base, to_base)
不同数基间转换数字。 返回值为数字的 N 字符串表示,由 from_base 基转化为 to_base 基。如有任意一个参数为 NULL ,则返回值为 NULL。
自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为 2 ,而最大基数则为 36 。
If to_base 是一个负数,则 N 被看作一个带符号数。否则, N 被看作无符号数。
SELECT CONV(15,10,2); //结果1111
SELECT CONV(15,10,8); //结果17
SELECT CONV(15,10,16); //结果 F
SELECT CONV(1111,2,8); //结果17
SELECT CONV(1111,2,10); //结果15
SELECT CONV(1111,2,16); //结果F
注:只有当to_base为负数,N才会被理解为一个带符号的数
SELECT CONV(3,10,-2); //结果11
SELECT CONV(-7,10,-2); //结果-111
BIN(N):返回值为 N 的二进制值的字符串表示,,其中 N 为一个 longlong (BIGINT) 数字。这等同于 CONV(N ,10,2) 。 假如 N 为 NULL ,则返回值为 NULL 。
SELECT BIN(15); //结果1111
SELECT BIN(0); //结果0
SELECT BIN(null); //结果null
CONCAT(str1 ,str2 ,…)
1.返回结果为连接参数产生的字符串。
2.如有任何一个参数为 NULL ,则返回值为 NULL 。
3. 只有所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
SELECT CONCAT('Good',' Morning',' !'); //Good Morning !
SELECT CONCAT('Nice',' to',' meet',' you'); //Nice to meet you
SELECT CONCAT('大','家','好'); //大家好
SELECT CONCAT('大',null,'家','好'); //null
CONCAT_WS(separator ,str1 ,str2 ,…)
CONCAT_WS() 代表 CONCAT With Separator ,是 CONCAT() 的特殊形式。
第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。
分隔符可以是一个字符串,也可以是其它参数。
如果分隔符为 NULL ,则结果为 NULL 。
函数会忽略任何分隔符参数后的 NULL 值。
SELECT CONCAT_WS('-','1999','9','9'); //1999-9-9
SELECT CONCAT_WS('-','1999','9',null); //1999-9
SELECT CONCAT_WS(null,'1999','9','9'); //null
LENGTH(str)
返回值为字符串 str 的长度,单位为字节。一个多字节字符算作多字节。这意味着 对于一个包含 5 个 3 字节字符的字符串, LENGTH() 的返回值为 15, 而 CHAR_LENGTH() 的返回值则为5 。
SELECT LENGTH('12345'); //5
SELECT LENGTH('你好陌生人'); //15(本人编码格式utf-8)
SELECT LENGTH('大家好'); //9
SELECT LENGTH(''); //0
SELECT LENGTH(null); //null
LOCATE(substr ,str )
第一个语法返回字符串 str 中子字符串substr 的第一个出现位置。第二个语法返回字符串 str 中子字符串substr 的第一个出现位置, 起始位置在pos 。如若substr 不在str 中,则返回值为0 。
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。这和LOCATE() 的双参数形式相同,参数的顺序被颠倒。
SELECT LOCATE('de','abcdefg'); //4
SELECT LOCATE('dd','abcdefg'); //0
SELECT INSTR('abcdefg','de'); //4
SELECT INSTR('abcdefg','dd'); //0
注:经测试 任何一个地方为null,则结果为null
SELECT LOCATE('de',null);
SELECT LOCATE(null,'abcdefg');
SELECT INSTR(null,'de');
SELECT INSTR('abcdefg',null);
LEFT(str,number):
返回从字符串str 开始的number最左字符
RIGHT(str ,number )
从字符串str 开始,返回最右number字符。
SELECT LEFT('123456789',4); //1234
SELECT RIGHT('123456789',4); //6789
SELECT RIGHT(null,4); //null
SUBSTRING(str ,pos )
SUBSTRING(str FROM pos )
SUBSTRING(str ,pos ,len )
SUBSTRING(str FROM pos FOR len )
不带有len 参数的格式从字符串str 返回一个子字符串,起始于位置 pos 。
使用 FROM 的格式为标准 SQL 语法。也可能对pos 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。
带有len 参数的格式从字符串str 返回一个长度是len 字符长度的子字符串,起始于位置 pos 。
SELECT SUBSTRING('abcdefg',4); //defg
SELECT SUBSTRING('abcdefg' FROM 4); //defg
SELECT SUBSTRING('abcdefg',4,2); //de
SELECT SUBSTRING('abcdefg' FROM 4 FOR 2); //de
SELECT SUBSTRING('abcdefg',4,10); //defg
SELECT SUBSTRING('abcdefg',8,2); //空字符串
TRIM(str)
TRIM([{BOTH | LEADING | TRAILING} [remstr ] FROM] str ) TRIM(remstr FROM] str )
返回字符串 str , 其中所有remstr 前缀和/ 或后缀都已被删除,remstr 为可选项,在未指定情况下,可删除空格
分类符BOTH 、LEADING 或TRAILING 中没有一个是给定的, 则假设为BOTH 。
SELECT TRIM(' sdaf '); //结果sdaf 删除两侧空格
SELECT LTRIM(' sdaf '); //结果sdaf 删除左侧空格
SELECT RTRIM(' sdaf '); //结果 sdaf 删除右侧空格
SELECT TRIM('abc' FROM 'abcdfdfdfabc'); //结果dfdfdf 删除两侧abc
SELECT TRIM(BOTH 'abc' FROM 'abcdfdfdfabc'); //结果dfdfdf 删除两侧abc
SELECT TRIM(LEADING 'abc' FROM 'abcdfdfdfabc'); //结果dfdfdfabc 删除左侧abc
SELECT TRIM(TRAILING 'abc' FROM 'abcdfdfdfabc'); //结果abcdfdfdf 删除右侧abc
LOWER(str) / LCASE(str)
返回字符串 str 以及所有根据最新的字符集映射表变为小写字母的字符
UPPER(str) / UCASE(str)
返回字符串 str , 以及根据最新字符集映射转化为大写字母的字符
SELECT LOWER('ABC'); //abc
SELECT LCASE('ABC'); //abc
SELECT UPPER('abc'); //ABC
SELECT UCASE('abc'); //ABC
REPLACE(str ,from_str ,to_str )
返回字符串str 以及所有被字符串to_str 替代的字符串from_str 。
SELECT REPLACE('abababcabc','abc','M'); //ababMM
REPEAT(str,count)
返回一个由重复的字符串str 组成的字符串,字符串str 的数目等于count 。 若 count <= 0, 则返回一个空字符串。若str 或 count 为 NULL ,则返回 NULL 。
SELECT REPEAT('ab',5); //ababababab
SELECT REPEAT('ab',-1); //空字符串
SELECT REPEAT('',5); //空字符串
SELECT REPEAT(null,5); //null
REVERSE(str )
返回字符串 str ,顺序和字符顺序相反。
SELECT REVERSE('abc'); //cba
SELECT REVERSE('你好'); //好你
SELECT REVERSE(''); //空字符串
SELECT REVERSE(null); //null
HEX(N_or_S )
如果N_OR_S 是一个数字,则返回一个 十六进制值 N 的 字符串表示, N 是一个longlong (BIGINT) 数。这相当于 CONV(N,10,16) 。
如果N_OR_S 是一个字符串,则返回值为一个N_OR_S 的十六进制字符串表示,其中每个N_OR_S 里的每个字符被转化为两个十六进制数字。
UNHEX(str)
执行从 HEX(str) 的反向操作。结果字符以二进制字符串的形式返回。
SELECT HEX(17); //11
SELECT HEX('你好'); //17
SELECT UNHEX(HEX('你好')); //你好
ADDDATE(date ,INTERVAL n type ) :时间加n 类型为type如day/second/…
ADDDATE(date,days ):时间加days天
ADDTIME(date,second):时间加second秒
SUBDATE(date ,INTERVAL n type ) :时间减n 类型为type如day/second/…
SUBDATE(date ,days ):时间加days天
SUBTIME(date ,second):时间加second秒
由于加减的方法形式一样,本处只进行时间加的操作
SELECT ADDDATE('2019-3-23 13:30:30',INTERVAL 10 DAY); //2019-04-02 13:30:30 加了十天
SELECT ADDDATE('2019-3-23 13:30:30',10); //2019-04-02 13:30:30 加了十天
SELECT ADDDATE('2019-3-23 13:30:30',INTERVAL 10 SECOND); //2019-03-23 13:30:40 加了10s
SELECT ADDTIME('2019-3-23 13:30:30',10); //2019-03-23 13:30:40 加了10s
SELECT ADDTIME('2019-3-23 13:30:30:683',10); //2019-03-23 13:30:40 加了10s
CURDATE() 当前年月日
CURRENT_DATE(); 当前年月日
CURTIME() 当前时分秒
CURRENT_TIME(); 当前时分秒
NOW() 当前年月日时分秒
CURRENT_TIMESTAMP 当前年月日时分秒
将当前日期按照 ‘YYYY-MM-DD’ 或 YYYYMMDD 格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。
SELECT CURDATE(); //2019-03-23
SELECT CURRENT_DATE(); //2019-03-23
SELECT CURTIME(); //17:20:11
SELECT CURRENT_TIME(); //17:20:11
SELECT NOW(); //2019-03-23 17:44:31
SELECT CURRENT_TIMESTAMP(); //2019-03-23 17:20:11
DATEDIFF(expr ,expr2 )
DATEDIFF() 返回起始时间(expr-expr2)的天数,计算中只用到这些值的日期部分。
SELECT DATEDIFF('2001-02-02','2001-01-01'); //32
SELECT DATEDIFF('2001-01-01','2001-02-02'); //-32
DATE(date) //提取年月日
TIME(date) //提取时分秒
YEAR(date) //提取年
MONTH(date) //提取月
DAY(date) //提取日
HOUR(date) //提取小时
MINUTE(date) //提取分钟
SENCOND(date) //提取秒
EXTRACT(type FROM date) 类型可以是以上任何类型 结果对应
提取日期或时间日期表达式中的年月日时分秒部分,或者指定内容.
SELECT DATE(NOW()); //2019-03-23
SELECT TIME(NOW()); //17:48:47
SELECT YEAR(NOW()); //2019
SELECT MONTH(NOW()); //3
SELECT DAY(NOW()); //23
SELECT HOUR(NOW()); //17
SELECT MINUTE(NOW()); //48
SELECT SECOND(NOW()); //47
DAYNAME(date) //获取星期几
MONTHNAME(date) //获取月份
WEEK(date) //获取取第几周
DAYOFWEEK(date) //获取这周的第几天
DAYOFMONTH(date) //获取这个月的第几天
DAYOFYEAR(date) //获取今天第几天
LAST_DAY(date) //获取本月最后一天
SELECT DAYNAME(NOW()); //Saturday
SELECT MONTHNAME(NOW()); //March
SELECT WEEK(NOW()); //11
SELECT DAYOFWEEK(NOW()); //7 注:周末属于第一天
SELECT DAYOFMONTH(NOW()); //23
SELECT DAYOFYEAR(NOW()); //82
SELECT LAST_DAY(NOW()); //2019-03-31
SEC_TO_TIME(s)
将以秒为单位的时间 s 转换为时分秒的格式
TIME_TO_SEC(time)
将时分秒转换为秒
SELECT SEC_TO_TIME(3221); //00:53:41
SELECT TIME_TO_SEC('19:20:00'); //69600
CASE value
WHEN [compare-value]
THEN result [WHEN [compare-value] THEN result ……]
[ELSE result ]
END
CASE 表示函数开始,END 表示函数结束。
当满足条件value =compare-value 时,返回对应的result,否则返回ELSE后的result。
CASE
WHEN [condition]
THEN
result [WHEN[condition] THEN result ……] [ELSE result]
END
当满足条件condition时,返回对应的result,否则返回ELSE后的result。
两种方案中,如果都不满足而且如果没有ELSE 部分,则返回值为NULL
SELECT CASE m
WHEN 2-1
THEN 'a'
WHEN 3-1
THEN 'b'
ELSE 'c'
END
将m的值改为分别置为,1,2,3,对应结果分别是 a,b,c
SELECT CASE
WHEN 2-2= 1 THEN 'a'
WHEN 3-2 = 2 THEN 'b'
ELSE 'c'
END;
若第一个when成立,返回a, 第二个when成立,返回b,都不成立则返回c
IF(expr,v1,v2)
若表达式expr成立,返回值v1 否则,返回v2;
SELECT IF(1>0,'a','b'); //a
SELECT IF(1>0,'a','b'); //b
SELECT IF(null,'a','b'); //b
IFNULL(expression, value)
函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
SELECT IFNULL(5<4,'a'); //返回0
SELECT IFNULL(5>4,'a'); //返回1
SELECT IFNULL('m','a'); //返回m
SELECT IFNULL('m',null); //返回m
SELECT IFNULL(null,'a'); //返回a
NULLIF(expr1, expr2)
比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
SELECT NULLIF(10,10); //null
SELECT NULLIF(10,20); //10
SELECT NULLIF(10,null); //10
SELECT NULLIF(null,10); //null
SELECT NULLIF(null,null); //null
数学函数还是有很多的,其中有正弦,余弦之类的,类似于java中Math的Api文档,但是这些并不经常使用,这里只添加了一些常用方法
ABS(x)
返回 x 的绝对值
SELECT ABS(1); //1
SELECT ABS(-1); //1
MOD(a, b)
取余,等价于a%b
SELECT MOD(5,3); //2
PI()
返回 (pi) 的值。默认的显示小数位数是 7 位 , 然而 MySQL 内部会使用完全双精度值。
SELECT PI(); //3.141593
DEGREES(x)
将弧度转换为角度
RADIANS(x)
将角度转换为弧度
SELECT DEGREES(PI()/2); //90
SELECT RADIANS(90); //PI/2
SIN(x) //参数为弧度,求x的正弦值
ASIN(x) //参数为值,求值为x的反正弦
COS(x) //参数为弧度,求x的余弦值
ACOS(x) //参数为值,求值为x的反余弦
TAN(x) //参数为弧度,求x的正切值
ATAN(x) //参数为值,求值为x的反切弦
本处只进行正弦演示,余弦,正切道理相同
SELECT SIN(0.5*PI()); //1
SELECT ASIN(1); //PI/2
CEILING(x) / CEIL(x)
简单理解为向上取整
SELECT CEILING(3.4); //4
SELECT CEILING(-3.4); //-3
SELECT CEIL(3.4); //4
SELECT CEIL(-3.4); //-3
FLOOR(x)
返回不大于 X 的最大整数值 。即向下取整
SELECT FLOOR(3.4); //3
SELECT FLOOR(-3.4); //-4
ROUND(x) 四舍五入
ROUND(x,D) 四舍五入,并保留d位小数等
其值保留到小数点后 D 位,而第 D 位的保留方式为四舍五入。
若要接保留 X 值小数点左边的 D 位,可将 D 设为负值。
SELECT ROUND(3.4); //3
SELECT ROUND(3.5); //4
SELECT ROUND(5555.5555,3); //5555.556
SELECT ROUND(5555.5555,-3); //6000
RAND()
返回 0 到 1 的随机数
SELECT RAND(); //0.41592828781896
POW(x, y) / POWER(x, y)
返回 X 的 Y 乘方的结果值。
SELECT POW(3,2); //9
SELECT POWER(3,2); //9
SELECT POW(4,0.5); //2
SELECT POW(2,-2); //0.25
log(x) 返回x 的自然对数。
ln(x) 返回x的自然对数
log2(x) 返回x的基数为2的对数
log10(x) 返回x的基数为10的对数
SELECT LOG(2,2); //1
SELECT LOG(10); //2.302585092994
SELECT LN(10); //2.302585092994
SELECT LOG2(2); //1
SELECT LOG10(10); //1
SIGN(x)
返回参数作为 -1 、 0 或 1 的符号,该符号取决于 X 的值为负、零或正。
SELECT SIGN(-5); //-1
SELECT SIGN(5); //1
SELECT SIGN(0); //0
SQRT(x)
返回非负数的二次方根
SELECT SQRT(4); //2
SELECT SQRT(-4); //null
TRUNCATE(x,D)
返回被舍去至小数点后 D 位的数字 x 。
若 D 的值为 0, 则结果不带有小数点或不带有小数部分。
可以将 D 设为负数 , 若要截去 ( 归零 ) x 小数点左起第 D 位开始后面所有低位的值
SELECT TRUNCATE(5555.5555,3); //5555.555
SELECT TRUNCATE(5555.5555,0); //5555
SELECT TRUNCATE(5555.5555,-3); //5000
FORMAT(x, D)
将数字 x 的格式写成 ‘#,###,###.##’ 格式 , 即保留小数点后 D 位,而第 D 位的保留方式为四舍五入,然后将结果以字符串的形式返回
SELECT FORMAT(55555555.5555,3) //55,555,555.556
least(x,y,…) 返回最小值
greatest(x,y,…) 返回最大值
SELECT LEAST(1,2,3,4,5,6); //1
SELECT LEAST('a','b','c'); //a
SELECT GREATEST(1,2,3,4,5,6); //6
SELECT GREATEST('a','b','c'); //c
COUNT(x) 返回非NULL 的字段x数量
MAX(x) 返回字段x的最大值
MIN(x) 返回字段x的最小值
SUM(x) 返回字段x的总和
AVG(x) 返回字段x的平均值
SELECT COUNT(age) FROM student;
SELECT MAX(age) FROM student;
SELECT MIN(age) FROM student;
SELECT SUM(age) FROM student;
SELECT AVG(age) FROM student;
AES_ENCRYPT(str ,key_str ) 加密
AES_DECRYPT(crypt_str ,key_str ) 解密
首先,在AES加密法之前,应对加密方式有一定了解
AES加密要求一般有两种方式:
其一:字段属性为varbinary/binary/四种blob类型等二进制字段属性,然后可以直接进行加密和读取解密
其二:将密文十六进制化,再存入varchar列。(可以使用字符串函数HEX和UNHEX),然后可以将密文十六进制化的内容存入数据库,解密只需现将查询内容UNHEX操作,然后进行AES解密
这个测试使用第二种方式,创建一个表只有一个字段pass,varchar类型
INSERT INTO password_test VALUES (HEX(AES_ENCRYPT('你好','key')));
//40A7DA926402215ECD3D877F5902F322
SELECT AES_DECRYPT(UNHEX(pass),'key') FROM password_test; //你好
ENCODE(str ,key_str ) 加密
DECODE(crypt_str ,key_str ) 解密
SELECT ENCODE('hello','123456'); //加密hello
SELECT DECODE(ENCODE('hello','123456'),'123456'); //解密出hello
MD5(x)
该值以 32 位十六进制数字的二进制字符串的形式返回 , 若参数为 NULL 则会返回 NULL
SELECT MD5('123456'); //e10adc3949ba59abbe56e057f20f883e
SHA(x) 系列算法
SELECT SHA('123456'); //7c4a8d09ca3762af61e59520943dc26494f8941b
SELECT SHA1('123456'); //7c4a8d09ca3762af61e59520943dc26494f8941b
CHARSET(str)
返回字符串自变量的字符集。
SELECT CHARSET('123'); //utf8
COLLATION(str)
SELECT COLLATION('123456'); //utf8_general_ci 查询速度快,准确度稍差,相对于utf8_unicode_ci 准确度高,但校对速度稍慢。
CONNECTION_ID()
函数返回服务器的连接数,也就是到现在为止MySQL服务的连接次数
SELECT CONNECTION_ID(); //1
CURRENT_USER() 返回程序的创建者
SELECT USER(); //root@localhost
SELECT SYSTEM_USER(); //root@localhost
SELECT SESSION_USER(); //root@localhost
SELECT CURRENT_USER(); //root@localhost
DATABASE() 返回当前数据库名
VERSION() 返回Mysql版本
SELECT DATABASE() //mysql_function_test
SELECT VERSION(); //5.0.18-nt
LAST_INSERT_ID()
返回的值是该客户端产生对影响自动增长列的最新语句第一个 自动增长的值;
假如你使用单INSERT语句插入多个行, LAST_INSERT_ID() 只返回插入的第一行产生的值。
MATCH (col1,col2,…) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) MySQL5.6新引入的特性
SELECT 表字段 FROM 表名 WHERE MATCH (全文搜索表字段) AGAINST (‘搜索字符串’);
MATCH 相当于要找的列, 而 AGAINST 就是要找的内容。
比起 like 有点不一样
而且 match … against 还提供很多 操作, 对数据 进一步过滤,
一般可以作为 比较精确的搜索,
UUID();
返回一个通用唯一标识符 (UUID) , UUID 被设计成一个在时间和空间上都独一无二的数字。
SELECT UUID(); //f65225f2-a042-1037-a47b-49f6f6ebb9db