【MySQL】16-超详细的MySQL单行函数汇总



1. MySQL函数简介

在MySQL中,最重要的函数就是数值函数字符串函数日期时间函数流程控制函数

不同的DBMS之间的函数绝大部分都是不通用的。如,MySQL和Oracle之间很多函数是不通用的。本章只学习MySQL中的函数。

1.1 按数据类型分类

分为:数值函数、字符串函数、日期时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。


1.2 按输入数量分类

单进单出称为单行函数,多进单出称为多行函数 (或聚合函数) 。如下图所示:


本章先学习单行函数,其特征为:

  • 只对一行进行变换
  • 每行返回一个结果
  • 可以嵌套
  • 参数可以是一列或一个值

2. 数值函数


2.1 基本函数

函数作用
ABS(x)返回x的绝对值
SIGN(x)返回x的符号,正数为1,负数为-1, 0返回0
PI()返回圆周率的值
CEIL(x), CEILING(x)返回大于或等于某个值的最小整数
FLOOR(x)返回小于或等于某个值的最大整数
LEAST(e1, e2, …, en)返回列表中的最小值
GREATEST(e1, e2, …, en)返回列表中的最大值
MOD(x, y)返回x除以y后的余数
RAND()返回0~1的随机值
RAND(x)返回0~1的随机值,x作为随机种子,相同的x值会产生相同的随机数
ROUND(x)返回一个对x四舍五入后,最接近于x的整数
ROUND(x, y)返回一个对x四舍五入后,最接近于x的值,并保留小数点到后面y位
TRUNCATE(x, y)返回数字x截断为y位小数的结果
SQRT(x)返回x的平方根,当x为负数时返回NULL

2.2 角度与弧度互换函数

函数作用
RADIANS(x)将角度转换为弧度,其中x为角度值
DEGREES(x)将弧度转换为角度,其中x为弧度值

2.3 三角函数

函数作用
SIN(x)返回x的正弦值,其中x为弧度值
ASIN(x)返回x的反正弦值,即获取正弦值为x的值。若x的值不在-1到1之间,则返回NULL
COS(x)返回x的余弦值,其中x为弧度值
ACOS(x)返回x的反余弦值,即获取余弦值为x的值。若x的值不在-1到1之间,则返回NULL
TAN(x)返回x的正切值,其中x为弧度值
ATAN(x)返回x的反正切值,即获取正切值为x的值
ATAN(x, y)返回两个参数的反正切值
COT(x)返回x的余切值,其中x为弧度值

2.4 指数与对数

函数作用
POW(x, y), POWER(x, y)返回x的y次方
EXP(x)返回 e e e 的x次方
LN(x), LOG(x)返回以 e e e 为底x的对数,当x<=0时, 返回NULL
LOG10(x)返回以10为底的x的对数,当x<=0时, 返回NULL
LOG2(x)返回以2为底x的对数,当x<=0时, 返回NULL

2.5 进制间的转换

函数作用
BIN(x)返回x的二进制编码
HEX(x)返回x的十六进制编码
OCT(x)返回x的八进制编码
CONV(x, f1, f2)返回f1进制数变成f2进制数

3. 字符串函数


【注意】MySQL中,字符串位置是从1开始的。

