MySQL中提供了许多内置函数:
内置函数
一、数学函数
ROUND(x, y)
返回参数x的四舍五入的有y位小数的值
RAND()
返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
二、聚合函数(常用于GROUP BY从句的SELECT查询中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col)返回由属于一组的列值连接组合而成的结果
三、字符串函数
CHAR_LENGTH(str)
返回值为字符串str的长度,长度的单位为字符。一个多字节字符算作一个单字符。
CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL,则返回值为NULL。
CONCAT_WS(separator, str1, str2, ...)
字符串拼接(自定义连接符)
CONCAT_WS() 不会忽略任何空字符串。(然而会忽略所有的NULL)。
CONV(N, from_base, to_base)
进制转换
例如:
SELECT CONV('a', 16, 2); 表示将a由16进制转换为2进制字符串表示
FORMAT(X, D)
将数字X的格式写为‘#,###,###.##’,以四舍五入的方式保留小数点后D位,并将结果以字符串的形式返回。若D为0,则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4);结果为'12,332.1000'
INSERT(str, pos, len, newstr)
在str的指定位置插入字符串
pos:要替换位置起始位置
len:替换的长度
newstr:新字符串
特别的:
如果pos超过原字符串长度,则返回原字符串
如果len超过原字符串长度,则由新字符串完全替换
INSERT(str, substr)
返回字符串str中子字符串的第一个出现位置。
LEFT(str, len)
返回字符串str从开始的len位置的子序列字符。
LOWER(str)
变小写
UPPER(str)
变大写
REVERSE(str)
返回字符串str,顺序和字符顺序相反。
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不带有len参数的格式从字符串str返回一个子字符串,起始于位置pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置pos。使用FROM的格式为标准SQL语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos字符,而不是字符串的开头位置。在以下格式的函数中可以对pos使用一个负值。
mysql> select substring('Quadratically',5); +------------------------------+ | substring('Quadratically',5) | +------------------------------+ | ratically | +------------------------------+ 1 row in set (0.00 sec) mysql> select substring('foobarbar' from 4); +-------------------------------+ | substring('foobarbar' from 4) | +-------------------------------+ | barbar | +-------------------------------+ 1 row in set (0.00 sec) mysql> select substring('Quadratically',5,6) -> ; +--------------------------------+ | substring('Quadratically',5,6) | +--------------------------------+ | ratica | +--------------------------------+ 1 row in set (0.00 sec) mysql> select substring('Sakila',-3); +------------------------+ | substring('Sakila',-3) | +------------------------+ | ila | +------------------------+ 1 row in set (0.00 sec) mysql> select substring('Sakila',-5,3); +--------------------------+ | substring('Sakila',-5,3) | +--------------------------+ | aki | +--------------------------+ 1 row in set (0.00 sec) mysql> select substring('Sakila' from -4 for 2); +-----------------------------------+ | substring('Sakila' from -4 for 2) | +-----------------------------------+ | ki | +-----------------------------------+ 1 row in set (0.00 sec)
四、日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1-7)
DAYOFMONTH(date) 返回date所代表的是一个月的第几天(1-31)
DAYOFYEAR(date) 返回date是一年的第几天(1-366)
DAYNAME(date) 返回date的星期名,如:select dayname(current_date);
FROM_UNIXTIME(ts, fmt) 根据指定的fmt格式,格式化unix时间戳ts
HOUR(time) 返回time的小时值(0~23)
MINUTE(time) 返回time的分钟值(0~59)
MONTH(time) 返回date的月份值(1~12)
MONTHNAME(date) 返回date的月份名,如:select monthname(current_date);
NOW() 返回当前的日期和时间
QUARTER(date) 返回date在一年中的季节(1~4),如select quarter(currter_date);
WEEK(date) 返回日期date为一年中第几个星期(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
重点:
date_format(date, format)根据format字符串格式化date值
mysql> select date_format('2009-10-04 22:23:00','%W %M %Y'); +-----------------------------------------------+ | date_format('2009-10-04 22:23:00','%W %M %Y') | +-----------------------------------------------+ | Sunday October 2009 | +-----------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_format('2007-10-04 22:23:00','%H:%i:%s'); +-----------------------------------------------+ | date_format('2007-10-04 22:23:00','%H:%i:%s') | +-----------------------------------------------+ | 22:23:00 | +-----------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_format('1900-10-04 22:23:00','%D %y %a %d %m %b %j'); +-----------------------------------------------------------+ | date_format('1900-10-04 22:23:00','%D %y %a %d %m %b %j') | +-----------------------------------------------------------+ | 4th 00 Thu 04 10 Oct 277 | +-----------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_format('1997-10-04 22:23:00','%H %k %I %r %T %S %w'); +-----------------------------------------------------------+ | date_format('1997-10-04 22:23:00','%H %k %I %r %T %S %w') | +-----------------------------------------------------------+ | 22 22 10 10:23:00 PM 22:23:00 00 6 | +-----------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select date_format('1999-01-01','%x %V'); +-----------------------------------+ | date_format('1999-01-01','%x %V') | +-----------------------------------+ | 1998 52 | +-----------------------------------+ 1 row in set (0.00 sec) mysql> select date_format('2006-06-00','%d'); +--------------------------------+ | date_format('2006-06-00','%d') | +--------------------------------+ | 00 | +--------------------------------+ 1 row in set (0.00 sec)
五、加密函数
MD5()
计算字符串str的MD5校验和
PASSWORD(str)
返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
六、控制流函数
CASE WHEN [test1] THEN [result1] ... ELSE [default] END
如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN [vall] THEN [result] ... ELSE [default] END
如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f)
如果test是真,返回t;否则返回f
IF NULL(arg1,arg2)
如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2)
如果arg1=arg2返回NULL;否则返回arg1
举例:
# 1、博客园 时间处理 CREATE TABLE blog ( id INT PRIMARY KEY auto_increment, NAME CHAR (32), sub_time datetime ); #2、插入数据 INSERT INTO blog (NAME, sub_time) VALUES ('第1篇','2015-03-01 11:31:21'), ('第2篇','2015-03-11 16:31:21'), ('第3篇','2016-07-01 10:21:31'), ('第4篇','2016-07-22 09:23:21'), ('第5篇','2016-07-23 10:11:11'), ('第6篇','2016-07-25 11:21:31'), ('第7篇','2017-03-01 15:33:21'), ('第8篇','2017-03-01 17:32:21'), ('第9篇','2017-03-01 18:31:21'); #3. 提取sub_time字段的值,按照格式后的结果即"年月"来分组 SELECT DATE_FORMAT(sub_time,'%Y-%m') as y_m,COUNT(1) as num FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m'); # 结果: +---------+-----+ | y_m | num | +---------+-----+ | 2015-03 | 2 | | 2016-07 | 4 | | 2017-03 | 3 | +---------+-----+ rows in set (0.00 sec)