MySQL功能强大的一个重要原因是MySQL内置了许多功能丰富的函数。
本章讲解的所有函数f(x)在对数据x进行操作时,都会返回结果,并且数据x的值以及x的数据类型都不会发生丝毫变化。
6.3.1 数学函数
为了便于读者学习,本书将数学函数归纳为三角函数,指数函数及对数函数,求近似值函数,随机函数,二进制、十六进制函数等。
1.三角函数
MySQL提供了pi()函数计算圆周率;radians(x)函数负责将角度x转换为弧度;degrees(x)函数负责将弧度x转换为角度。
MySQL还提供了三角函数:正弦函数sin(x)、余弦函数cos(x)、tan(x)正切函数、余切函数cot(x)、反正弦函数asin(x)、反余弦函数acos(x)以及反正切函数atan(x)。
2.指数函数及对数函数
MySQL中常用的指数函数有sqrt()平方根函数、pow(x,y)幂运算函数(计算x的y次方)以及exp(x)函数(计算e的x次方)。
说明:pow(x,y)幂运算函数还有一个别名函数:power(x,y),实现相同的功能。
MySQL中常用的对数函数有log(x)函数(计算x的自然对数)以及log10(x)函数(计算以10为底的对数)。
3.求近似值函数
MySQL提供的round(x)函数负责计算离x最近的整数,round(x,y)函数负责计算离x最近的小数(小数点后保留y位);
示例:
mysql> select round(903.53567),round(-903.53567),round(903.53567,2),round(903.343,-1);
truncate(x,y)函数负责返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入);format(x,y)函数负责返回小数点后保留y位的x(进行四舍五入);
示例:
mysql> select truncate(903.343434,2),truncate(903.343,-1);
ceil(x)函数负责返回大于等于x的最小整数;floor(x)函数负责返回小于等于x的最大整数。
示例:
mysql> select ceil(4.3),ceil(-2.5),floor(4.3),floor(-2.5);
4.随机函数
MySQL提供了rand()函数负责返回随机数。
通过rand()和rand(x)函数来获取随机数。这两个函数都会返回0-1的随机数,其中rand()函数返回的数是完全随机的,而rand(x)函数返回的随机数值是完全相同的。
示例:
mysql> select rand(),rand(),rand(3),rand(3);
5.二进制、十六进制函数
bin(x)函数、oct(x)函数和hex(x)函数分别返回x的二进制、八进制和十六进制数;ascii(c)函数返回字符c的ASCII码(ASCII码介于0~255);char(c1,c2,c3,…)函数将c1、c2……的ASCII码转换为字符,然后返回这些字符组成的字符串;conv(x,code1,code2)函数将code1进制的x变为code2进制数。
6.3.2 字符串函数
为便于学习,可以将字符串函数归纳为字符串基本信息函数、加密函数、字符串连接函数、修剪函数、子字符串操作函数、字符串复制函数、字符串比较函数以及字符串逆序函数等。字符串基本信息函数包括获取字符串字符集的函数、获取字符串长度以及获取字符串占用字节数的函数等。
注意:字符串函数在对字符串操作时,字符集、字符序的设置至关重要。同一个字符串函数,对同一个字符串进行操作,如果字符集或者字符序设置不同,操作结果可能不同。
(1)比较字符串大小。
strcmp(str1,str2)
功能:str1>str2,返回值为1,str1<str2,返回值为-1,str1=str2,返回值为0。
select strcmp('abc','abd'),strcmp('abc','abc'),strcmp('abc','abb');
(2)获取字符串长度函数length()和字符数函数char_length()。
select length('mysql'),char_length('mysql');
upper:小写转大写;
lower:大写转小写;或lcase();
select upper('Mysql'),lower('MYSQL'),lcase('MYSQL');
(4)返回字符串位置。
find_in_set(str1,str2)
功能:返回str1在str2中匹配的字符串位置。
select find_in_set('is','this,is,book');位置如图6.2所示。
图6.2 匹配的字符串位置
(5)返回指定字符串集中位置。
field(str,str1,str2.....)
功能:返回与str匹配的字符串位置。
select field('is','this','book','is','mine');位置如图6.3所示。
图6.3 指定字符串集中位置
(6)返回子字符串相匹配的开始位置。
locate(str1,str)
position(str1 in str)
instr(str1,str)
返回字符串str1在str串中的开始位置。
select locate('sql','mysql'),position('sql' in 'mysql'),instr('sql','mysql')
(7)返回指定位置字符串。
elt(n,str1,str2......)
select elt(3,'mysql','oracle','sql server','access')
返回第n个字符串。
(8)make_set函数的使用。
make_set()首先会将数值num转换成二进制数,然后按照二进制从参数str1,str2,...,strn中
选取相应的字符串。再通过二进制从右到左的顺序读取该值,如果值为1选择该字符串,
否则将不选择该字符串。
select bin(5),make_set(5,'mysql','db2','oracle','redus');
(9)从现有字符串中截取子字符串。
截取子字符串的函数有:left(),right(),substring(),mid()。
① left ()和right()分别从左边或右边截取子字符串。
left(str,num)
//返回字符串str中包含前num个字母(从左边数)的字符串。
right(str,num)
//返回字符串str中包含后num个字母(从右边数)的字符串。
示例:
mysql> select left('mysql',2),right('mysql',3);
② 截取指定位置和长度的字符串。
可以通过substring()和mid()函数截取指定位置和长度的字符串。
substring(str,num,len)//返回字符串str中的第num个位置开始长度为len的子字符串。
mid(str,num,len)
示例:
mysql> select substring('shanguangqin',2,3),mid('shanguangqin',2,4);
(10)去除字符串的首尾空格。
去除字符串首尾空格的函数有:ltrim()、rtrim()、trim()。
① 去除字符串开始处的空格。
ltrim(str)//返回去掉开始处空格的字符串
示例:
mysql> select length(concat('-',' mysql ','-')),length(concat('-',ltrim(' mysql ','-')));
② 去除字符串结束处的空格。
rtrim(str):返回去掉结束处空格的字符串。
示例:
mysql> select length(concat('-',' mysql ','-')),length(concat('-',ltrim(' mysql ','-')));
③ 去除字符串首尾空格。
trim(str)//返回去掉首尾空格的字符串
示例:
mysql> select length(concat(trim(' mysql ')))origi,length(concat(' mysql '))orilen;
(11)替换字符串。
实现替换字符串的功能,可用insert()和replace()实现。
① 使用insert()函数。
insert(str,pos,len,newstr)
insert()函数会将字符串str中的pos位置开始长度为len的字符串用字符串newstr来替换。
如果参数pos的值超过字符串长度,则返回值为原始字符串str。
如果len的长度大于原来str中所剩字符串的长度,则从位置pos开始进行全部替换。若任何一个参数为null,则返回值为null。
示例:
mysql> select insert('这是mysql数据库系统',3,5,'oracle')bieming;
② 使用replace()函数。
replace(str,substr,newstr)//将字符串str中的子字符串substr用字符串newstr来替换。
示例:
mysql> select replace('这是mysql数据库','mysql','db2')bieming;
(12)字符串字符集的函数。
charset(x)函数返回x的字符集;collation(x)函数返回x的字符序。
① 关于字符串字符集的函数。
convert(x using charset)函数返回x的charset字符集数据(注意x的字符集没有变化)。
② 获取字符串长度以及获取字符串占用字节数函数。
char_length(x)函数用于获取字符串x的长度;length(x)函数用于获取字符串x的占用的字节数。
(13)加密函数。
加密函数包括不可逆加密函数以及加密-解密函数。
① 不可逆加密函数。
password(x)函数用于对x进行加密,默认返回41位的加密字符串;md5(x)函数用于对x进行加密,默认返回32位的加密字符串。
② 加密-解密函数。
MySQL提供了两对加密-解密函数,分别是:encode(x,key)函数与decode(password,key)函数;aes_encrypt(x,key)函数与aes_decrypt(password,key)函数。其中key为加密密钥(注意读作mìyuè),需要牢记加密时的密钥才能实现密码的解密。
encode(x,key)函数使用密钥key对x进行加密,默认返回值是一个二进制数(二进制的位数由x的字节长度决定);decode(password,key)函数使用密钥key对密码password进行解密。
aes_encrypt(x,key)函数使用密钥key对x进行加密,默认返回值是一个128位的二进制数;aes_decrypt(password,key)函数使用密钥key对密码password进行解密。
(14)合并字符串函数concat()和concat_ws()。
① concat (s1,s2,...sn)。
功能:将传入的参数连接起来返回合并的字符串。如果其中一个参数为null,
则返回值为null。
select concat('My','S','QL'),合并后字符串如图6.4所示。
图6.4 字符串无空合并
select concat('My','S','QL',NULL),合并后字符串如图6.5所示。
图6.5 字符串有空合并
select concat(curdate(),9.58),合并后字符串如图6.6所示。
图6.6 日期与数字合并
curdate():求当前日期。
②concat_ws (sep,s1,s2)。
功能:将传入的参数连接起来,字符串间多一个分隔符,返回合并的字符串。如果分隔符为null,则返回值为null。
select concat_ws('-','023','88888888'),执行结果如图6.7所示。
图6.7 带分隔符合并
(15)修剪函数。
修剪函数包括字符串裁剪函数、字符串大小写转换函数、填充字符串函数等。
① 字符串裁剪函数。
ltrim(x)函数用于去掉字符串x开头的所有空格字符。rtrim(x)函数用于去掉字符串x结尾的所有空格字符。
trim([leading | both | trailing] x1 from x2)函数用于从x2字符串的前缀或者(以及)后缀中去掉字符串x1。
left(x,n)函数以及right(x,n)函数也用于截取字符串。其中left(x,n)函数返回字符串x的前n个字符;right(x,n)函数返回字符串x的后n个字符。
② 字符串大小写转换函数。
upper(x)函数以及ucase(x)函数将字符串x中的所有字母变成大写字母,字符串x并没有发生变化;lower(x)函数以及lcase(x)函数将字符串x中的所有字母变成小写字母,字符串x并没有发生变化。
③ 填充字符串函数。
lpad(x1,len,x2)函数将字符串x2填充到x1的开始处,使字符串x1的长度达到len;rpad(x1,len,x2)函数将字符串x2填充到x1的结尾处,使字符串x1的长度达到len。
(16)子字符串操作函数。
子字符串操作函数包括取出指定位置的子字符串函数、在字符串中查找指定子字符串的位置函数、子字符串替换函数等。
① 取出指定位置的子字符串函数。
substring(x,start,length)函数与mid(x,start,length)函数都是从字符串x的第n个位置开始获取length长度的字符串。
② 在字符串中查找指定子字符串的位置函数。
locate(x1,x2)函数、position(x1 in x2)函数以及instr(x2,x1)函数都是用于从字符串x2中获取x1的开始位置。
find_in_set(x1,x2)函数也可以获取字符串x2中x1的开始位置(第几个逗号处的位置),不过该函数要求s2是一个用英文的逗号分隔的字符串。
③ 子字符串替换函数。
MySQL提供了两个子字符串替换函数insert(x1,start,length,x2)和replace(x1,x2,x3)。insert(x1,start,length,x2)函数将字符串x1中从start位置开始、长度为length的子字符串替换为x2。replace(x1,x2,x3)函数用字符串x3替换x1中所有出现的字符串x2,最后返回替换后的字符串。
(17)字符串复制函数。
字符串复制函数包括repeat(x,n)函数以及space(n)函数。其中repeat(x,n)函数产生一个新字符串,该字符串的内容是字符串x的n次复制;space(n)函数产生一个新字符串,该字符串的内容是空格字符的n次复制。
(18)字符串比较函数。
strcmp(x1,x2)函数用于比较两个字符串x1和x2,如果x1>x2函数返回值为1;如果x1=x2函数返回值为0;如果x1<x2函数返回值为-1。
(19)字符串逆序函数。
reverse(x)函数返回一个新字符串,该字符串为字符串x的逆序。(www.xing528.com)
(20)数据类型转换函数。
最为常用的数据类型转换函数是convert(x,type)与cast(x as type)函数,另外MySQL还提供了“十六进制字符串”转换为“十六进制数”的函数unhex(x)。
① convert()函数。
convert()函数有两种用法格式:convert(x using charset)函数返回x的charset字符集数据。
convert()函数还有另外一种语法格式:convert(x,type),可以实现数据类型的转换。convert(x,type)函数以type数据类型返回x数据(注意x的数据类型没有变化)。除此以外,cast(x as type)函数也实现了convert(x,type)函数相同的功能。
② unhex(x)函数。
unhex(x)函数负责将十六进制字符串x转换为十六进制的数值。
(21)字符串左边补足函数。
lpad()函数:用替补字符串去填补需要补足的字符串,使填补后的字符串长度等于最终长度。
格式:lpad(需要补足的字符串,最终的长度,替补字符串);
lpad(需要补足的字符串,补足后的长度,替补字符串);
select lpad('1',3,'0');
6.3.3 使用数值函数
(1)获取随机数。
通过rand()和rand(x)函数来获取随机数。这两个函数都会返回0.1之间的随机数,其中rand()函数返回的数是完全随机的,而rand(x)函数返回的随机数值是完全相同的。
示例:
mysql> select rand(),rand(),rand(3),rand(3);
(2)获取整数的函数。
在具体应用中,如果想要获取整数,可以通过ceil()和floor()函数来实现。
ceil()函数的定义为:
ceil(x)//函数返回大于或等于数值x的最小整数。
floor()函数的定义为:
floor()//函数返回小于或等于数值x的最大整数。
示例:
mysql> select ceil(4.3),ceil(.2.5),floor(4.3),floor(.2.5);
(3)截取数值函数。
可以通过truncate()对数值的小数位进行截取,函数定义为:
truncate(x,y)//返回数值x,保留小数点后y位
示例:
mysql> select truncate(903.343434,2),truncate(903.343,.1);
(4)四舍五入函数。
对数值进行四舍五入可以通过round()函数实现。
round(x)
//函数返回值x经过四舍五入操作后的数值。
round(x,y)
//返回数值x保留到小数点后y位的值。在具体截取数据时需要进行四舍五入的操作。
示例:
mysql> select round(903.53567),round(.903.53567),round(903.53567,2),round(903.343,.1);
6.3.4 使用日期和时间函数
(1)获取当前日期和时间。
MySQL中可以通过四个函数获取当前日期和时间,分别是now(),current_timestamp(),localtime(),sysdate(),
这四个函数不仅可以获取当前日期和时间,而且显示的格式也一样,推荐使用now()。
示例:
mysql> select now(),current_timestamp(),localtime(),sysdate();
(2)获取当前日期。
获取当前日期的函数有curdate()和current_date()。
示例:
mysql> select curdate(),current_date();
(3)获取当前时间。
获取当前时间的函数有curtime()或者current_time(),推荐使用curtime()。
示例:
mysql> select curtime(),current_time();
(4)获取日期和时间各部分值。
在MySQL中,可以通过各种函数来获取当前日期和时间的各部分值,其中year()函数返回日期中的年份,
quarter()函数返回日期属于第几个季度,month()函数返回日期属于第几个月,week()函数返回日期属于第几个星期,
dayofmonth()函数返回日期属于当前月的第几天,hour()函数返回时间的小时,minute()函数返回时间的分钟,second()函数返回时间的秒。
示例:
mysql> select now(),year(now()),quarter(now()),month(now()),week(now()),dayofmonth(now()),hour(now()),minute(now()),second(now());
(5)关于月的函数。
示例:
mysql> select now(),month(now()),monthname(now());
(6)关于星期的函数。
示例:
mysql>select now(),week(now()),weekofyear(now()),dayname(now()),dayofweek(now()),weekday(now));
(7)关于天的函数。
示例:
mysql> select now(),dayofyear(now()),dayofmonth(now());
(8)获取指定值的extract()。
函数定义为:
extract(type from date)
//上述函数会从日期和时间参数date中获取指定类型参数type的值。type的取值可以是://year
示例:
mysql> select now(),extract(year from now())year,extract(month from now())month,extract(day from now())day,extract(hour from now())hour,extract(minute from now())minute,extract(second from now())second;
(9)计算日期和时间的函数。
mysql> select now(),to_days(now()),from_days(to_days(now()));
(10)与指定日期和时间相关操作。
adddate(date,n)函数:该函数计算日期参数date加上n天后的日期。
subdate(date,n)函数:该函数计算日期参数date减去n天后的日期。
adddate(d,interval expr type):返回日期参数d加上一段时间后的日期,表达式参数expr决定了时间的长度,参数type决定了所操作的对象。
subdate(d,interval expr type):返回日期参数d减去一段时间后的日期,表达式expr决定了时间的长度。参数type决定了所操作的对象。
addtime(time,n):计算时间参数time加上n秒后的时间。
subtime(time,n):计算时间参数time减去n秒后的时间。
示例一:
mysql> select curdate(),adddate(curdate(),5),subdate(curdate(),5);
示例二:
mysql> select curdate(),adddate(curdate(),interval '2,3' year_month),subdate(curdate(),5);
示例三:
mysql> select curtime(),addtime(curtime(),5),subtime(curtime(),5);
6.3.5 条件控制函数
条件控制函数的功能是根据条件表达式的值返回不同的值。MySQL中常用的条件控制函数有if()、ifnull()以及case函数。与if语句以及case语句不同,这些函数可以在MySQL客户机中直接调用,可以像max()统计函数一样直接融入到SQL语句中。
1. if()函数
if(condition,v1,v2)函数中,condition为条件表达式,当condition的值为true时,函数返回v1的值,否则返回v2的值。
2. ifnull()函数
ifnull(v1,v2)函数中,如果v1的值为NULL,则该函数返回v2的值;如果v1的值不为NULL,则该函数返回v1的值。
3. case函数
case函数的语法格式如下:
case 表达式 when 值1 then 结果1 [when 值2 then 结果2]… [else 其他值] end
如果表达式的值等于when语句中某个“值n”,则case函数返回值为“结果n”;如果与所有的“值n”都不相等,case函数返回值为“其他值”。
6.3.6 系统信息函数
1.关于MySQL服务实例的函数
version()函数用于获取当前MySQL服务实例使用的MySQL版本号,该函数的返回值与@@version静态变量的值相同。
2.关于MySQL服务器连接的函数
(1)有关MySQL服务器连接的函数。
connection_id()函数用于获取当前MySQL服务器的连接ID,该函数的返回值与@@pseudo_thread_id系统变量的值相同;database()函数与schema()函数用于获取当前操作的数据库。
(2)获取数据库用户信息的函数。
user()函数用于获取通过哪一台登录主机、使用什么账户名成功连接MySQL服务器,system_user()函数与session_user()函数是user()函数的别名。current_user()函数用于获取该账户名允许通过哪些登录主机连接MySQL服务器。
示例:
mysql> select version(),database(),user();
6.3.7 日期和时间函数
1.获取MySQL服务器当前日期或时间函数
(1)curdate()函数、current_date()函数用于获取MySQL服务器当前日期;curtime()函数、current_time()函数用于用于获取MySQL服务器当前时间;
now()函数、current_timestamp()函数、localtime()函数以及sysdate()函数用于获取MySQL服务器当前日期和时间,这四个函数允许传递一个整数值(小于等于6)作为函数参数,从而获取更为精确的时间信息。
curdate()函数、current_date()函数、curtime()函数、current_time()函数、now()函数、current_timestamp()函数、localtime()函数以及sysdate()函数的返回值与时区的设置有关。
(2)获取MySQL服务器当前UNIX时间戳函数。
unix_timestamp()函数用于获取MySQL服务器当前UNIX时间戳。
unix_timestamp(datetime)函数将日期时间datetime以UNIX时间戳返回,而from_unixtime(timestamp)函数可以将UNIX时间戳以日期时间格式返回。需要注意的是,这些函数的返回值与时区的设置有关。
(3)获取MySQL服务器当前UTC日期和时间函数。
utc_date()函数用于获取UTC日期;utc_time()函数用于获取UTC时间。UTC即世界标准时间,中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。这些函数的返回值与时区的设置无关。
2.获取日期或时间的某一具体信息的函数
(1)获取年、月、日、时、分、秒、微秒等信息的函数。
year(x)函数、month(x)函数、dayofmonth(x)函数、hour(x)函数、minute(x)函数、second(x)函数以及microsecond(x)函数分别用于获取日期时间x的年、月、日、时、分、秒、微秒等信息。
另外MySQL还提供了extract(type from x)函数用于获取日期时间x的年、月、日、时、分、秒、微秒等信息,其中type可以分别指定为year、month、day、hour、minute、second、microsecond。
(2)获取月份、星期等信息的函数。
monthname(x)函数用于获取日期时间x的月份信息。dayname(x)函数与weekday(x)函数用于获取日期时间x的星期信息;dayofweek(x)函数用于获取日期时间x是本星期的第几天(星期日为第一天,以此类推)。
(3)获取年度信息的函数。
quarter(x)函数用于获取日期时间x在本年是第几季度;week(x)函数与weekofyear(x)函数用于获取日期时间x在本年是第几个星期;dayofyear(x)函数用于获取日期时间x在本年是第几天。
3.时间和秒数之间的转换函数
time_to_sec(x)函数用于获取时间x在当天的秒数;sec_to_time(x)函数用于获取当天的秒数x对应的时间。
4.日期间隔、时间间隔函数
(1)日期间隔函数。
to_days(x)函数用于计算日期x距离0000年1月1日的天数;from_days(x)函数用于计算从0000年1月1日开始n天后的日期;
datediff(x1,x2)函数用于计算日期x1与x2之间的相隔天数;adddate(d,n)函数返回起始日期d加上n天的日期;subdate(d,n)函数返回起始日期d减去n天的日期。
(2)时间间隔函数。
addtime(t,n)函数返回起始时间t加上n秒的时间;subtime(t,n)函数返回起始时间t减去n秒的时间。
(3)计算指定日期指定间隔的日期函数。
date_add(date,interval 间隔 间隔类型)函数返回指定日期date指定间隔的日期。
说明:interval是时间间隔关键字,间隔可以为正数或者负数(建议使用两个单引号括起来)如表6.4所示。
表6.4 日期间隔函数
续表
5.日期和时间格式化函数
(1)时间格式化函数。
time_format(t,f)函数按照表达式f的要求显示时间t,表达式f中定义了时间的显示格式,显示格式以%开头,如表6.5所示。
表6.5 时间格式化函数
(2)日期和时间格式化函数。
date_format(d,f)函数按照表达式f的要求显示日期和时间t,表达式f中定义了日期和时间的显示格式,显示格式以%开头,如表6.6所示。
表6.6 日期和时间格式化函数
续表
6.3.8 其他常用的MySQL函数
1.获得当前MySQL会话最后一次自增字段值
last_insert_id()函数返回当前MySQL会话最后一次insert或update语句设置的自增字段值。
last_insert_id()函数的返回结果遵循一定的原则:
(1)last_insert_id()函数仅仅用于获取当前MySQL会话时insert或update语句设置的自增字段值,该函数的返回值与系统会话变量@@last_insert_id的值一致。
(2)自增字段值如果是数据库用户自己指定,而不是自动生成,那么last_insert_id()函数的返回值为0。
(3)假如使用一条insert语句插入多行记录,last_insert_id()函数只返回第一条记录的自增字段值。
(4)last_insert_id()函数与表无关。如果向表A插入数据后再向表B插入数据,last_insert_id()函数返回表B的自增字段值。
2.IP地址与整数相互转换函数
inet_aton(ip)函数用于将IP地址(字符串数据)转换为整数;inet_ntoa(n)函数用于将整数转换为IP地址(字符串数据)。
3.基准值函数
benchmark(n,expression)函数将表达式expression重复执行n次,返回结果为0。
4.uuid()函数
uuid()函数可以生成一个128位的通用唯一识别码UUID(Universally Unique Identifier)。
UUID码由5个段构成,其中前3个段与服务器主机的时间有关(精确到微秒);第4段是一个随机数,在当前的MySQL服务实例中该随机数不会变化,除非重启MySQL服务;第5段是通过网卡MAC地址转换得到,同一台MySQL服务器运行多个MySQL服务实例时,该值相等。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。