函数表示对输入参数值返回一个具有特定关系的值,在mysql中使用函数可以极大的提高用户对数据库的管理效率。Mysql中的函数主要有数学函数,字符串函数,日期函数,时间函数以及条件判断函数、系统信息函数和加密函数等。
流程控制函数主要用于根据满足条件的不同,执行相应的流程,mysql中流程控制函数主要有IF()、IFNULL()、CASH、以及NULLIF()。
(1)IF(expr,v1,v2)函数
IF(expr,v1,v2)函数中如果expr是TRUE,则返回v1,否则返回v2。IF()返回的值可以是数字或字符串。
# 使用if判断语句
mysql> select if(2>1,1,2),if(strcmp('test','test123'),'false',true);
+-------------+-------------------------------------------+
| if(2>1,1,2) | if(strcmp('test','test123'),'false',true) |
+-------------+-------------------------------------------+
| 1 | false |
+-------------+-------------------------------------------+
(2)IFNULL(v1,v2)函数
IFNULL(v1,v2)函数中,如果v1不为null,则IFNULL的返回值为v1,否则为v2。
# IFNULL()函数的应用
mysql> SELECT IFNULL(0,1),IFNULL(NULL,2),IFNULL(1/0,'wrong');
+-------------+----------------+---------------------+
| IFNULL(0,1) | IFNULL(NULL,2) | IFNULL(1/0,'wrong') |
+-------------+----------------+---------------------+
| 0 | 2 | wrong |
+-------------+----------------+---------------------+
# 查看teacher表中的name值,如果为空则使用”null”
mysql> select name,ifnull(name,'other') from teacher;
+-------+----------------------+
| name | ifnull(name,'other') |
+-------+----------------------+
| NULL | other |
| carey | carey |
+-------+----------------------+
(3)CASE函数
语法格式为:CASE expr WHEN v1 THEN r1 [when v2 THEN r2] [ELSE m] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
如果expr值等于vn,则返回对应vn位置后面的结果rn,如果都不匹配,则返回ELSE后面的m。
# 查询teacher表中信息,并将查询语句使用别名
mysql> select case dept_id when 2 then 'english' when 3 then 'maths' else 'other' end course_name,dept_id from teacher;
+-------------+---------+
| course_name | dept_id |
+-------------+---------+
| english | 2 |
| maths | 3 |
+-------------+---------+
# 将上面的语句写成条件判断语句
mysql> select case when dept_id=2 then 'english' when dept_id=3 then 'maths' else 'other' end course_name,ifnull(name,'other_teacher'),dept_id from teacher;
+-------------+------------------------------+---------+
| course_name | ifnull(name,'other_teacher') | dept_id |
+-------------+------------------------------+---------+
| maths | other_teacher | 3 |
| english | carey | 2 |
+-------------+------------------------------+---------+
(4)NULLIF(expr1,expr2)
当expr1等于expr2时,则返回null,否则返回expr1
# nullif函数应用
mysql> select nullif(1,1),nullif(1,2);
+-------------+-------------+
| nullif(1,1) | nullif(1,2) |
+-------------+-------------+
| NULL | 1 |
+-------------+-------------+
(1)ASCII(str)
返回str字符串中最左边字符的ascii码值,如果是空串则返回0,如果str是null则返回null。
# 返回字符串对应的ASCII码
mysql> SELECT ASCII('6'),ASCII('AB'),ASCII(''),ASCII(' ');
+------------+-------------+-----------+------------+
| ASCII('6') | ASCII('AB') | ASCII('') | ASCII(' ') |
+------------+-------------+-----------+------------+
| 54 | 65 | 0 | 32 |
+------------+-------------+-----------+------------+
(2)CHAR(N,... [USING charset_name])
将括号中的N转化成ascii码对应的字符,返回这些字符组成的字符串,其中的null会被忽略。
# 将ascii码转化成字符
mysql> select char(77,121,83,81,'76'),char(77,'77.77');
+-------------------------+------------------+
| char(77,121,83,81,'76') | char(77,'77.77') |
+-------------------------+------------------+
| MySQL | MM |
+-------------------------+------------------+
(3)CHAR_LENGTH(str)
返回字符串的长度
# 返回字符串长度
mysql> select char_length('mysql');
+----------------------+
| char_length('mysql') |
+----------------------+
| 5 |
+----------------------+
(4)CONCAT(str1,str2,...)
将括号里所有参数连接在一起,当有’null’时返回’null’
mysql> select concat('hell','o',',','my','sql'),concat(null,'test');
+-----------------------------------+---------------------+
| concat('hell','o',',','my','sql') | concat(null,'test') |
+-----------------------------------+---------------------+
| hello,mysql | NULL |
+-----------------------------------+---------------------+
(5)CONCAT_WS(separator,str1,str2,...)
返回以第一个参数为分隔符的连接后的一个字符串,当有参数为NULL时则null被忽略。
(6)INSERT(str,pos,len,newstr)
将str中从pos位置开始后的len个字符替换成newstr字符串。
mysql> select insert('aaabbb',3,3,'zzz');
+----------------------------+
| insert('aaabbb',3,3,'zzz') |
+----------------------------+
| aazzzb |
+----------------------------+
(7)INSTR(str,substr)
返回str字符串中第一个出现substr字符串的位置
(8)LEFT(str,len)
返回str字符串中从左边开始的len个长度的字符
(9)LENGTH(str)
返回str字符串的byte字节长度
(10)LOAD_FILE(file_name)
读取文件且返回文件内容为字符串
(11)LOCATE(substr,str)
返回str字符串中第一次出现substr字符串的位置,如果没有则返回null
(12)LOCATE(substr,str,pos)
返回str字符串中从pos位置开始第一次出现substr字符串的位置,如果没有则返回null
(13)LOWER(str)
返回将str字符串中所有字符变换成小写后的字符串,但对二进制文本无效
(14)LPAD(str,len,padstr)
将str的左边补充为padstr,直到补充成len长度的字符串并返回;如果str的长度比len长,则返回str中最左边开始的len长度的字符
(15)LTRIM(str)
将str最左边的空格去掉并返回
(16)REPEAT(str,count)
将str重复count并组合成字符串返回,如果count<1,则返回空串
(17)REPLACE(str,from_str,to_str)
将所有str字符串中匹配from_str子串的地方都替换成to_str子字符串
(18)REVERSE(str)
将str字符串中的字符按照倒序组合并返回
(19)RIGHT(str,len)
将str字符串中从右边开始的len个字符返回
(20)RPAD(str,len,padstr)
将字符串str从右边开始补充为padstr直到整体长度为len,如果str的长度本身大于len,则返回str中len长度的字符串
(21)RTRIM(str)
将字符串str右边的空格去掉并返回
(22)SPACE(N)
返回N个长度的空格组成的空字符串
(23)SUBSTRING_INDEX(str,delim,count)
当count为正数,则返回delim出现在str字符串中第count次之前的子字符串,如果是负数,则从右边开始计算
mysql> select substring_index('www.mysql.org','.','2') AS A,substring_index('www.mysql.org','.','-2') AS B;
+-----------+-----------+
| A | B |
+-----------+-----------+
| www.mysql | mysql.org |
+-----------+-----------+
(24)UPPER(str)
返回将str字符串中所有字符转换成大写的字符串。
(25)STRCMP(expr1,expr2)
字符串对比函数,当expr1等于expr2时等于0,当expr1小于expr2时为-1,反之为1
(1)ABS(X):绝对值函数
mysql> select abs(-1),abs(100),abs(0);
+---------+----------+--------+
| abs(-1) | abs(100) | abs(0) |
+---------+----------+--------+
| 1 | 100 | 0 |
+---------+----------+--------+
(2)CEILING(X)/CEIL(X):返回>=X值的最小整数
(3)FLOOR(X):返回<=X值的最大整数
mysql> select ceiling(12.13),ceil(12.13),floor(13.14);
+----------------+-------------+--------------+
| ceiling(12.13) | ceil(12.13) | floor(13.14) |
+----------------+-------------+--------------+
| 13 | 13 | 13 |
+----------------+-------------+--------------+
(4)MOD(N,M), N % M, N MOD M
取余数操作,返回两者相除之后剩下的余数
mysql> select mod(99,8),99%8,99 mod 8;
+-----------+------+----------+
| mod(99,8) | 99%8 | 99 mod 8 |
+-----------+------+----------+
| 3 | 3 | 3 |
+-----------+------+----------+
(5)RAND([N])
获取0到1之间的随机小数
# 获取一个随机数,并获取100以内的随机小数
mysql> select rand(),floor(rand()*100);
+--------------------+-------------------+
| rand() | floor(rand()*100) |
+--------------------+-------------------+
| 0.9055193242668355 | 32 |
+--------------------+-------------------+
(6)ROUND(X), ROUND(X,D)
四舍五入为D位个小数,当D参数不存在是,则默认为0
(7)TRUNCATE(X,D)
数字X只保留D位的小数,其余均舍弃
(1)CURDATE(),CURRENT_DATE()
CURDATE()和CURRENT_DATE()函数作用相同,将当前的日期按照’YYYY-MM-DD’或’YYYYMMDD’格式的值返回。
mysql> select curdate(),current_date(),curdate()+0,current_date()+0;
+------------+----------------+-------------+------------------+
| curdate() | current_date() | curdate()+0 | current_date()+0 |
+------------+----------------+-------------+------------------+
| 2018-09-25 | 2018-09-25 | 20180925 | 20180925 |
+------------+----------------+-------------+------------------+
(2)CURTIME(),CURRENT_TIME()
CURTIME()和CURRENT_TIME()函数作用相同,将当前的时间以’HH:MM:SS’或’HHMMSS’格式返回
mysql> select curtime(),current_time(),curtime()+0,current_time()+0;
+-----------+----------------+-------------+------------------+
| curtime() | current_time() | curtime()+0 | current_time()+0 |
+-----------+----------------+-------------+------------------+
| 04:02:25 | 04:02:25 | 40225 | 40225 |
+-----------+----------------+-------------+------------------+
(3)CURRENT_TIMESTAMP(),LOCALTIME(),NOW(),SYSDATE()
这四个函数的作用相同,均返回当前的日期及时间,返回的日期时间格式可以自行设定。
mysql> select current_timestamp(),localtime()+0,now(),sysdate()+0;
+---------------------+----------------+-----------------+-------------+
| current_timestamp() | localtime()+0 | now() | sysdate()+0 |
+---------------------+----------------+-----------------+-------------+
|2018-09-25 04:06:42 |20180925040642|2018-09-25 04:06:42|20180925040642|
+---------------------+----------------+-----------------+-------------+
(4)UNIX_TIMESTAMP(date),FROM_UNIXTIME(date)
UNIX_TIMESTAMP(date)函数为时间戳函数,若无时间参数,则返回当前时间的时间戳。
FROM_UNIXTIME(date)函数则把时间戳转化为时间
mysql> select unix_timestamp() AS dateA,unix_timestamp(now()) AS dateB,unix_timestamp(20180926163033) AS dateC,FROM_UNIXTIME(1537863364) AS dateD;
+------------+------------+------------+---------------------+
| dateA | dateB | dateC | dateD |
+------------+------------+------------+---------------------+
| 1537863465 | 1537863465 | 1537993833 | 2018-09-25 04:16:04 |
+------------+------------+------------+---------------------+
(5)UTC_DATE(),UTC_TIME()
UTC_DATE()用于返回当前UTC的日期值,UTC_TIME()用于返回当前UTC的时间值。
(6)MONTH(date),MONTHNAME(date)
MONTH(date)函数用于返回date对应的月份,MONTHNAME(date)函数用于返回日期date对应月份的英文全名。
(7)DAYNAME(d),DAYOFWEEK(d),WEEKDAY(d)
DAYNAME(d)函数返回d对应的星期的英文名称,DAYOFWEEK(d)函数返回d对应的一周中索引(1表示周日,依次类推),WEEKDAY(d)函数返回d对应的工作日索引(0表示周一,依次类推)。
mysql> select dayname(20180926),dayofweek(now()),weekday(20180926);
+-------------------+------------------+-------------------+
| dayname(20180926) | dayofweek(now()) | weekday(20180926) |
+-------------------+------------------+-------------------+
| Wednesday | 3 | 2 |
+-------------------+------------------+-------------------+
(8)WEEK(d),WEEKOFYEAR(d)
WEEK(d)和WEEKOFYEAR(d)函数都用于计算日期d是一年中的第几周。
(9)DAYOFYEAR(d),DAYOFMONTH(d)
DAYOFYEAR(d)用于返回日期d是一年中的第几天,DAYOFMONTH(d)函数用于返回日期d是一月中的第几天。
(10)YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time)
YEAR(date)函数用于返回(date)对应的年,QUARTER(date)函数用于返回一年中的季度值,MINUTE(time)用于返回time对应的分钟数,SECOND(time)用于返回time对应的秒数。
(11)EXTRACT(type FROM date)
EXTRACT(type FROM date)函数用于提取从日期中提取一部分。
mysql> select extract(year from '2018-09-26') as year,extract(day from '2018-09-26') as day,extract(minute from '2018-09-26 17:25:30') as minute;
+------+------+--------+
| year | day | minute |
+------+------+--------+
| 2018 | 26 | 25 |
+------+------+--------+
(12)TIME_TO_SEC(time),SEC_TO_TIME(seconds)
TIME_TO_SEC(time)函数用于将秒转化为时间格式,SEC_TO_TIME(seconds)函数用于将秒转化成时间格式。
(13)DATE_ADD(),ADDDATE(),DATE_SUB(),SUBDATE()、ADDTIME()、SUBTIME()、DATE_DIFF()
DATE_ADD(date,INTERVAL expr type)函数和DATE_SUB(date,INTERVAL expr type)函数的作用相同,执行日期的加运算
DATE_SUB(date,INTERVAL expr type)函数和SUBDATE(date,INTERVAL expr type)函数的作用相同,执行日期的减运算。
# 对时间的加减运算操作
mysql> select date_add('2018-09-27',interval 1 day) as addday,adddate('2018-09-27 10:55:22',interval 1 second) as addsec,date_sub('2018-09-27',interval 1 month) as sub_month,adddate('2018-09-27 10:55:22',interval '3:3' hour_minute) as sub_hour_minute;
+------------+---------------------+------------+---------------------+
| addday | addsec | sub_month | sub_hour_minute |
+------------+---------------------+------------+---------------------+
| 2018-09-28 | 2018-09-27 10:55:23 | 2018-08-27 | 2018-09-27 13:58:22 |
+------------+---------------------+------------+---------------------+
ADDTIME(date,expr)函数将expr值添加到date,并返回修改后的值
SUBTIME(date,expr)函数将从date中减去expr值,并返回修改后的值
# 对时间的加减
mysql> select subtime('2018-09-27 11:02:02','01:02:02') as sub_time,addtime('2018-09-27 11:02:02','00:57:58') as add_time;
+---------------------+---------------------+
| sub_time | add_time |
+---------------------+---------------------+
| 2018-09-27 10:00:00 | 2018-09-27 12:00:00 |
+---------------------+---------------------+
DATEDIFF(date1,date2)函数用于返回起始时间date1和结束时间date2之间的天数。
(14)日期时间格式化函数DATE_FORMAT(date,format),TIME_FORMAT(time,format),GET_FORMAT(val_type,format_type)
DATE_FORMAT(date,format)根据format指定的格式显示date值。
TIME_FORMAT(time,format)根据format字符串安排time值的格式
GET_FORMAT(val_type,format_type)返回日期时间字符串的显示格式,val_type表示日期数据类型,format_type表示格式化显示类型。
更多的时间日期格式参考mysql官方文档(https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html)
# 对时间的类型进行格式化
mysql> select date_format('2018-09-27 11:50:20','%Y%m%d %W') as date,time_format(curtime(),'%H:%i') as time,get_format(DATETIME,'ISO') as datetime_fromat_iso,date_format(now(),get_format(DATE,'ISO')) as format;
+-------------------+-------+---------------------+------------+
| date | time | datetime_fromat_iso | format |
+-------------------+-------+---------------------+------------+
| 20180927 Thursday | 01:12 | %Y-%m-%d %H:%i:%s | 2018-09-27 |
+-------------------+-------+---------------------+------------+
(1)获取MYSQL版本号、连接数和数据库名的函数
VERSION():返回指示MYSQL服务器版本的字符串。
CONNECTION_ID():返回mysql服务器当前连接的次数
DATABASE()、SCHEMA()函数均用于返回使用utf8字符集的当前默认数据库名
# 获取mysql数据库的一些信息
mysql> select version(),connection_id(),database(),schema();
+-----------+-----------------+------------+----------+
| version() | connection_id() | database() | schema() |
+-----------+-----------------+------------+----------+
| 5.7.23 | 9 | mysql | mysql |
+-----------+-----------------+------------+----------+
# 查看正在连接mysql的用户
mysql> show processlist;
+----+------+-----------+--------+---------+------+-------+----------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+--------+---------+------+-------+----------+
| 9 | root | localhost | course | Query | 0 | starting | show processlist |
+----+------+-----------+--------+--------+------+-------+----------+
(2)获取用户名的函数
USER(),CURRENT_USER(),SYSTEM_USER()及SESSION_USER()函数均用于返回当前被MYSQL服务器验证的用户名和主机名组合。
(3)获取字符串的字符集和排序方式函数
CHARSET(set)函数用于返回字符串自变量的字符集
COLLATION(str):返回字符串str字符排序方式
# 返回字符串的值以及排序方式
mysql> select charset('dayi123'),charset(convert('dayi123' USING latin1)) as charset,collation(_latin2 'dayi123');
+--------------------+---------+------------------------------+
| charset('dayi123') | charset | collation(_latin2 'dayi123') |
+--------------------+---------+------------------------------+
| utf8 | latin1 | latin2_general_ci |
+--------------------+---------+------------------------------+
(4)获取最后一个自动生成id值得函数
LAST_INSERT_ID()函数用于自动返回最后一个INSERT或UPDATE为AUTO_INCREMENT列设置的第一个发生的值。
# 获取最后一个自动生成的id值
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 101 |
+------------------+