函数作用
ASCII(s)返回字符串s中的第一个字符的ASCII码值
CHAR_LENGTH(s)返回字符串s的字符数,作用与CHARACTER_LENGTH(s)相同
LENGTH(s)返回字符串s的字节数,和字符集有关
CONCAT(s1, s2, …, sn)连接s1, s2, …, sn为一个字符串
CONCAT_WS(x, s1, s2, …, sn)同CONCAT(s1, s2, …, sn)函数,但是每个字符串之间加上x
INSERT(str, idx, len, replacestr)将字符串str从第idx位置开始,len个字符串长的子串替换成字符串replacestr
REPLACE(str, a, b)用字符串b替换字符串str中所有字符串a
UPPER(s)或UCASE(s)将字符串s的所有字母转换成大写字母
LOWER(s)或LCASE(s)将字符串s的所有字母转换成小写字母
LEFT(str, n)返回字符串str最左边的n个字符
RIGHT(str, n)返回字符串str最右边的n个字符
LPAD(str, len, pad)用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str, len, pad)用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s)去掉字符串s左侧的空格
RTRIM(s)去掉字符串s右侧的空格
TRIM(s)去掉字符串s开头和结尾的空格
TRIM(s1 FROM S)去掉字符串s开头与结尾的s1
TRIM(LEADING s1 FROM s)去掉字符串s左侧的s1
TRIM(TRAILING s1 FROM s)去掉字符串s右侧的s1
REPEAT(str, n)返回str重复n次的结果
SPACE(n)返回n个空格
STRCMP(s1, s2)比较字符串s1和s2的ASCII码值的大小
SUBSTR(s, index, len)返回从字符串s的index位置开始的len个字符。作用与SUBSTRING(s, index, len)、MID(s, index, len)相同
LOCATE(substr, str)返回字符串substr在字符串str中首次出现的位置,若没找到,则返回0
ELT(m, s1, s2, …, sn)返回指定位置的字符串,若m=1,则返回s1;若m=2,则返回s2……以此类推
FIELD(s, s1, s2, …, sn)返回字符串s在字符串列表中第一次出现的位置
FIND_IN_SET(s1, s2)返回字符串s1在字符串s2中出现的位置。其中,s2是一个以逗号分隔的字符串
REVERSE(s)返回s反转后的字符串
NULLIF(value1, value2)比较两个字符串,若value1与value2相等,则返回NULL,否则返回value1

4. 日期类型函数

《超详细的MySQL日期类型函数总结》


5. 流程控制函数


MySQL中的流程处理函数主要包括 IF()、IFNULL() 和 CASE()函数。

函数作用
IF(value, value1, value2)如果value的值为TRUE,则返回value1,否则返回value2
IFNULL(value1, value2)如果value1不为NULL,返回value1,否则返回value2
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 … [ELSE result] END相当于Java的if…else
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 … [ELSE 值n] END相当于Java的switch…case…

举个例子:

IF()

SELECT last_name, salary, IF(salary >= 6000, '高工资', '低工资')
FROM employees;

查询结果:


IFNULL()

SELECT last_name, commission_pct, IFNULL(commission_pct, 0)
FROM employees;

查询结果:


CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 … [ELSE result] END

SELECT last_name, salary, CASE WHEN salary >= 15000 THEN '人生赢家' 
			       WHEN salary >= 10000 THEN '高富帅'
			       WHEN salary >= 8000  THEN '潜力股'
			       ELSE '人民群众'
			       END AS "describe"
FROM employees;

查询结果:

其中,ELSE 可以省略。


【例子1】

查询部门号为 10,20, 30 的员工信息,
若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍,
30 号部门,打印其工资的 1.3 倍数,
其他部门,打印其工资的 1.4 倍数。

# 写法一
SELECT last_name, salary, department_id,
CASE WHEN department_id = 10 THEN salary * 1.1
     WHEN department_id = 20 THEN salary * 1.2
     WHEN department_id = 30 THEN salary * 1.3
     ELSE salary * 1.4 
     END AS "describe"
FROM employees;

# 写法二
SELECT last_name, salary, department_id,
CASE department_id WHEN 10 THEN salary * 1.1
		   		   WHEN 20 THEN salary * 1.2
		           WHEN 30 THEN salary * 1.3
		   		   ELSE salary * 1.4 
		   		   END AS "describe"
FROM employees;

查询结果:


【例子2】

查询部门号为 10,20, 30 的员工信息,
若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍,
30 号部门打印其工资的 1.3 倍数。

# 写法一
SELECT last_name, salary, department_id,
CASE WHEN department_id = 10 THEN salary * 1.1
     WHEN department_id = 20 THEN salary * 1.2
     WHEN department_id = 30 THEN salary * 1.3
     END AS "describe"
FROM employees
WHERE department_id IN(10, 20, 30);

# 写法二
SELECT last_name, salary, department_id,
CASE department_id WHEN 10 THEN salary * 1.1
		   		   WHEN 20 THEN salary * 1.2
		           WHEN 30 THEN salary * 1.3
		   		   END AS "describe"
