一、MySQL函数介绍
MySQL是 MySQL 数据库提供的内部函数,这些内部函数可以帮助用户更加方便地处理表中的数据。函数就像预定的公式一样存放在数据库里,每个用户都可以调用已经存在的函数来完成某些功能。
同时MySQL数据库还支持用户自己建立函数,以适应实际的业务操作。正确使用函数会让读者在编写 SQL 语句时起到事半功倍的效果。
二、MySQL函数分类
1、数学函数
ABS(x) --返回x的绝对值
BIN(x) --返回x的二进制(OCT返回八进制,HEX返回十六进制)
CEILING(x) --返回大于x的最小整数值
EXP(x) --返回值e(自然对数的底)的x次方
FLOOR(x) --返回小于x的最大整数值
GREATEST(x1,x2,...,xn)
--返回集合中最大的值
LEAST(x1,x2,...,xn)
--返回集合中最小的值
LN(x) --返回x的自然对数
LOG(x,y) --返回x的以y为底的对数
MOD(x,y) --返回x/y的模(余数)
PI() --返回pi的值(圆周率)
RAND() --返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
ROUND(x,y) --返回参数x的四舍五入的有y位小数的值
SIGN(x) --返回代表数字x的符号的值
SQRT(x) --返回一个数的平方根
TRUNCATE(x,y) --返回数字x截短为y位小数的结果
(提示:可以左右滑动代码)
2、聚合函数
聚合函数是我们日常用到的频率最高的函数,包括求和、计算总记录数、求平均值、求最大值、最小值这样的函数。基本语法如下:
SELECT 聚合函数(列名) FROM 表名;
经验提示:对多条数据的单列进行统计,返回统计后的一行结果。
聚合函数 | 说明 |
---|---|
sum() | 求所有行中单列结果的总和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
COUNT() | 求总行数 |
我们再来看个栗子,计算学生的总和。
#统计所有学生年龄总和
SELECT SUM(Sage) FROM student;
接着我们来计算学生年龄的平均值。
#统计所有学生平均年龄
SELECT AVG(Sage) FROM student;
再来计算一下最大年龄的学生:
#统计学生中年龄最大的学员
SELECT MAX(Sage) FROM student;
计算年龄最小的学生:
#统计学生中年龄最小的学员
SELECT MIN(Sage) FROM student;
计算学生的总数量:
#统计学生总数
SELECT COUNT(*) FROM student;
注意:聚合函数会自动忽略null值,不进行统计。
3、字符串函数
在SQL语句中我们可以对字符串进行拼接、计算长度、大写转小写、小写转大写等操作。基本语法如下:
SELECT 字符串函数 ([参数列表])
字符串函数 | 说明 |
---|---|
CONCAT(str1,str2,str…) | 将 多个字符串连接 |
INSERT(str,pos,len,newStr) | 将str 中指定 pos 位置开始 len 长度的内容替换为 newStr |
LOWER(str) | 将指定字符串转换为小写 |
UPPER(str) | 将指定字符串转换为大写 |
SUBSTRING(str,num,len) | 将str 字符串指定num位置开始截取 len 个内容 |
我们再来看个栗子,这里是关于字符串的应用。
#拼接内容
SELECT CONCAT('My','S','QL');
#字符串替换
SELECT INSERT('这是一个数据库',3,2,'MySql'); #结果为这是 MySql 数据库
#指定内容转换为小写
SELECT LOWER('MYSQL');#mysql
#指定内容转换为大写
SELECT UPPER(‘mysql’);#MYSQL
#指定内容截取
SELECT SUBSTRING(‘JavaMySQLOracle’,5,5);#MySQL
4、日期和时间函数
下面是大白给大家总结的MySQL操作时间函数,也就是操作时间的方法,我们先看基本语法:
SELECT 时间函数([参数列表])
经验提示:MySQL执行时间函数查询,会自动生成一张虚表,一行一列。
接着我们来看一个例子,看看如何获得当前的系统时间。
#查询当前时间
SELECT SYSDATE();
#查询当前时间
SELECT NOW();
#获取当前日期
SELECT CURDATE();
#获取当前时间
SELECT CURTIME();
5、加密函数
AES_ENCRYPT(str,key)
--返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储
AES_DECRYPT(str,key)
--返回用密钥key对字符串str利用高级加密标准算法解密后的结果
DECODE(str,key) --使用key作为密钥解密加密字符串str
ENCRYPT(str,salt) --使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
ENCODE(str,key) --使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储
MD5() --计算字符串str的MD5校验和
PASSWORD(str) --返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
SHA() --计算字符串str的安全散列算法(SHA)校验和
例如
SELECT ENCRYPT('root','salt') ;
SELECT ENCODE('xufeng','key') ;
SELECT DECODE(ENCODE('xufeng','key'),'key') ;--加解密放在一起
SELECT AES_ENCRYPT('root','key') ;
SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key') ;
SELECT MD5('123456') ;
SELECT SHA('123456') ;
6、控制流函数
CASE WHEN [test1] THEN [result1]...ELSE [default] END
--如果test1是真,则返回result1,否则返回default
CASE [test] WHEN [val1] THEN [result]...ELSE [default] END
--如果test和valN相等,则返回result,否则返回default
IF(test,t,f) --如果test是真,返回t;否则返回f
IFNULL(arg1,arg2) --如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2) --如果arg1=arg2返回NULL;否则返回arg1
这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。
如果第一个参数不是NULL,函数就会向调用者返回第一个参数;
如果是NULL,将返回第二个参数。
例如
SELECT IFNULL(1,2),
IFNULL(NULL,10),
IFNULL(4*NULL,'false');
NULLIF()函数将会检验提供的两个参数是否相等,如果相等,则返回NULL,
如果不相等,就返回第一个参数。
例如
SELECT NULLIF(1,1),
NULLIF('A','B'),
NULLIF(2+3,4+1);
MySQL的IF()函数也可以建立一个简单的条件测试,
这个函数有三个参数,第一个是要被判断的表达式,
如果表达式为真,IF()将会返回第二个参数,
如果为假,IF()将会返回第三个参数。
例如
SELECT IF(1<10,2,3),IF(56>100,'true','false');
IF()函数在只有两种可能结果时才适合使用。
然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。
在这种情况下,它和PHP及Perl语言的switch-case条件例程一样。
CASE函数的格式有些复杂,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END
这里,第一个参数是要被判断的值或表达式,接下来的是一系列的WHEN-THEN块,
每一块的第一个参数指定要比较的值,如果为真,就返回结果。
所有的WHEN-THEN块将以ELSE块结束,当END结束了所有外部的CASE块时,
如果前面的每一个块都不匹配就会返回ELSE块指定的默认结果。
如果没有指定ELSE块,而且所有的WHEN-THEN比较都不是真,MySQL将会返回NULL。
CASE函数还有另外一种句法,有时使用起来非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END
这种条件下,返回的结果取决于相应的条件测试是否为真。
例如:
SELECT CASE 'green'
WHEN 'red' THEN 'stop'
WHEN 'green' THEN 'go' END;
SELECT CASE 9
WHEN 1 THEN 'a'
WHEN 2 THEN 'b' ELSE 'N/A' END;
SELECT CASE WHEN (2+2)=4 THEN 'OK'
WHEN (2+2)<>4 THEN 'not OK' END AS STATUS;
SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT
FROM UserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN 'D'
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
ELSE 'A' END AS grade FROM marks ;
SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResult
FROM users WHERE uname = 'sue';
7、格式化函数
DATE_FORMAT(date,fmt)
--依照字符串fmt格式化日期date值
FORMAT(x,y) --把x格式化为以逗号隔开的数字序列,y是结果的小数位数
INET_ATON(ip) --返回IP地址的数字表示
INET_NTOA(num) --返回数字所代表的IP地址
TIME_FORMAT(time,fmt)
--依照字符串fmt格式化时间time值
其中最简单的是FORMAT()函数,
它可以把大的数值格式化为以逗号间隔的易读的序列。
例如
SELECT FORMAT(34234.34323432,3) ;
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r') ;
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') ;
SELECT DATE_FORMAT(19990330,'%Y-%m-%d') ;
SELECT DATE_FORMAT(NOW(),'%h:%i %p') ;
SELECT INET_ATON('10.122.89.47') ;
SELECT INET_NTOA(175790383) ;
8、类型转化函数
为了进行数据类型转化,MySQL提供了CAST()函数,
它可以把一个值转化为指定的数据类型。
类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
例如
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
9、系统信息函数
DATABASE() --返回当前数据库名
BENCHMARK(count,expr)
--将表达式expr重复运行count次
CONNECTION_ID() --返回当前客户的连接ID
FOUND_ROWS() --返回最后一个SELECT查询进行检索的总行数
USER()或SYSTEM_USER()
--返回当前登陆用户名
VERSION() --返回MySQL服务器的版本
例如
SELECT DATABASE(),VERSION(),USER();
SELECTBENCHMARK(9999999,LOG(RAND()*PI()));
--该例中,MySQL计算LOG(RAND()*PI())表达式9999999次。
10、开窗函数
MySQL8.0版本开始支持开窗函数
ROW_NUMBER() OVER() --排序:1,2,3,4
RANK() OVER() --排序:1,1,3,3,5
DENSE_RANK() OVER() --排序:1,1,2,2,3,4
NTILE() OVER() --将有序数据分为N组,记录等级数
LAG(expr,n) OVER() --返回当前行的前N行的expr的值
LEAD(expr,n) OVER() --返回当前行 后N行的expr的值