1、数学函数
名称
描述
CEIL()
进一取整
FLOOR()
舍一取整
MOD
取余数(取模)
POWER()
幂运算
ROUND()
四舍五入
TRUNCATE()
数字截取
ABS()
取绝对值
PI()
圆周率
RAND()和RAND(X)
返回0-1之间的随机数,RAND(X)X相同时返回的随机数相同
SIGN(X)
返回X的符号,X为负数、0、正数分别返回-1、0、1
EXP(X)
计算e的几次方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 mysql> SELECT CEIL(1.2),CEILING(1.2); + | CEIL(1.2) | CEILING(1.2) | + | 2 | 2 | + 1 row in set (0.00 sec) mysql> SELECT FLOOR (3.14 ); + | FLOOR(3.14) | + | 3 | + 1 row in set (0.00 sec) mysql> SELECT MOD (3 ,8 ); + | MOD(3,8) | + | 3 | + 1 row in set (0.00 sec) mysql> SELECT POW (2 ,3 ),POWER (3 ,3 ); + | POW(2,3) | POWER(3,3) | + | 8 | 27 | + 1 row in set (0.01 sec) mysql> SELECT ROUND (3.14567 ,2 ); + | ROUND(3.14567,2) | + | 3.15 | + 1 row in set (0.00 sec) mysql> SELECT TRUNCATE (3.14567 ,2 ); + | TRUNCATE (3.14567 ,2 ) | + | 3.14 | + 1 row in set (0.00 sec)mysql> SELECT ABS (-12 ); + | ABS(-12) | + | 12 | + 1 row in set (0.00 sec) mysql> SELECT PI (); + | PI() | + | 3.141593 | + 1 row in set (0.00 sec) mysql> SELECT RAND (); + | RAND() | + | 0.09555218936461228 | + 1 row in set (0.00 sec) mysql> SELECT RAND(1); #这样得到的数是一样的 + | RAND(1) | + | 0.40540353712197724 | + 1 row in set (0.00 sec) mysql> SELECT SIGN (12 ),SIGN (0 ),SIGN (-12 ); + | SIGN(12) | SIGN(0) | SIGN(-12) | + | 1 | 0 | -1 | + 1 row in set (0.00 sec) mysql> SELECT EXP (3 ); + | EXP(3) | + | 20.085536923187668 | + 1 row in set (0.00 sec)
2、字符串函数
名称
描述
CHAR_LENGTH(S)
返回字符串的字符数
LENGTH
返回字符串的长度
CONCAT(S1,S2…)
将字符串合并为一个字符串
CONCAT_WS(X1,S1,S2…)
以指定分隔符连接字符串
UPPER(S)/UCASE(S)
将字符串转为大写
LOWER(S)/LCASE(S)
将字符串转为小写
LEFT(S,N)/RIGHT(S,N)
返回字符串的前/后n个字符
LPAD(S1,LEN,S2)/RPAD(S1,LEN,S2)
将字符串S1用S2填充到指定的LEN
LTRIM(S)/RTRIM(S)/TRIM(S)
去掉字符串中的空格
TRIM(S1 FROM S)
去掉字符串s中开始处和结尾处的字符串s1
REPEAT(S,N)
重复字符串指定次数
SPACE(N)
返回N个空格
REPLACE(S,S1,S2)
将字符串S中搜索S1替换成S2
STRCMP(S1,S2)
比较字符串,>=<分别返回1,0,-1
SUBSTRING(S,N,LEN)
截取字符串
REVERSE(S)
反转字符串
ELT(N,S1,S2…)
返回指定位置的字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT CHAR_LENGTH('test'),LENGTH('test'); + | CHAR_LENGTH('test') | LENGTH('test') | + | 4 | 4 | + 1 row in set (0.00 sec) mysql> SELECT CHAR_LENGTH ('嘿' ),LENGTH ('嘿' ); + | CHAR_LENGTH('嘿') | LENGTH('嘿') | + | 1 | 3 | + 1 row in set (0.00 sec)
需要注意的是在UTF8下一个汉字的长度为3,但字符数为1。 而CONCAT
是将两个字符串拼接:
1 2 3 4 5 6 7 mysql> SELECT CONCAT('HELLO','WORLD'); + | CONCAT('HELLO','WORLD') | + | HELLOWORLD | + 1 row in set (0.00 sec)
例如将用户名后面拼接下划线:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT id,CONCAT(username,'_')FROM student; + | id | CONCAT(username,'_') | + | 1 | king_ | | 2 | king1_ | | 3 | king2_ | | 4 | king3_ | | 5 | king4_ | | 6 | king5_ | | 7 | king6_ | | 8 | king7_ | | 9 | king8_ | + 9 rows in set (0.00 sec)
注意: 当拼接的字符中有null
时,结果为 NULL
:
1 2 3 4 5 6 7 mysql> SELECT CONCAT('a','b',null); + | CONCAT('a','b',null) | + | NULL | + 1 row in set (0.00 sec)
CONCAT_WS是以特定的字符串连接字符:
1 2 3 4 5 6 7 mysql> SELECT CONCAT_WS('-!-','a','b','c'); + | CONCAT_WS('-!-','a','b','c') | + | a-!-b-!-c | + 1 row in set (0.00 sec)
注意: 当拼接的字符中有null
时,结果为 NULL
,但是如果是连接的内容中有null
是结果不为NULL
。 UPPER|UCASE和LOWER|UCASE,大小写转化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT UPPER('this is a test'),UCASE('this is a test'); + | UPPER('this is a test') | UCASE('this is a test') | + | THIS IS A TEST | THIS IS A TEST | + 1 row in set (0.00 sec) mysql> SELECT LOWER ('HELLO WORLD' ),LCASE ('HELLO WORLD' ); + | LOWER('HELLO WORLD') | LCASE('HELLO WORLD') | + | hello world | hello world | + 1 row in set (0.00 sec)
通过LEFT
和RIGHT
返回字符串的前几个或后几个字符:
1 2 3 4 5 6 7 mysql> SELECT LEFT('ABCDEF',2),RIGHT('ABCDEF',2); + | LEFT('ABCDEF',2) | RIGHT('ABCDEF',2) | + | AB | EF | + 1 row in set (0.00 sec)
通过LPAD
或RPAD
在指定位置填充字符:
1 2 3 4 5 6 7 mysql> SELECT LPAD('A',5,'?'),RPAD('A',5,'!'); # 填充到5个字符 + | LPAD('A',5,'?') | RPAD('A',5,'!') | + | ????A | A!!!! | + 1 row in set (0.00 sec)
通过TRIM()
、LTRIM()
、RTRIM()
来去除空格、左空格、右空格
1 2 3 4 5 6 7 mysql> SELECT CONCAT('_',TRIM(' ABC '),'_'),CONCAT('_',LTRIM(' ABC '),'_'),CONCAT('_',RTRIM(' ABC '),'_'); + | CONCAT('_',TRIM(' ABC '),'_') | CONCAT('_',LTRIM(' ABC '),'_') | CONCAT('_',RTRIM(' ABC '),'_') | + | _ABC_ | _ABC _ | _ ABC_ | + 1 row in set (0.00 sec)
可以通过TRIM(S1 FROM S2)
和REPEAT()
来去除指定字符和重复指定字符:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 mysql> SELECT TRIM('A' FROM 'ABCBCA'); + | TRIM('A' FROM 'ABCBCA') | + | BCBC | + 1 row in set (0.00 sec) mysql> SELECT REPEAT ('H' ,5 ); + | REPEAT('H',5) | + | HHHHH | + 1 row in set (0.00 sec) `` ` ` SPACE (n)`返回n分空格: ` `` SQL mysql> SELECT CONCAT ('_' ,SPACE (5 ),'_' ); + | CONCAT('_',SPACE(5),'_') | + | _ _ | + 1 row in set (0.00 sec)
REPLACE
实现字符替换:
1 2 3 4 5 6 7 mysql> SELECT REPLACE('ABCBCA','A','_'); # 区分大小写 + | REPLACE ('ABCBCA' ,'A' ,'_' ) | + | _BCBC_ | + 1 row in set (0.00 sec)
STRCMP
比较大小写:
1 2 3 4 5 6 7 mysql> SELECT STRCMP('A','A'),STRCMP('A','a'),STRCMP('B','A'); # 不区分大小写 + | STRCMP('A','A') | STRCMP('A','a') | STRCMP('B','A') | + | 0 | 0 | 1 | + 1 row in set (0.00 sec)
SUBSTRING
字符串截取:
1 2 3 4 5 6 7 mysql> SELECT SUBSTRING('ABCDEF',2,2); + | SUBSTRING('ABCDEF',2,2) | + | BC | + 1 row in set (0.00 sec)
代表从第2个字符开始截取2位,字符串下标从1开始。REVERSE
实现字符串翻转:
1 2 3 4 5 6 7 mysql> SELECT REVERSE('ABC'); + | REVERSE('ABC') | + | CBA | + 1 row in set (0.00 sec)
ELT
返回指定位置的字符:
1 2 3 4 5 6 7 mysql> SELECT ELT(2,'A','B','C'); + | ELT(2,'A','B','C') | + | B | + 1 row in set (0.00 sec)
3、日期时间函数
名称
描述
CURDATE(),CURRENT_DATE()
返回当前日期
CURTIME(),CURRENT_TIME()
返回当前时间
NOW()
返回当前日期和时间
MONTH(D)
返回日期中月份的值
MINTHNAME(D)
返回日期中月份名称,如:January
DAYNAME(D)
返回日期是几,如:Monday
DAYOFWEEK(D)
返回一周内的第几天,1代表星期日
WEEKDAY(D)
返回日期是星期几,0代表星期一
WEEK(D)
一年中的第几个星期
YEAR(D)
返回年份值
HOUR(T)
返回小时值
MINUTE(T)
返回分钟值
SECOND(T)
返回秒数
DATEDIFF(D1,D2)
计算两个日期之间相隔的天数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 mysql> SELECT CURDATE(),CURRENT_DATE(); + | CURDATE() | CURRENT_DATE() | + | 2017-10-12 | 2017-10-12 | + 1 row in set (0.00 sec) mysql> SELECT CURTIME (),CURRENT_TIME (); + | CURTIME() | CURRENT_TIME() | + | 17:32:27 | 17:32:27 | + 1 row in set (0.00 sec) mysql> SELECT NOW (); + | NOW() | + | 2017-10-12 17:32:27 | + 1 row in set (0.00 sec) mysql> SELECT MONTH ('2015-1-3' ); + | MONTH('2015-1-3') | + | 1 | + 1 row in set (0.00 sec) mysql> SELECT MONTH (NOW ()); + | MONTH(NOW()) | + | 10 | + 1 row in set (0.00 sec) mysql> SELECT MONTHNAME(NOW ()); + | MONTHNAME(NOW()) | + | October | + 1 row in set (0.01 sec) mysql> SELECT DAYNAME (NOW ()); + | DAYNAME(NOW()) | + | Thursday | + 1 row in set (0.00 sec) mysql> SELECT DAYOFWEEK (NOW ()); + | DAYOFWEEK(NOW()) | + | 5 | + 1 row in set (0.00 sec) mysql> SELECT WEEKDAY (NOW ()); + | WEEKDAY(NOW()) | + | 3 | + 1 row in set (0.00 sec) mysql> SELECT WEEK (NOW ()); + | WEEK(NOW()) | + | 41 | + 1 row in set (0.00 sec) mysql> SELECT YEAR (NOW ()); + | YEAR(NOW()) | + | 2017 | + 1 row in set (0.00 sec) mysql> SELECT HOUR (NOW ()); + | HOUR(NOW()) | + | 17 | + 1 row in set (0.00 sec) mysql> SELECT MINUTE (NOW ()); + | MINUTE(NOW()) | + | 32 | + 1 row in set (0.00 sec) mysql> SELECT SECOND (NOW ()); + | SECOND(NOW()) | + | 27 | + 1 row in set (0.00 sec) mysql> SELECT DATEDIFF (CURRENT_DATE (),'1990-1-1' ); + | DATEDIFF(CURRENT_DATE(),'1990-1-1') | + | 10146 | + 1 row in set (0.00 sec)
4、条件判断函数
名称
描述
IF(EXPR,V1,V2)
如果表达式EXPR成立,返回结果V1,否则V2
IFNULL(V1,V2)
如果V1的不为空就显示V1的值,否则V2
CASE WHEN exp1 THEN v1[WHEN exp2 THEN v2][ELSE vn] END
CASE表示函数开始,END表示函数介绍。如果表达式exp1成立时返回v1,如果表达式exp2成立时返回v2的值,以此类推,最后玉带ELSE时返回vn
IF(EXPR,V1,V2)
以学员表为例,分数大于60输出及格,否则输出不及格:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT id,username,score,IF(score>=60,'及格','不及格') AS ’输出‘ FROM student; + | id | username | score | ’输出‘ | + | 1 | king | 95 | 及格 | | 2 | king1 | 35 | 不及格 | | 3 | king2 | 45 | 不及格 | | 4 | king3 | 55 | 不及格 | | 5 | king4 | 65 | 及格 | | 6 | king5 | 75 | 及格 | | 7 | king6 | 80 | 及格 | | 8 | king7 | 90 | 及格 | | 9 | king8 | 25 | 不及格 | + 9 rows in set (0.01 sec)
IFNULL(V1,V2)
,在cms_user
表中学员id为12的用户年龄为NULL,测试一下显示为100:
1 2 3 4 5 6 7 8 9 mysql> SELECT id,username,age,IFNULL(age,'100')FROM cms_user WHERE id>10;# WHERE 条件为了少显示一部分数据 + | id | username | age | IFNULL(age,'100') | + | 11 | john | 65 | 65 | | 12 | test1 | NULL | 100 | | 13 | TEST2 | 18 | 18 | + 3 rows in set (0.00 sec)
1 2 CASE WHEN exp1 THEN v1[WHEN exp2 THEN v2][ELSE vn] END # CASE 表示开始,END 表示结束,exp1为真,返回v1,否则exp2,为真返回v2,否则返回vn
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT id,username,score, CASE WHEN score>60 THEN '不错' WHEN score=60 THEN '刚及格' ELSE '没及格' END FROM student; + | id | username | score | CASE WHEN score>60 THEN '不错' WHEN score=60 THEN '刚及格' ELSE '没及格' END | + | 1 | king | 95 | 不错 | | 2 | king1 | 35 | 没及格 | | 3 | king2 | 45 | 没及格 | | 4 | king3 | 55 | 没及格 | | 5 | king4 | 65 | 不错 | | 6 | king5 | 75 | 不错 | | 7 | king6 | 80 | 不错 | | 8 | king7 | 90 | 不错 | | 9 | king8 | 25 | 没及格 | + 9 rows in set (0.00 sec)
5、系统信息函数
名称
描述
VERSION()
返回数据库的版本号
CONNECTION_ID
返回服务器的连接数
DATABASE(),SCHEMA()
返回当前数据库名
USER(),SYSTEM_USER()
返回当前用户
CURRENT_USER(),CURRENT_USER
返回当前用户
CHARSET(STR)
返回字符串STR的字符集
COLLATION(STR)
返回字符串STR的校验字符集
LAST_INSERT_ID()
返回最近生成的AUTO_INCREMENT值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 mysql> SELECT VERSION(); + | VERSION() | + | 5.7.19 | + 1 row in set (0.00 sec) mysql> SELECT CONNECTION_ID(); + | CONNECTION_ID() | + | 12 | + 1 row in set (0.00 sec) mysql> SELECT DATABASE (),SCHEMA (); + | DATABASE() | SCHEMA() | + | cms | cms | + 1 row in set (0.00 sec) mysql> SELECT USER (),SYSTEM_USER (); + | USER() | SYSTEM_USER() | + | root@localhost | root@localhost | + 1 row in set (0.00 sec) mysql> SELECT CURRENT_USER (),CURRENT_USER ; + | CURRENT_USER() | CURRENT_USER | + | root@localhost | root@localhost | + 1 row in set (0.00 sec) mysql> SELECT CHARSET ('AAA' ); + | CHARSET('AAA') | + | utf8 | + 1 row in set (0.00 sec) mysql> SELECT COLLATION ('AAA' ); + | COLLATION('AAA') | + | utf8_general_ci | + 1 row in set (0.00 sec) mysql> SELECT LAST_INSERT_ID (); + | LAST_INSERT_ID() | + | 0 | + 1 row in set (0.00 sec)
6、加密函数
名称
描述
MD5(str)
信息摘要算法
PASSWORD(str)
密码算法
ENCODE(str,pwd_str)
加密结果是一二进制数,必须使用BLOB类型字段保存
DECODE(crypt_str,pwd_str)
对通过ENCODE加密之后的内容解密
MD5(str)
加密后会返回32位的字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> SELECT MD5('ADMIN'); + | MD5('ADMIN') | + | 73acd9a5972130b75066c82595a1fae3 | + 1 row in set (0.00 sec) mysql> SELECT LENGTH (MD5 ('ADMIN' )); + | LENGTH(MD5('ADMIN')) | + | 32 | + 1 row in set (0.00 sec)
PASSWORD(str)
主要是对密码进行加密:
1 2 3 4 5 6 7 mysql> SELECT PASSWORD('root'); + | PASSWORD('root') | + | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | + 1 row in set , 1 warning (0.00 sec)
剩下两种用的少,暂不了解
7、其他常用函数
名称
描述
FORMAT(x,n)
将数字x进行格式化,将x保留到小数点后n位
ASCLL(s)
返回字符串s的第一个字符的ASCLL码
BIN(x)
返回x的二进制编码
HEX(x)
返回x的十六进制编码
OCT(x)
返回x的八进制编码
CONV(x,f1,f2)
将x从f1进制数变成f2进制数
INET_ATON(IP)
将IP地址转化为数字
INET_NTOA(n)
将数值转化成IP地址
GET_LOCT(name,time)
定义锁
RELEASE_LOCK(name)
解锁
FORMAT(x,n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 mysql> SELECT FORMAT(3.14567,2); + | FORMAT(3.14567,2) | + | 3.15 | + 1 row in set (0.00 sec) mysql> SELECT ASCII ('abc' ); + | ASCII('abc') | + | 97 | + 1 row in set (0.02 sec) mysql> SELECT BIN (5 ),HEX (5 ),OCT (5 ); + | BIN(5) | HEX(5) | OCT(5) | + | 101 | 5 | 5 | + 1 row in set (0.02 sec) mysql> SELECT CONV (5 ,10 ,2 ); + | CONV(5,10,2) | + | 101 | + 1 row in set (0.00 sec) mysql> SELECT INET_ATON ('127.0.0.1' ); + | INET_ATON('127.0.0.1') | + | 2130706433 | + 1 row in set (0.06 sec) mysql> SELECT INET_NTOA (2130706433 ); + | INET_NTOA(2130706433) | + | 127.0.0.1 | + 1 row in set (0.02 sec) mysql> SELECT GET_LOCK ('KING' ,10 ); + | GET_LOCK('KING',10) | + | 1 | + 1 row in set (0.05 sec) mysql> SELECT IS_FREE_LOCK ('KING' ); + | IS_FREE_LOCK('KING') | + | 0 | + 1 row in set (0.00 sec) mysql> SELECT RELEASE_LOCK ('KING' ); + | RELEASE_LOCK('KING') | + | 1 | + 1 row in set (0.00 sec)