数学函数
-
GREATEST[greatest]():获取一组数中的最大值。 -
LEAST[least]():获取一组数中的最小值。 -
FLOOR[floor]():获取小于一个数的最大整数值(向下取整)。 -
CEILING[ceiling]():获取大于一个数的最小整数值(向上取整)。 -
ROUND[round]():获取一个数的四舍五入的整数值。 -
ROUND[round](x,d):获取一个数四舍五入保留固定小数的数值。x指要处理的数,d是指保留几位小数。
这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0; -
TRUNCATE[truncate]():把一个数字截取为指定小数个数的数字。x指要处理的数,d是指保留几位小数。
这里有个值得注意的地方是,当小数位数超过d位,其他后边的数字直接舍去,不会进行四舍五入;当小数位数不够d位,补0。 -
ABS[abs]():获取一个数的绝对值。 -
SIGN[sign]():返回数字的符号,正数(1)、负数(-1)、零(0)。 -
SQRT[sqrt]():返回一个数的平方根。 -
POW[pow](x,y):返回X的Y次方。 -
SIN[sin]()/COS[cos]()/TAN[tan]():返回一个角度(弧度)的正弦、余弦和正切值。 -
ASIN[asin]()/ACOS[acos]()/ATAN[atan]():返回一个角度(弧度)的反正弦、反余弦和反正切值。 -
RADIANS[radians](x):返回x的弧度值,从度转换为弧度。 -
DEGREES[degrees](x):返回x的角度值,从弧度转换为角度值。 -
PI[pi]():返回Π(pi)的值。默认的显示小数位数是7位,然而 MySQL内部会使用完全双精度值。 -
BIN[bin]()/OCT[oct]()/HEX[hex]():返回一个数的二进制、八进制和十六进制值,这个值作为字符串返回。 -
EXP[exp](X):返回值e(自然对数的底)的x次方。 -
LN[ln](X):返回x的自然对数,即x相对于基数e的对数。 -
LOG[log](x,y):返回x的以y为底的对数。 -
MOD[bin]():返回x/y的模(余数)。 -
RAND[rand]()/RAND[rand](N):返回[0,1]内的随机值。若已指定一个整数参数N ,则它被用作种子值,用来生成一个指定的值。
聚合函数
聚合函数常常用于对一组值进行计算,然后返回单个值。
聚合函数通常与GROUP BY子句一起使用。如果SELECT语句中有一个GROUP BY子句,则这个聚合函数对不同分组下的所有列起作用;如果没有,则SELECT语句只产生一行作为结果。
测试数据如下:
-
COUNT[count](col):返回指定列中非NULL值的个数。
-
MAX[max](col):返回指定列的最大值。
-
MIN[min](col):返回指定列的最小值。
-
SUM[sum](col):返回指定列的所有值之和。
-
AVG[avg](col):返回指定列的平均值。
-
VARIANCE[variance](col):返回指定列的方差。
方差的计算说明:
- 计算相关列的平均值;
- 求列中的每一个值和平均值的差;
- 计算差值的平方的总和;
- 用总和除以(列中的)值的结果。
-
STDDEV/STD[stddev/std](col):返回指定列的标准差。标准差等于方差的平均根,因此STDDEV(col)和SQRT(VARIANCE(col))这两个表达式是相等的。
-
GROUP_CONCAT[group_concat]([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’]):返回由属于一组的列值连接组合而成的结果。默认多值之间用’,'分割,不过还可以去重,排序以及指定分隔符。
-
BIT_AND\BIT_OR\BIT_XOR[bit_and\bit_or\bit_xor]]():与二进制运算符&(与) 、|(或)和^(异或)相对应的聚合函数,返回一列中的所有值进行与运算、或运算及异或运算后的结果。
BIN()用于将结果转换为二进制位:
字符串函数
-
ASCII[ascii](char):返回字符的ascii码值。
-
CHAR[char](x1,x2,x3…):将x1、x2、x3…的ASCII码转换为字符,结果组合成一个字符串。
-
LEFT\RIGHT[left\right](str,x):分别返回从字符串左边和右边开始指定的x个字符。
-
TRIM\LTRIM\RTRIM[trim\ltrim\rtrim](str):删除字符串首部和尾部的所有空格、删除字符串前面(左边)的空格以及删除字符串尾部(右边)的空格。
-
LPAD\RPAD[lpad\rpad](str,n,pad):分别用字符串pad对字符串str的左边和右边进行填补直至str中字符数目达到n个,最后返回填补后的字符串。若str中的字符数目大于n,则返回str的前n个字符。
-
REPLACE[replace](str1,str2,str3):用字符串str3替换str1中所有出现的字符串str2,最后返回替换后的字符串。
-
CONCAT[concat](s1,s2,…,sn):用于连接指定的几个字符串。
-
CONCAT_WS[concat_ws](separator,s1,s2,…,sn):用于连接指定的几个字符串,并用指定分隔符分割。
-
SUBSTRING[substring](str,start,length):截取字符串str,start、length均为整型,前者指定子串的开始位置,后者指定子串的长度。
-
LENGTH[length](str):返回一个字符串的长度。
-
STRCMP[strcmp](s1,s2):比较两个字符串,如果这两个字符串相等返回0,如果s1根据当前排序顺序小于s2返回-1,否则返回1。
-
BIT_LENGTH[bit_length](str):返回字符串的比特长度。注意,在获取字符串比特长度时,不同编码获取的比特长度是不一样的。
-
INSERT[insert](str,x,y,instr):将字符串str从第x位置开始的y个字符替换位字符串instr,并返回替换后的字符串。
-
FIND_IN_SET[find_in_set](str,list):分析逗号分割的list列表,如果存在str,返回str在list中的位置,如果没有str,返回0。
-
LCASE\LOWER[lcase\lower](str):将字符串str中所有字符转变为小写并返回。
-
UCASE\UPPER[ucase\upper](str):将字符串str中所有字符转变为大写并返回。
- POSITION[position](substr IN str):返回子串substr在字符串str中第一次出现的位置。
- LOCATE[locate](substr,str):返回子串substr在字符串str中第一次出现的位置。
-
INSTR[instr](str, substr):返回子串substr在字符串str中第一次出现的位置,与LOCATE()只是参数的顺序相反。
-
REPEAT[repeat](str,x):返回字符串str重复x次的结果。
-
REVERSE[reverse](str):返回字符顺序颠倒的字符串str。
- QUOTE[quote](str):用反斜杠转义str中的单引号。
日期时间函数
-
NOW[now]():返回当前的日期和时间,它以YYYY-MM-DD HH:MM:SS的格式返回当前的日期和时间。
-
CURDATE\CURRENT_DATE[curdate\current_date]():返回当前日期。
-
CURTIME\CURRENT_TIME[curtime\current_time]():返回当前时间。
-
YEAR[year]():返回时间日期值中的年份部分。
-
MONTH\MONTHNAME[month\monthname]():分别以数值和字符串的格式返回时间日期值中月的部分。
-
DAY\DAYNAME[day\dayname]():分别以数值和字符串的格式返回时间日期值中天的部分。
-
HOUR\MINUTE\SECOND[hour\minute\second]():返回指定时间值的小时、分钟和秒的部分。
-
DAYOFYEAR\DAYOFMONTH\DAYOFWEEK[dayofyear\dayofmonth\dayofweek]():返回这一天在一年,一月及一星期中的序号。
-
WEEK\YEARWEEK[week\yearweek]():返回指定日期是一年的第几个星期、是哪一年的第几个星期。
-
DATE_ADD\DATE_SUB[date_add\date_sub](date,INTERVAL int keyword):对日期和时间进行添加和减少时间间隔的算数操作。
说明:
date:需要的日期和时间。
INTERVAL:关键字表示一个时间间隔。
int:需要计算的时间值。
keyword:间隔值的关键字。
关键字列表
| 关键字 | 间隔值的格式 | 关键字 | 间隔值的格式 |
|---|---|---|---|
| DAY | 日期 | MINUTE | 分钟 |
| DAY_HOUR | 日期:小时 | MINUTE_SECOND | 分钟:秒 |
| DAY_MINUTE | 日期:小时:分钟 | MONTH | 月 |
| DAY_SECOND | 日期:小时:分钟:秒 | SECOND | 秒 |
| HOUR | 小时 | YEAR | 年 |
| HOUR_MINUTE | 小时:分钟 | YEAR_MONTH | 年-月 |
| HOUR_SECOND | 小时:分钟:秒 |
-
DATE_FORMAT[date_format](date,format):返回以不同的格式显示日期/时间数据。
说明:
date:需要的日期和时间。
format:规定日期/时间的输出格式。
输出格式列表
| 格式 | 描述 |
|---|---|
| %a | 缩写星期名 |
| %b | 缩写月名 |
| %c | 月,数值 |
| %D | 带有英文前缀的月中的天 |
| %d | 月的天,数值(00-31) |
| %e | 月的天,数值(0-31) |
| %f | 微妙 |
| %H | 小时(00-23) |
| %h | 小时(01-12) |
| %I | 小时(01-12) |
| %i | 分钟,数值(00-59) |
| %j | 年的天(001-366) |
| %k | 小时(0-23) |
| %l | 小时(1-12) |
| %M | 月名 |
| %m | 月,数值(00-12) |
| %p | AM或PM |
| %r | 时间,12-小时(hh:mm:ss AM或PM) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %T | 时间,24-小时(hh:mm:ss) |
| %U | 周(00-53)星期日是一周的第一天 |
| %u | 周(00-53)星期一是一周的第一天 |
| %V | 周(01-53)星期日是一周的第一天,与%X使用 |
| %v | 周(01-53)星期日是一周的第一天,与%x使用 |
| %W | 星期名 |
| %w | 周的天(0=星期日,6=星期六) |
| %X | 年,其中的星期日是周的第一天,4位,与%V使用 |
| %x | 年,其中的星期一是周的第一天,4位,与%v使用 |
| %Y | 年,4位 |
| %y | 年,2位 |
-
UNIX_TIMESTAMP[unix_timestamp](datetime):把日期\时间转换成时间戳形式。
-
FROM_UNIXTIME[from_unixtime](ts,fmt):根据指定的fmt格式,格式化unix时间戳ts。
-
QUARTER[quarter](date):返回date在一年中的季度(1-4)。
控制流函数
-
IFNULL[ifnull](expr1,expr2):判断参数expr1是否为NULL,当参数expr1为NULL时返回expr2,不为NULL时返回expr1。返回值是数字或字符串。
-
NULLIF[nullif](expr1,expr2):用于检验expr1与expr2是否相等,如果相等,则返回NULL,如果不相等则返回expr1。
-
ISNULL[isnull](expr):判断expr是否为NULL,如果为空则返回1,否则返回0。
-
IF[ifl](expr1, expr2, expr3):expr1是要被判断的表达式,如果表达式为真,则返回第二个参数expr2;如果为假,则返回第三个参数expr3。
-
CASE WHEN [test1] THEN [result1] … ELSE [default] END:如果test(n)为真,则返回result(n),否则返回default。
-
CASE [test] WHEN [val1] THEN [result1] … ELSE [default] END:如果test=val(n),则返回result(n),否则返回default。
格式化函数
-
FORMAT[format](x,y):将数值格式化为整数或者带几位小数的浮点数(四舍五入)。参数x是被格式化的数据,参数y是结果的小数位数。
-
DATE_FORMAT\TIME_FORMAT[date_format\time_format](date|time,fmt):用来格式化日期和时间值。date和time是需要格式化的日期和时间值,fmt是日期和时间值格式化的形式。
说明 :
date:需要的日期和时间。
format:规定日期/时间的输出格式。
输出格式列表
| 格式 | 描述 |
|---|---|
| %a | 缩写星期名 |
| %b | 缩写月名 |
| %c | 月,数值 |
| %D | 带有英文前缀的月中的天 |
| %d | 月的天,数值(00-31) |
| %e | 月的天,数值(0-31) |
| %f | 微妙 |
| %H | 小时(00-23) |
| %h | 小时(01-12) |
| %I | 小时(01-12) |
| %i | 分钟,数值(00-59) |
| %j | 年的天(001-366) |
| %k | 小时(0-23) |
| %l | 小时(1-12) |
| %M | 月名 |
| %m | 月,数值(00-12) |
| %p | AM或PM |
| %r | 时间,12-小时(hh:mm:ss AM或PM) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %T | 时间,24-小时(hh:mm:ss) |
| %U | 周(00-53)星期日是一周的第一天 |
| %u | 周(00-53)星期一是一周的第一天 |
| %V | 周(01-53)星期日是一周的第一天,与%X使用 |
| %v | 周(01-53)星期日是一周的第一天,与%x使用 |
| %W | 星期名 |
| %w | 周的天(0=星期日,6=星期六) |
| %X | 年,其中的星期日是周的第一天,4位,与%V使用 |
| %x | 年,其中的星期一是周的第一天,4位,与%v使用 |
| %Y | 年,4位 |
| %y | 年,2位 |
-
INET_ATON \INET_NTOA[inet_ntoa\inet_aton]():前者可以把IP地址转换为数字,后者可以把数字转换为IP地址。
类型转换函数
-
CAST[cast](expr AS type):把当前数值转换成指定类型的值,但并不会改变值列的数据类型。expr是要转换的值,type是转换后的数据类型。
 -
