一,字符串函数
函数 | 功能 |
---|---|
concat(s1,s2,s3,..sn) | 连接s1,s2...sn为一个字符串 |
insert(str,x,y,instr) | 将字符串str从第x位置开始,y个字符长的字串替换为字符串instr |
lower(str) | 将字符串str中所有字符变为小写 |
upper(str) | 将字符串str中所有字符变为大写 |
left(str,x) | 返回字符串str最左边的x 个字符 |
right(str,x) | 返回字符串str最右边的x个字符 |
lpad(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符长度 |
rpad(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符长度 |
ltrim(str) | 去掉字符串str左侧空格 |
rtrim(str) | 去掉字符串str行尾的空格 |
repeat(str,x) | 返回str重复x次的结果 |
replace(str,a,b) | 用字符串b替换字符串str中所有的a |
strcmp(s1,s2) | 比较字符串s1和s2 |
trim(str) | 去掉字符串尾部和首部的空格 |
substring(str,x,y) | 返回从字符串str的x位置起y个字符长度的字串 |
1,concat(s1,s2,...sn)
把“aa”,"bb"连接,注:任何字符串和null连接都为null
mysql> select concat("aa","bb"),concat("aa",null);+-------------------+-------------------+| concat("aa","bb") | concat("aa",null) |+-------------------+-------------------+| aabb | NULL |+-------------------+-------------------+1 row in set (0.01 sec)
2,insert(str,x,y,instr)
将字符串str从x位置开始,y个字符长的字串替换为instr
mysql> select insert('beijing2008you',12,3,'me');+------------------------------------+| insert('beijing2008you',12,3,'me') |+------------------------------------+| beijing2008me |+------------------------------------+1 row in set (0.00 sec)3,lower(str)和upper(str)
大小写转换,在字符串比较中,通常要将比较的字符串全部转换为大写或者小写
mysql> select lower('ABc'),upper('abC');+--------------+--------------+| lower('ABc') | upper('abC') |+--------------+--------------+| abc | ABC |+--------------+--------------+1 row in set (0.00 sec)4,left(str,x)和right(str,x)
分别返回字符串最左边的x个字符和最右边y个字符,注:如果第二个参数是null,那么将不返回任何字符串
mysql> select left('abc',2),right('abc',2),left('abc',null);+---------------+----------------+------------------+| left('abc',2) | right('abc',2) | left('abc',null) |+---------------+----------------+------------------+| ab | bc | NULL |+---------------+----------------+------------------+1 row in set (0.01 sec)5,lpad(str,n,pad)和rpad(str,n,pad)
用字符串pad对str最左边和最右边进行填充,直到长度为n个字符长度
mysql> select lpad('abc',6,'hj'),rpad('abc',6,'lm');+--------------------+--------------------+| lpad('abc',6,'hj') | rpad('abc',6,'lm') |+--------------------+--------------------+| hjhabc | abclml |+--------------------+--------------------+1 row in set (0.00 sec)6,ltrim,rtrim,trim
分别为去最左侧空格,最右侧空格,和去首尾空格
mysql> select concat(trim(" abc "),length(trim(' abc '))) as trim,concat(ltrim(' abc '),length(ltrim(' abc '))) as ltrim,rtrim(' abc ');+------+----------+--------------------+| trim | ltrim | rtrim(' abc ') |+------+----------+--------------------+| abc3 | abc 6 | abc |+------+----------+--------------------+1 row in set (0.00 sec)为了更直观的看到trim和ltrim的区别我在后面拼接了长度。
7,repeat(str,x)
返回str重复x次的结果
mysql> select repeat('abc',3);+-----------------+| repeat('abc',3) |+-----------------+| abcabcabc |+-----------------+1 row in set (0.00 sec)
8,replace(str,a,b)
用字符串b替换字符串str中所有出现的字符串a
mysql> select replace('abcabca','a','e');+----------------------------+| replace('abcabca','a','e') |+----------------------------+| ebcebce |+----------------------------+1 row in set (0.00 sec)
9,strcmp(s1,s2)
比较字符串s1和s2的ascii码值的大小,如果s1比s2小则返回-1,如果s1和s2相等,则返回0,如果s1大于s2,则返回1
mysql> select strcmp('abc','acb'),strcmp('abc','abc'),strcmp('cab','abc');+---------------------+---------------------+---------------------+| strcmp('abc','acb') | strcmp('abc','abc') | strcmp('cab','abc') |+---------------------+---------------------+---------------------+| -1 | 0 | 1 |+---------------------+---------------------+---------------------+1 row in set (0.00 sec)
二,数值函数
函数 | 功能 |
---|---|
abs(x) | 返回x的绝对值 |
ceil(x) | 返回大于x的最小整数 |
floor(x) | 返回小于x的最大整数 |
mod(x,y) | 返回x/y的模 |
rand() | 返回0~1内的随机数 |
round(x,y) | 返回参数x四舍五入有y喂小数的值 |
truncate(x,y) | 返回数字x截断为y位小数的结果 |
三,日期和时间函数
函数 | 功能 |
---|---|
curdate() | 返回当前日期 |
curtime() | 返回当前时间 |
now() | 返回当前的日期和时间 |
unix_timestamp(date) | 返回日期date的unix时间戳 |
from_unixtime | 返回unix时间戳的日期值 |
week(date) | 返回日期date为一年中的第几周 |
year(date) | 返回日期date的年份 |
hour(time) | 返回time的小时值 |
minute(time) | 返回time的分钟值 |
monthname(date) | 返回date的月份名 |
date_format(date,fmt) | 返回按字符串fmt格式化日期date值 |
date_add(date,interval expr type) | 返回一个日期或时间值加上一个时间间隔的时间值 |
datediff(expr,expr2) | 返回起始时间expr和结束时间expr2之间的天数 |
1,curdate(),curtime(),now(),unix_timestamp(date)
mysql> select curdate(),curtime(),now(),unix_timestamp(now());+------------+-----------+---------------------+-----------------------+| curdate() | curtime() | now() | unix_timestamp(now()) |+------------+-----------+---------------------+-----------------------+| 2016-09-29 | 18:40:58 | 2016-09-29 18:40:58 | 1475145658 |+------------+-----------+---------------------+-----------------------+1 row in set (0.01 sec)2,, from_unixtime
mysql> select from_unixtime(1475145658);+---------------------------+| from_unixtime(1475145658) |+---------------------------+| 2016-09-29 18:40:58 |+---------------------------+1 row in set (0.00 sec)3,week(date),year(date),hour(time),minute(time),monthname(date)
mysql> select week(now()),year(now()),hour(curtime()),minute(curtime()),monthname(now());+-------------+-------------+-----------------+-------------------+------------------+| week(now()) | year(now()) | hour(curtime()) | minute(curtime()) | monthname(now()) |+-------------+-------------+-----------------+-------------------+------------------+| 39 | 2016 | 18 | 46 | September |+-------------+-------------+-----------------+-------------------+------------------+1 row in set (0.00 sec)
4,dare_add(date,interval expr type)
在了解增加时间前我们先看一下有那些时间间隔:
表达式类型 | 描述 | 格式 |
---|---|---|
hour | 小时 | hh |
minute | 分 | mm |
second | 秒 | ss |
year | 年 | YY |
month | 月 | MM |
day | 日 | dd |
year_month | 年和月 | YY-MM |
day_hour | 日和小时 | DD hh |
day_minute | 日和分钟 | DD hh:mm |
day_scond | 日和秒 | DD hh:mm:ss |
hour_minute | 小时和分 | hh:mm |
hour_second | 小时和秒 | hh:ss |
minute_second | 分钟和秒 | mm:ss |
例子:第一列返回当前时间,第二列返回距离当前日期31天后的时间,第三列返回距当前日期一年两个月后的日期时间
mysql> select now() current,date_add(now(),interval 31 day) after31days,date_add(now(),interval '1_2' year_month) after_oneYear_twoMonth;+---------------------+---------------------+------------------------+| current | after31days | after_oneYear_twoMonth |+---------------------+---------------------+------------------------+| 2016-09-29 19:11:50 | 2016-10-30 19:11:50 | 2017-11-29 19:11:50 |+---------------------+---------------------+------------------------+1 row in set (0.00 sec)
当然,我们也可以得到当前日期以前的
例子,第一列返回当前时间,第二列返回距离当前日期31天前的时间,第三列返回距当前日期一年两个月前的日期时间
mysql> select now() current,date_add(now(),interval -31 day) after31days,date_add(now(),interval '-1_-2' year_month) after_oneYear_twoMonth;+---------------------+---------------------+------------------------+| current | after31days | after_oneYear_twoMonth |+---------------------+---------------------+------------------------+| 2016-09-29 19:14:04 | 2016-08-29 19:14:04 | 2015-07-29 19:14:04 |+---------------------+---------------------+------------------------+1 row in set (0.00 sec)5,计算两个日期之间相差的天数
mysql> select datediff(now(),'2015-12-15');+------------------------------+| datediff(now(),'2015-12-15') |+------------------------------+| 289 |+------------------------------+1 row in set (0.00 sec)四,流程函数
函数 | 功能 |
---|---|
if(value,t,f) | 如果value是真,返回t,否则返回f |
ifnull(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
case when[value] then[result]...else[default] end | 如果value1是真,返回result1,否则返回default |
case[expr] when[value] then[result]...else[default]end | 如果expr等于value1,返回result1,否则返回default |
例子:下面模拟了对职员薪水进行分类,首先创建并初始化一个职员薪水表
mysql> create table salary(user_id int,salary decimal(9,2));Query OK, 0 rows affected (0.48 sec)mysql> insert into salary(user_id,salary)values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);Query OK, 6 rows affected (0.10 sec)Records: 6 Duplicates: 0 Warnings: 0mysql> select user_id,salary from salary;+---------+---------+| user_id | salary |+---------+---------+| 1 | 1000.00 || 2 | 2000.00 || 3 | 3000.00 || 4 | 4000.00 || 5 | 5000.00 || 1 | NULL |+---------+---------+6 rows in set (0.00 sec)将salary>2000的标记为h,其他标记为l
mysql> select if(salary>2000,'h','l') grade from salary;+-------+| grade |+-------+| l || l || h || h || h || l |+-------+6 rows in set (0.00 sec)将null值替换为0
mysql> select ifnull(salary,0) sal from salary;+---------+| sal |+---------+| 1000.00 || 2000.00 || 3000.00 || 4000.00 || 5000.00 || 0.00 |+---------+6 rows in set (0.00 sec)
将salary<1000的标记为l,1000~2000的标记为m,>2000标记为h
mysql> select case when ifnull(salary,0)<1000 then 'l' when salary<2000 then 'm' else 'h' end sal from salary;+-----+| sal |+-----+| m || h || h || h || h || l |+-----+6 rows in set (0.00 sec)
五,其他常用的函数
函数 | 功能 |
---|---|
database() | 返回当前数据库名 |
version() | 返回当前数据库版本 |
user() | 返回当前数据库登陆用户名 |
inet_aton(ip) | 返回ip地址的数字表示 |
inet_ntoa(num) | 返回数字代表的ip地址 |
password(str) | 返回字符串str的加密版本 |
md5() | 返回字符串str的md5值 |
1,database(),version(),user()
mysql> select database(),version(),user();+------------+-------------------------+----------------+| database() | version() | user() |+------------+-------------------------+----------------+| test1 | 5.7.15-0ubuntu0.16.04.1 | root@localhost |+------------+-------------------------+----------------+1 row in set (0.00 sec)
2,inet_aton , inet_nton
mysql> select inet_aton('192.168.1.1');+--------------------------+| inet_aton('192.168.1.1') |+--------------------------+| 3232235777 |+--------------------------+1 row in set (0.02 sec)mysql> select inet_ntoa(3232235777 );+------------------------+| inet_ntoa(3232235777 ) |+------------------------+| 192.168.1.1 |+------------------------+1 row in set (0.00 sec)inet_aton和inet_nton函数的主要用途是将字符串的ip地址转换为数字表示的网络字节序,这样可以方便的进行ip或者网段的比较(根据ip地址转换成的数值去比较,而不能直接通过ip比较)。
3, password(str)
返回字符串str的加密版本,一个41位长的字符串,此函数指用来设置系统用户的密码,但是不能用来对应用的数据加密。如有应用方面有加密的需求,可以使用md5等加密实现。
mysql> select password('123456');+-------------------------------------------+| password('123456') |+-------------------------------------------+| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+-------------------------------------------+1 row in set, 1 warning (0.00 sec)4,md5(str)
返回字符串str的md5值,常用来对数据加密
mysql> select md5('123456');+----------------------------------+| md5('123456') |+----------------------------------+| e10adc3949ba59abbe56e057f20f883e |+----------------------------------+1 row in set (0.00 sec)