本文介绍MySQL常用函数。
字符函数
1 | ASCII(char) --返回字符的ASCII码值 |
函数 | 说明 |
---|---|
LEFT() 、RIGHT() | 左边或者右边的字符 |
LOWER() 、UPPER() | 转换为小写或者大写 |
LTRIM() 、RTIM() | 去除左边或者右边的空格 |
LENGTH() | 长度 |
SOUNDEX() | 转换为语音值 |
其中,SOUNDEX()
可以将一个字符串转换为描述其语音表示的字母数字模式。
length:获取字节个数(utf-8 一个汉字为3个字节,gbk为2个字节)
1 | SELECT LENGTH('Fcant') -- 输出 5 |
concat:拼接字符串
1 | SELECT CONCAT('F','_','cant') -- 输出 F_cant |
upper:将字母变成大写
1 | SELECT UPPER('fcant') -- 输出 FCANT |
lower:将字母变成小写
1 | SELECT LOWER('FCANT') -- 输出 fcant |
substr / substring:裁剪字符串,该方法进行了重构
1 | substr(str,pos) -- str:要裁剪的字符串 , pos:要裁剪的长度 |
instr:返回子串第一次出现的索引,如果没有则返回0
1 | SELECT INSTR('Fcant','F') -- 输出 1 (mysql是从1开始算位数) |
trim:字符串去【字符】
1 | SELECT TRIM(' fcant ') -- 输出 fcant |
lpad:用指定字符实现左填充指定长度
1 | SELECT LPAD('fcant',6,'*') -- 输出 *fcant |
rpad:用指定字符实现右填充指定长度
1 | SELECT RPAD('fcant',6,'*') -- 输出 fcant* |
replace 替换
1 | SELECT REPLACE('爱睡觉','睡觉','吃饭') -- 输出 爱吃饭 |
数学函数
1 | ABS(x) --返回x的绝对值 |
函数 | 说明 |
---|---|
SIN() | 正弦 |
COS() | 余弦 |
TAN() | 正切 |
ABS() | 绝对值 |
SQRT() | 平方根 |
MOD() | 余数 |
EXP() | 指数 |
PI() | 圆周率 |
RAND() | 随机数 |
round:四舍五入
1 | SELECT round(1.5) -- 输出 2 |
ceil:向上取整,返回>=该参数的最小整数
1 | SELECT CEIL(1.5); # 输出 2 |
floor:向下取整,返回<=该参数的最大整数
1 | SELECT FLOOR(1.5); -- 输出 1 |
truncate:截断
1 | SELECT TRUNCATE(3.1415926,2); -- 输出 3.14 |
mod:取余
1 | SELECT MOD(10,3); -- 输出 1 |
日期函数
1 | CURDATE()或CURRENT_DATE() |
- 日期格式:
YYYY-MM-DD
- 时间格式:
HH:MM:SS
函 数 | 说 明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
now:返回当前系统日期+时间
1 | SELECT NOW() -- 输出 2020-02-16 11:43:21 |
curdate:返回当前系统日期,不包含时间
1 | SELECT CURDATE() -- 输出 2020-02-16 |
curtime:返回当前时间,不包含日期
1 | SELECT CURTIME() -- 输出 11:45:35 |
year/month/day 可以获取指定的部分,年、月、日、小时、分钟、秒
1 | SELECT YEAR(NOW()) -- 输出 2020 其他用法一致 |
str_to_date:将字符通过指定的格式转换成日期
1 | SELECT STR_TO_DATE('02-17 2020','%c-%d %Y') -- 输出 2020-02-17 |
date_format:将日期转换成字符
1 | SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') -- 输出 2020年02月17日 |
datediff:两个日期天数之差
1 | SELECT DATEDIFF(NOW(),'2020-02-12') -- 输出 5 |
TIMESTAMPDIFF:计算两个日期之间的差值
1 | SELECT TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2); |
TIMESTAMPDIFF函数,有参数设置,可以精确到天(DAY)、小时(HOUR),分钟(MINUTE)和秒(SECOND),使用起来比datediff函数更加灵活。对于比较的两个时间,时间小的放在前面,时间大的放在后面。
TIMESTAMPDIFF函数返回begin-end的结果,其中begin和end是DATE或DATETIME表达式
unit参数是确定(end-begin)的结果的单位,表示为整数。 以下是有效单位:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- YEAR
统计汇总/聚合函数
1 | AVG(X) --返回指定列的平均值 |
函 数 | 说 明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
AVG()
会忽略 NULL 行。
使用 DISTINCT
可以让汇总函数值汇总不同的值。
流程控制函数
1 | CASE WHEN [test1] THEN [result1]...ELSE [default] END |
if 函数:类似三目运算
1 | SELECT IF(10<5,'大','小') -- 输出 小 |
switch case 的效果-类似于多重if
1 | case 要判断的字段或表达式 |
加密函数
1 | AES_ENCRYPT(str,key) |
格式化函数
1 | DATE_FORMAT(date,fmt) |
类型转化函数
1 | 为了进行数据类型转化,MySQL提供了CAST()函数, |
系统信息函数
1 | DATABASE() --返回当前数据库名 |
开窗函数
MySQL8.0版本开始支持开窗函数,后续单开文章详解开窗函数。
1 | ROW_NUMBER() OVER() --排序:1,2,3,4 |