CONVERT[convert](expr,type):把当前数值转换成指定类型的值,但并不会改变值列的数据类型。expr是要转换的值,type是转换后的数据类型。
说明 :
type数据类型,为以下八种之一:BINARY(二进制)、CHAR(字符型)、DATE(日期)、TIME(时间)、DATETIME(日期时间型)、DECIMAL(浮点数)、SIGNED(整数)和UNSIGNED(无符号整数)
加密函数
-
AES_ENCRYPT\AES_DECRYPT[aes_encrypt\aes_decrypt](str,key):前者返回的是**key对字符串str利用高级加密标准(AES)算法加密后的结果,结果是一个二进制的字符串,以BLOB类型存储;后者返回的是对前者加密后的数据进行解密后的结果,若检测到无效数据或不正确的填充,则返回NULL。两者可以被看作MySQL中普遍使用的最安全的加密函数。
-
ENCODE\DECODE[encode\decode](str,key):前者用来对一个字符串str进行加密,返回的结果是一个二进制字符串,以BLOB类型存储;后者使用正确的**对前者加密后的值进行解密。对比上面的两个加密函数,这两个加密程度相对较弱。
-
PASSWORD[password](str):返回字符串str加密后的密码字符串,适合于插入到MySQL的安全系统。该加密过程不可逆,和UNIX密码加密过程使用不同的算法。主要用于MySQL的认证系统。
-
MD5[md5](str):计算字符串str的md5校验和。
-
SHA[sha](str):计算字符串str的安全散列算法(sha)校验和。
- ENCRYPT[encrypt](str,salt):使用UNIX crypt()系统加密字符串,接收要加密的字符串和用于加密过程的salt(一个可以确定唯一口令的字符串)。在Windows上不可用。
系统信息函数
-
DATABASE[database]():返回当前数据库名。
-
USER\SYSTEM_USER[user\system_user]():返回当前登录用户名。
-
VERSION[version]():返回MySQL服务器版本。
-
BENCHMARK[benchmark](n,expr):将表达式expr重复运行n次。它可以被用于计算MySQL处理表达式的速度。结果值通常为零。另一种用处来自MySQL客户端内部,能够报告问询执行的次数,根据经过的时间值可以推断服务器的性能。
说明 :
本例中得出MySQL计算ENCODE(‘hello’,’goodbye’)加密字符串10000000次需要1.29秒。
-
CONNECTION_ID[connection_id]():返回当前客户的连接ID。
-
FOUND_ROWS[found_rows]():将返回最后一个SELECT查询(没有以LIMIT语句进行限制)返回的记录行数。
-
CHARSET[charset](str):返回字符串str的字符集。
其他系统信息函数扩展
- GET_LOCK[get_lock](str,dur):获得一个由字符串str命名的并且由dur秒延时的锁定。
- IS_FREE_LOCK[is_free_lock](str):检查以str命名的锁定是否释放。
- LAST_INSERT_ID[last_insert_id]():返回由系统自动产生的最后一个AUTOINCREMENT ID的值。
- MASTER_POS_WAIT[master_pos_wait](log,pos,dur):锁定主服务器dur秒直到从服务器的日志log指定的位置pos同步。
- RELEASE_LOCK[release_lock](str):释放由字符串str命名的锁定。
函数使用建议
- MySQL的函数使用会影响查询速度。
- 如果在Java后端或MySQL中都可以使用某函数解决问题,建议在Java后端进行处理。
- 在MySQL中查询时使用函数,最大的坏处会使得索引无法使用。如在where条件中,对某列使用函数,则该列索引便不会再发挥作用。