比较函数
返回列表中的第一个非空值
COALESCE(a,b,c...)
返回列表中的最大值
GREATEST(a,b,c...)
返回列表中的最小值
LEAST(a,b,c...)
判断是否为空
ISNULL(expr)
数学函数
绝对值
ABS(x)
圆周率
PI()
返回 6 位小数 3.141593
平方根
SQRT(x)
如果 x
为负值,则返回 null
求余数
MOD(x,y)
如果 y
为 0 则返回 null
向上取整
CEIL(x)
#等效用法
CEILING(x)
返回不小于 x
的最小整数
向下取整
FLOOR(x)
返回不大于 x
的最大整数
随机数
RAND(x)
不带参数,每次返回值不同
带参数,不同参数之间的返回值不同,相同参数多次调用返回值不变
返回 (0,1)
之间的小数
四舍五入
ROUND(x,y)
y
表示保留的位数,正数表示保留的小数位数,负数表示保留的整数位数,不指定或为 0 则保留至个位数
截去归零
TRUNCATE(x,y)
y
表示保留的位数,正数表示保留的小数位数,负数表示保留的整数位数,0 表示仅截去所有小数部分
获取符号
SIGN(x)
x
的值为负数、0、正数,分别返回 -1, 0 , 1
幂运算
POW(x,y)
#等效用法
POWER(x,y)
返回 x
的 y
次方
自然指数 e 的幂运算
EXP(x)
返回自然指数 e
的 x
次方
自然对数
LOG(x)
返回基数 e 的对数(自然对数)
基数 10 的对数
LOG10(x)
角度转弧度
RADIANS(x)
把角度 x
转换为弧度
弧度转角度
DEGREES(x)
把弧度 x
转换为角度
正弦
SIN(x)
返回 x
的正弦,其中 x
为弧度值
反正弦
ASIN(x)
返回 x
的反正弦,若 x
不在 [-1,1]
之间,则返回 null
余弦
COS(x)
返回 x
的余弦,其中 x
为弧度值
反余弦
ACOS(x)
返回 x
的反余弦,若 x
不在 [-1,1]
之间,则返回 null
正切函数
TAN(x)
返回 x
的正切,其中 x
为弧度值
反正切
ATAN(x)
返回 x
的反正切
余切
COT(x)
返回 x
的余切
字符串函数
计算字符个数
CHAR_LENGTH(x)
计算字符个数,一个多字节字符计 1
计算字符长度
LENGTH(x)
计算字符长度,双字节字符计 2,三字节字符计 3
合并字符串(没有分隔符)
CONCAT(s1,s2...)
拼接所有字符串参数,没有分隔符,如果参数中含有 null
,则返回 null
合并字符串(指定分隔符)
CONCAT_WX(x,s1,s2...)
使用分隔符 x
拼接所有字符串参数,如果参数中含有 null
,则返回 null
按位置替换字符串的函数
INSERT(s1,x,len,s2)
s1
表示原始字符串x
表示起始位置,包括第x
位(MySQL 的脚标从 1 开始)len
表示起始位置后的字符个数s2
表示用于替换的字符串
从 s1
中第 x
个字符开始(包括),从左向右查找 len
个字符,将其替换为 s2
如果 x
超过原始字符串长度,返回原始字符串
若任何一个参数为 null
则返回 null
字母转换为小写
LOWER(x)
#等效用法
LCASE(x)
将字符串中的所有字母转换为小写
字母转大写
UPPER(x)
#等效用法
UCASE(x)
将字符串中的所有字母转换为大写
从左向右获取指定长度的字符串
LEFT(s,n)
返回字符串 s
从左开始的 n
个字符
从右向左获取指定长度的字符串
RIGHT(s,n)
返回字符串 s
从右开始的 n
个字符
在字符串左侧填充字符串
LPAD(s1,len,s2)
s1 原始字符串
len 填充之后字符串的总个数
s2 用来填充的字符串
在字符串 s1
的左侧填充 s2
,直到填充后的字符串总长度达到 len
个字符为止
若 s1
总长度大于 len
,则 s1
被截取只保留左侧 len
个字符
在字符串右侧填充字符串
RPAD(s1,len,s2)
与 LPAD()
相反,从右侧补全
删除左侧空格
LTRIM(s)
删除字符串 s
左侧所有的空格
删除右侧空格
RTRIM(s)
删除字符串 s
右侧所有的空格
删除指定字符串
TRIM([s1 FROM ]s)
删除字符串 s
两侧所有的 s1
s1 FROM
为可选项,未指定时删除两侧所有空格
重复生成字符串
REPEAT(s,n)
重复生成 n
个字符串 s
空格函数
SPACE(n)
重复生成 n
个空格
替换指定字符串
REPLACE(s,s1,s2)
s
原始字符串s1
要搜索替换的字符串s2
用于替换的字符串
将 s
中所有的 s1
替换为 s2
比较字符串大小
STRCMP(s1, s2)
s1
小于、等于、大于 s2
分别返回 -1
、 0
、 1
字符串截取
SUBSTR(s,n,len)
#等效用法
SUBSTRING(s,n,len)
MID(s,n,len)
s
原始字符串n
起始位置(包括)。MySQL
中的字符串脚标从 1 开始len
截取的长度
从字符串 s
的起始位置 n
开始截取长度为 len
的字符串,
指定的 n
为负数,则从字符串 s
的倒数 n
个字符开始截取。
指定的 len
如果为负数,则返回空字符串(这一点与 PHP
不同)
不指定 len
则截取到末尾
子串在字符串中第一次出现的位置
LOCATE(strl,str)
POSITION(strl IN str)
INSTR(str,strl)
三个函数作用相同:返回子串 strl
在字符串 str
中第一次出现的位置
字符串逆序函数
REVERSE(s)
将所有字符串逆序
返回参数列表中指定位置的字符串
ELT(n,s1,s2,s3...)
返回第 n+1
个参数,n=1
返回 s1
,以此类推
若 n
小于 1 或大于参数数目,返回 null
返回字符串在参数列表中的位置
FIELD(s,s1,s2,s3...)
返回字符串 s
在参数列表 s1,s2,s3...
中第一次出现的位置,找不到则返回 0
用法示例:
SELECT *,IFNULL(ELT(FIELD(type,'1','2','3','4'),'来源A','来源B','来源C','来源D'),'未知') name from order;
返回子串的位置
FIND_IN_SET(s1,s2)
s2
是逗号分割的字符串组成的列表
返回字符串 s1
在字符串列表 s2
中第一次出现的位置,找不到则返回 0
日期时间函数
获取当前的日期
CURDATE()
#等效用法
CURRENT_DATE()
返回字符串格式或者数字格式,取决于使用的上下文语境
获取当前时间
CURTIME()
#等效用法
CURRENT_TIME()
返回字符串格式或者数字格式,取决于使用的上下文语境
获取当前日期和时间
NOW()
#等效用法
SYSDATE()
LOCALTIME()
CURRENT_TIMESTAMP()
返回字符串格式或者数字格式,取决于使用的上下文语境
获取 UNIX 时间戳
UNIX_TIMESTAMP(date)
返回一个时间戳(1970-01-01 00:00:00 GMT 之后的秒数)。
如果未指定 date
则返回截止到当前时间的秒数,如果指定了 date
则返回截止到指定时间的秒数
将 UNIX 时间戳转换为时间
FROM_UNIXTIME(date)
date
参数为必选
获取 UTC 日期
UTC_DATE()
返回字符串格式或者数字格式,取决于使用的上下文语境
获取 UTC 时间
UTC_TIME()
返回字符串格式或者数字格式,取决于使用的上下文语境
获取年份
YEAR(date)
获取季度
QUARTER(date)
获取月份
MONTH(date)
返回数字形式的月份,1-12
获取第几周
WEEK(date)
获取小时
HOUR(date)
获取分钟
MINITE(date)
获取秒数
SECOND(date)
获取指定日期是当年的第几天
DAYOFYEAR(date)
获取指定日期是当月的第几天
DAYOFMONTH(date)
获取指定日期是当前周的第几天
DAYOFWEEK(date)
1-星期日,2-星期一,3-星期二…
获取字符串形式的月份
MONTHNAME(date)
返回字符串形式的月份
获取字符串形式的星期
DAYNAME(date)
获取工作日索引
WEEKDAY(date)
返回工作日索引(0-星期一,1-星期二…)
时间转换为秒数
TIME_TO_SEC(time)
时间转换为距离当天零点过去的秒数
秒数转换为时间
SEC_TO_TIME(seconds)
日期的加运算
DATE_ADD(date,INTERVAL exp type)
#等效用法
ADDDATE(date,INTERVAL exp type)
date 原始日期
exp 增加的日期或时间间隔的数值
type 增加的日期或时间间隔的类型
给指定日期增加一定时间间隔
还可以直接使用 +
运算符:
NOW() + INTERVAL 1 DAY
日期的减运算
DATE_SUB(date,INTERVAL exp type)
#等效用法
SUBDATE(date,INTERVAL exp type)
date 原始日期
exp 减去的日期或时间间隔的数值
type 减去的日期或时间间隔的类型
给指定日期减去一定时间间隔
还可以直接使用 -
运算符
NOW() - INTERVAL 1 DAY
时间的加运算
ADDTIME(date,exp)
给指定日期增加一定时间间隔,exp
是冒号分割的时分秒表达式
时间的减运算
SUBTIME(date,exp)
给指定日期减去一定时间间隔,exp
是冒号分割的时分秒表达式
计算两个日期的间隔天数
DATEDIFF(date1,date2)
date1
小于 date2
返回负值
只考虑日期,不考虑时间: DATEDIFF("2019-08-11 23:59:59","2019-08-12 00:00:00")
返回 -1
格式化日期
DATE_FORMAT(date,format)
格式化时间
TIME_FORMAT(time,format)
流程控制函数
IF
IF(exp,v1,v2)
如果 exp
不等于 0 也不为 null
,则返回 v1
否则返回 v2
注意区分 IF
函数 和 IF
语句。IF
语句只能在存储过程中使用
IFNULL
IFNULL(v1,v2)
如果 v1
不为 null
则返回 v1
,否则返回 v2
CASE
语法:
CASE exp WHEN v1 THEN r1[WHEN v2 THEN r2][ELSE rn] END
CASE
语句既能在 SQL 中使用,也能在存储过程中使用
加解密函数
加密用户的密码
PASSWORD(str)
计算字符串的 MD5 值
MD5(str)
指定密码加密指定字符串
ENCODE(str,pwd)
用指定密码解密指定的加密串
DECODE(crypt_str,pwd)
锁定函数
获取命名锁
GET_LOCK(str,timeout)
str 锁的名称
timeout 当前操作的超时时间,没有获取到时会先等待
成功返回 1,超时返回 0,发生错误返回 null
释放所有命名锁
RELEASE_ALL_LOCKS()
释放当前会话持有的所有命名锁,并返回释放的锁数(如果没有则返回0)
释放一个命名锁
RELEASE_LOCK(str)
解开一个锁,只能解开当前连接的锁,不能解开其他连接的锁
成功解锁返回 1,锁不是当前连接创建的返回 0,锁不存在返回 null
检查锁是否是自由状态
IS_FREE_LOCK(str)
锁不存在返回 1,锁存在返回 0,发生错误返回 null
检查锁是否是被使用状态
IS_USED_LOCK(str)
锁存在返回使用该锁的连接ID ,否则返回 null
系统信息函数
获取 MySQL 版本号
VERSION()
获取当前连接的ID
CONNECTION_ID()
获取当前数据库
DATABASE()
#等效用法
SCHEMA()
获取当前用户名
USER()
#等效用法
CURRENT_USER()
SYSTEM_USER()
SESSION_USER()
获取字符串的字符集和排序方式
CHARSET(str)
获取最后一个自动生成的ID
LAST_INSERT_ID()
其他函数
格式化
FORMAT(x,n)
将数字 x
格式化,并以四舍五入的方式保留小数点后 n
位。若 n
小于等于 0 则近似到个位
x
小数点位数不足的补零,例如:
SELECT FORMAT(1.23,3);//返回 1.230
不同进制之间转换
CONV(N,from,to)
N 原始值
from 原始进制
to 转换后的进制
IP字符串点地址转换为数值地址
INET_ATON(exp)
给出字符串网络点地址,返回数值网络地址
IP数值地址转换为字符串点地址
INET_NTOA(exp)
给出数值网络地址,返回字符串网络点地址
重复执行指定操作
BENCHMARK(count,exp)
表达式 exp
被重复执行 count
次,返回执行的总时间
改变字符集
CONVERT(str USING charset)
改变数据类型
CONVERT(x, type)
#等效用法
CAST(x AS type)
休眠暂停
SLEEP(s)
聚合函数
聚合函数对同一个分组的数据进行处理,没有显式使用 GROUP BY
语句则整个表为一个分组
统计记录行总数
COUNT(expr)
返回表达式不为 null 的值的总个数。
表达式为 *
时返回检索的行数,无论是否包含 null 值
求总和
SUM(x)
返回一个分组中,指定字段的值的总和
求平均值
AVG(x)
返回一个分组中,指定字段的值的平均数
求最大值
MAX(x)
返回一个分组中,指定字段的最大值
求最小值
MIN(x)
返回一个分组中,指定字段的最小值
拼接
GROUP_CONCAT(expr,separator)
将一个分组中的所有值拼接成字符串,可以通过 separator
指定分隔符(默认为逗号 ,
)
按位与
BIT_AND(x)
返回一个分组中所有值按位与之后的结果
按位或
BIT_OR(x)
返回一个分组中所有值按位或之后的结果
一个经典的例子:
select bit_count(bit_or(1<<day)) from t group by year,month;
BIT_COUNT
获取二进制里有多少位 1
按位异或
BIT_XOR(x)
返回一个分组中所有值按位异或之后的结果
窗口函数
详见 MySQL 窗口操作