FROM employees
WHERE department_id IN(10, 20, 30);

查询结果:


6. 加密解密函数


加密与解密函数主要用于对数据库中的数据 (如用户的登录密码、银行的取款密码等) 进行加密和解密处理,防止数据被黑客窃取。这些函数在保证数据库安全时非常有用。

但在实际开发中,用户密码的加密已经前移到客户端就已经完成了。即用户在客户端输入完密码,点击登录之后就已经完成加密操作了。这样,在网络传输过程中传输的是已经加密的密码信息,黑客就算在网络传输过程截取密码信息,获得的也只是加密的暗文,更加安全。因此在数据库端进行加密解密已经不那么重要了,仅仅是提供一种加密方式的选择罢了。

函数作用
PASSWORD(str)返回字符串str的加密版本,41位长的字符串。加密结果不可逆,常用于用户的密码加密。在MySQL8.0中被Deprecated
MD5(str)返回字符串str的md5加密后的值。加密结果不可逆,若参数位NULL,则会返回NULL
SHA(str)从原名文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL。加密结果不可逆,SHA加密算法比MD5更加安全
ENCODE(value, password_seed)返回使用password_seed作为加密密码加密value。在MySQL8.0中被Deprecated
DECODE(value, password_seed)返回使用password_seed作为加密密码解密value。在MySQL8.0中被Deprecated

ENCODE(value,password_seed) 函数与 DECODE(value,password_seed) 函数互为反函数。


举个栗子:

SELECT MD5('mysql'), SHA('mysql')
FROM DUAL;

查询结果:


7. MySQL信息函数

MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作。

函数作用
VERSION()返回当前MySQL的版本号
CONNECTION_ID()返回当前MySQL服务器的连接数
DATABASE(), SCHEMA()返回MySQL命令行当前所在的数据库
USER(), CURRENT_USER(), SYSTEM_USER(), SESSION_USER()返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
CHARSET(value)返回字符串value自变量的字符集
COLLATION(value)返回字符串value的比较规则

举个栗子:

SELECT VERSION(), CONNECTION_ID(), DATABASE(), SCHEMA(),
USER(), CURRENT_USER(), SYSTEM_USER(), SESSION_USER(), 
CHARSET('卷'), COLLATION('爱你')
FROM DUAL;

查询结果:


8. 其他函数

MySQL中有些函数无法对其进行具体的分类,但是这些函数在MySQL的开发和运维过程中也是不容忽视的。

函数作用
FORMAT(value, n)返回对数字value进行格式化啊后的结果数据。n表示四舍五入后保留到小数点后n位
CONV(value, from, to)将value的值进行不同进制之间的转换
INET_ATON(ipvalue)将以点分隔的IP地址转化为一个数字
INET_NTOA(value)将数字形式的IP地址转换为以点分隔的IP地址
BENCHMARK(n, expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间
CONVERT(value USING char_code)将value所使用的字符编码修改为char_code

举个例子:

FORMAT(value, n)

SELECT FORMAT(123.125, 2), FORMAT(123.125, 0), FORMAT(123.125, -2)
FROM DUAL;

查询结果:

可以看到,如果n的值小于0,只保留整数部分,不会保留到十位、百位这些。


CONV(value, from, to)

SELECT CONV(16, 10, 2), CONV(8888, 10, 16), CONV(NULL, 10, 2)
FROM DUAL;

查询结果:

  • 第一个字段意思是把数字16从十进制转换为二进制,后面两个字段同理。
  • 当要转化的数字为NULL时,运算结果也为NULL。

INET_ATON(ipvalue)INET_NTOA(value)

SELECT INET_ATON('192.168.1.200'), INET_NTOA(3232235976)
FROM DUAL;

查询结果:


BENCHMARK(n, expr)

SELECT BENCHMARK(9000000, SHA('OceanUniversityOfChina'))
FROM DUAL;

查询结果:


CONVERT(value USING char_code)

SELECT CHARSET('OUC'), CHARSET(CONVERT('OUC' USING 'utf8mb4'))
FROM DUAL;

查询结果:

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自牧君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值