>MySQL函数
常用的函数有:
1. 字符串函数;主要用于处理字符串。
2. 数值函数;主要用于处理数字。
3. 日期和时间函数;主要用于处理日期和事件。
4. 系统信息函数;获取系统信息。
>>数学函数
获取随机数
rand()和rand(x)
获取随机数。这两个函数都会返回0-1之间的随机数,其中rand()函数返回的数是完全随机的,而rand(x)函数返回的随机数值是完全相同的。
获取整数的函数
ceil(x)
函数返回大于或等于数值x的最小整数。
floor(x)
函数返回小于或等于数值x的最大整数。
截取数值函数
truncate(x,y)
返回数值x,保留小数点后y位
eg:truncate
(903.343434,2),
truncate
(903.343,-1) => 903.34 | 900 |
四舍五入函数
round(x) 函数返回值x经过四舍五入操作后的数值。round(x,y) 返回数值x保留到小数点后y位的值。
未分类数值函数
ABS(x) 返回x的绝对值
BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)
EXP(x) 返回值e(自然对数的底)的x次方
GREATEST(x1,x2,...,xn)返回集合中最大的值
LEAST(x1,x2,...,xn) 返回集合中最小的值
LN(x) 返回x的自然对数
LOG(x,y)返回x的以y为底的对数
MOD(x,y) 返回x/y的模(余数)
PI()返回pi的值(圆周率)
SIGN(x) 返回代表数字x的符号的值
SQRT(x) 返回一个数的平方根
ISNULL() 函数用于规定如何处理 NULL 值。Eg: IFNULL(UnitsOnOrder,0)
>>聚合函数(常用于GROUP BY从句的SELECT查询中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
GROUP_CONCAT(id) 默认分隔符是","
GROUP_CONCAT(distinct id ORDER BY id DESC SEPARATOR '_') 设置分隔符
Eg: 2_1
GROUP_CONCAT(concat_ws(', ',id,journal) ORDER BY id DESC SEPARATOR '. ')
Eg: 2, Submitted (20-JUN-2002). 1, Unpublished
Eg: select id,group_concat(name separator ';') from aa group by id;
注:group_concat()需配合group by一起使用
>>字符串函数
合并字符串函数concat() 和 concat_ws():
在MySQL中可以通过函数concat()和concat_ws()将传入的参数连接成为一个字符串。
concat(s1, s2,...sn)
//该函数会将传入的参数连接起来返回合并的字符串类型的数据。如果其中一个参数为
null
,则返回值为
null
.
示例:concat(
'my'
,
's'
,
'ql'
) => 'mysql'
concat_ws(sep,s1,s2,...sn)
//将s1,s2...,sn连接成字符串,并用sep字符间隔。
//分隔符可以是一个字符串,也可以是其他参数。如果分割符为
null
,则返回结果为
null
。函数会忽略任何分割符后的参数
null
。
eg:concat_ws(
'-'
,
'020'
,
'87658907'
) => '020-87658907' concat_ws('-','020',null,'87658907') =>'020-87658907'
查找字符串位置:
mysql中提供了丰富的函数去查找字符串的位置。分别有find_in_set()函数、field()函数、locate()函数、position()函数和instr()函数。同时还提供了查找指定位置的字符串的函数elt()。
FIND_IN_SET(str,list)
分析逗号分隔的list列表,如果发现str,返回str在list中的位置
eg:find_in_set(
'mysql'
,
'oracle,mysql,db2'
) => 2
LOCATE (str1 , str )、position(str1 in str) 和 instr(str,str1)
返回参数str中字符串str1的开始位置
eg:locate(
'sql'
,
'mysql'
),position(
'sql'
in
'mysql'
),instr(
'mysql'
,
'sql'
) => 3 | 3 | 3 |
elt(n,str1,str2...)
返回指定位置的字符串
eg:elt(1,
'mysql'
,
'db2'
,
'oracle'
) => 'mysql'
从现有字符串中截取子字符串:
截取子字符串的函数有:left(),right(),substring(),mid();
LEFT(str,x)
返回字符串str中最左边的x个字符
RIGHT(str,x)
返回字符串str中最右边的x个字符
eg:left
(
'mysql'
,2),
right
(
'mysql'
,3) => my | sql |
substring(str,num,len) mid(str,num,len) substr(string string,num start,num length)
返回字符串str中的第num个位置开始长度为len的子字符串
eg:substring
(
'zhaojd'
,2,3),mid(
'zhaojd'
,2,4) => hao | haoj |
从字符串的第 4 个字符位置(倒数)开始取,直到结束
substring('sqlstudy.com', -4) => .com
从字符串的第 4 个字符位置(倒数)开始取,只取 2 个字符
substring('sqlstudy.com', -4, 2) => .c
注:在函数 substring(str,num, len)中, num可以是负值,但 len 不能取负值。
substring_index(str,delim,count)
substring_index('www.sqlstudy.com.cn', '.', 2) 截取第二个 '.' 之前的所有字符 => www.sqlstudy
substring_index('www.sqlstudy.com.cn', '.', -2) 截取第二个 '.' (倒数)之后的所有字符 => com.cn
substring_index('www.sqlstudy.com.cn', '.coc', 1) 如果在字符串中找不到 delim 参数指定的值,就返回整个字符串 => www.sqlstudy.com.cn
获取字符串长度函数length()和字符数函数char_length():
length(str) 返回字符串str中的字符数
char_length(str)
eg:length(
'mysql'
),length(
'汉字'
),char_length(
'mysql'
),char_length(
'汉字'
) => 5 | 4 | 5 | 4
//字符串‘MySQL'共有5个字符,但是占6个字节空间。这是因为每个字符串都是以\0结束。两个函数都是获取字符串的字符数而不是所占空间大小。
比较字符串大小函数strcmp():
strcmp(str1,str2);
//如果参数str1大于str2,返回1;如果str1小于str2,则返回-1;如果str1等于str2,则返回0;
eg:strcmp(
'abc'
,
'abd'
) => -1
字母的大小写转换upper()和lower():
字母大写转换函数:upper(s); ucase(s);
字母小写转换函数:lower(s); lcase(s);
去除字符串的首尾空格:
去除字符串首尾空格的函数有:ltrim()、rtrim()、trim()
ltrim(str)
返回去掉开始处空格的字符串
rtrim(str)
返回去掉结束处空格的字符串。
trim(str)
返回去掉首尾空格的字符串,可以过滤指定的字符串
完整格式:TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
简化格式:TRIM([remstr FROM] str)
eg:
SELECT TRIM(' bar '); //默认删除前后空格
SELECT TRIM(LEADING ',' FROM ',,barxxx'); //删除指定首字符 如',‘
SELECT TRIM(BOTH ',' FROM ',,bar,,,'); //删除指定首尾字符
SELECT TRIM(TRAILING ',' FROM 'barxxyz,,'); //删除指定尾字符 如',‘
替换字符串函数:
INSERT(str,x,y,instr)
将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
如果参数pos的值超过字符串长度,则返回值为原始字符串str。
如果len的长度大于原来str中所剩字符串的长度,则从位置pos开始进行全部替换。若任何一个参数为null,则返回值为null.
eg:insert
(
'这是mysql数据库系统'
,3,5,
'oracle'
) => 这是oracle数据库系统
replace(str,substr,newstr)
将字符串str中的子字符串substr用字符串newstr来替换。
eg:replace
(
'这是mysql数据库'
,
'mysql'
,
'db2'
) => 这是db2数据库
未分类字符串函数
QUOTE(str) 用反斜杠转义str中的单引号
REPEAT(str,srchstr,rplcstr)返回字符串str重复x次的结果
REVERSE(str) 返回颠倒字符串str的结果
ASCII(char)返回字符的ASCII码值
BIT_LENGTH(str)返回字符串的比特长度
>>日期和时间函数
获取当前日期和时间的函数
now(),current_timestamp(),localtime(),sysdate()
四个函数不仅可以获取当前日期和时间,而且显示的格式也一样。推荐使用now()
eg:now(),
current_timestamp
(),localtime(),sysdate() => 2016-08-25 16:09:20 | 2016-08-25 16:09:20 | 2016-08-25 16:09:20 | 2016-08-25 16:09:20 |
curdate(),current_date()
获取当前日期
eg:curdate(),
current_date
() => 2016-08-25 | 2016-08-25 |
curtime()、current_time()
获取当前时间的函数,推荐使用curtime()
eg:curtime(),
current_time
() =>
16:15:04 | 16:15:04 |
获取日期和时间各部分值
year()函数返回日期中的年份
quarter()函数返回日期属于第几个季度
month()函数返回日期属于第几个月 monthname()函数返回了英文表示的月份
week()函数返回日期属于第几个星期
dayofmonth()函数返回日期属于当前月的第几天
hour()函数返回时间的小时
minute()函数返回时间的分钟
second()函数返回时间的秒。
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
DAYOFYEAR(date) 返回date是一年的第几天(1~366)
DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
获取指定值的extract()
extract(type from date)
上述函数会从日期和时间参数date中获取指定类型参数type的值。type的取值可以是:year,month,day,hour,minute和second
eg:select
now(),extract(
year
from
now())
year
,extract(
month
from
now())
month
,extract(
day
from
now())
day
,extract(
hour
from
now())
hour
,extract(mi
nute
from
now())
minute
,extract(
second
from
now())
second => 2016-08-25 16:43:45 | 2016 | 8 | 25 | 16 | 43 | 45 |
计算日期和时间的函数
adddate(date,n)函数:该函数计算日期参数date加上n天后的日期。
subdate(date,n)函数:该函数计算日期参数date减去n天后的日期。
DATE_ADD(date,INTERVAL int keyword)
返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)
subdate(d,interval expr type):返回日期参数d减去一段时间后的日期,表达式expr决定了时间的长度。参数type决定了所操作的对象。
addtime(time,n):计算时间参数time加上n秒后的时间。
subtime(time,n):计算时间参数time减去n秒后的时间。
eg:curdate(),adddate(curdate(),5),subdate(curdate(),5) => 2016-08-25 | 2016-08-30 | 2016-08-20 |
curdate(),adddate(curdate(),interval
'2,3'
year_month),subdate(curdate(),interval
'2,3'
year_month) => 2016-08-25 | 2018-11-25 | 2014-05-25 |
其他未分类函数
DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值
DATEDIFF(date1,date2) 函数返回两个日期之间的天数。
Eg: SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate 结果:1
SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate 结果:-1
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
- YEAR - 格式 YYYY 或 YY
LAST_DAY(date)日期或日期时间值,并返回对应的值,为每月的最后一天。返回NULL,如果该参数是无效的。
Eg:LAST_DAY('2003-02-05') 结果: 2003-02-28
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。其结果的单位由interval 参数给出。该参数必须是以下值的其中一个:
- FRAC_SECOND。表示间隔是毫秒
- SECOND。秒
- MINUTE。分钟
- HOUR。小时
- DAY。天
- WEEK。星期
- MONTH。月
- QUARTER。季度
- YEAR。年
一些示例:
获取当前系统时间:
返回两个日期值之间的差值(月数):SELECT PERIOD_DIFF(200302,199802);
在Mysql中计算年龄:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
这样,如果Brithday是未来的年月日的话,计算结果为0。
下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') -(DATE_FORMAT(NOW(), '00-%m-%d') <DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
>>类型转换
转换函数CAST与CONVERT
CAST(value as type)
CONVERT(value, type)
用来获取一个类型的值,并产生另一个类型的值
注:可以转换的数据类型是有限制的。这个类型可以是以下值其中的一个:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
Date --> String
DATE_FORMAT(date,format)
format样式整理:
年: %Y 显示四位 : 2015 %y 只显示后两位 :15
月: %M 月份的英文显示:October %m 月份的阿拉伯显示:01-12 %b 月份的英文缩略显示:Oct %c 月份的阿拉伯显示:1-12
日: %d 阿拉伯显示:00-31 %D 带有英文后缀:1st-31th %e 阿拉伯显示:1-31 %j 年的天:001-366
时: %H :00-23 %h:01-12 %I:01-12 %k:0-23 %l:1-12
分: %i:00-59
秒: %S:00-59 %s:00-59
微妙: %f
AM/PM:%p
12小时制时间:%r: 02:02:44 PM
24小时制时间: %T: 14:02:44
周: %W:周的英文显示 %w 周的阿拉伯显示 :0(星期日)-6(星期六) %a 周的英文缩略显示:Mon-
eg:DATE_FORMAT(now(),"%Y-%m-%d %T") 2015-09-01 17:10:52
DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%s %p") 2015-09-01 17:10:52 PM
>>String -->Date
STR_TO_DATE(str,format) str:字符形式的日期 format:格式化样式
分隔符一致,年月日要一致
eg: STR_TO_DATE('1992-04-12',"%Y-%m-%d") str_to_date('2008-4-2 15:3:28','%Y-%m-%d %H:%i:%s'); 输出:1992-04-12(日期形式)
>>系统信息函数
database()
返回当前数据库名
BENCHMARK(count,expr) 将表达式expr重复运行count次
CONNECTION_ID() 返回当前客户的连接ID
FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数
user()或SYSTEM_USER()
返回当前登陆用户名
version()
返回MySQL服务器的版本