MySQL 8.0——函数(一)

函数

1、MySQL函数简介

函数表示对输入参数值返回一个具有特定关系的值,MySQL提供了大量丰富的函数,在进行数据库管理以及数据的查询和操作时将会经常用到各种函数。

通过对数据的处理,数据库功能可以变得更加强大,可以更加灵活地满足不同用户的需求。

各类函数从功能方面主要分为:

  • 数学函数
  • 字符串函数
  • 日期和时间函数
  • 条件判断函数
  • 系统信息函数
  • 加密函数等其他函数

2、数学函数

数学函数主要用来处理数值数据,主要的数学函数有绝对值函数、三角函数(包括正弦函数、余弦函数、正切函数、余切函数等)​、对数函数、随机数函数等。在有错误产生时,数学函数将会返回空值NULL。

2.1、绝对值函数ABS(x)和返回圆周率的函数PI()

ABS(X)返回X的绝对值。

求2、-3.3和-33的绝对值,输入语句如下:

select abs(2), abs(-3.3), abs(-33);

+--------+-----------+----------+
| abs(2) | abs(-3.3) | abs(-33) |
+--------+-----------+----------+
|      2 |       3.3 |       33 |
+--------+-----------+----------+

正数的绝对值为其本身,2的绝对值为2;负数的绝对值为其相反数,-3.3的绝对值为3.3;-33的绝对值为33。

PI()返回圆周率π的值。默认的显示小数位数是6位。

返回圆周率值,输入语句如下:

select pi();

+----------+
|     pi() |
+----------+
| 3.141593 |
+----------+

返回结果保留了7位有效数字。

2.2、平方根函数SQRT(x)和求余函数MOD(x,y)

SQRT(x)返回非负数x的二次方根。

求9、40和-49的二次平方根,输入语句如下:

select sqrt(9), sqrt(40), sqrt(-49);

+---------+-------------------+-----------+
| sqrt(9) |          sqrt(40) | sqrt(-49) |
+---------+-------------------+-----------+
|     3.0 | 6.324555320336759 |    <null> |
+---------+-------------------+-----------+

3的平方等于9,因此9的二次平方根为3;40的平方根为6.324555320336759;而负数没有平方根,因此-49返回的结果为NULL。

MOD(x,y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,它返回除法运算后的精确余数。

对(31,8)、(234, 10)、(45.5,6)进行求余运算,输入语句如下:

select mod(31, 8), mod(234, 10), mod(45.5, 6);

+------------+--------------+--------------+
| mod(31, 8) | mod(234, 10) | mod(45.5, 6) |
+------------+--------------+--------------+
|          7 |            4 |          3.5 |
+------------+--------------+--------------+

2.3、获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)

CEIL(x)和CEILING(x)的意义相同,返回不小于x的最小整数值,返回值转化为一个BIGINT。

使用CEILING函数返回最小整数,输入语句如下:

select ceil(-3.35), ceiling(3.35);

+-------------+---------------+
| ceil(-3.35) | ceiling(3.35) |
+-------------+---------------+
|          -3 |             4 |
+-------------+---------------+

-3.35为负数,不小于-3.35的最小整数为-3,因此返回值为-3;不小于3.35的最小整数为4,因此返回值为4。

FLOOR(x)返回不大于x的最大整数值,返回值转化为一个BIGINT。

使用FLOOR函数返回最大整数,输入语句如下:

select floor(-3.35), floor(3.35);

+--------------+-------------+
| floor(-3.35) | floor(3.35) |
+--------------+-------------+
|           -4 |           3 |
+--------------+-------------+

-3.35为负数,不大于-3.35的最大整数为-4,因此返回值为-4;不大于3.35的最大整数为3,因此返回值为3。

2.4、获取随机数的函数RAND()和RAND(x)

RAND(x)返回一个随机浮点值v,范围在0到1之间(0 ≤ v ≤ 1.0)​。若已指定一个整数参数x,则它被用作种子值,用来产生重复序列。

使用RAND()函数产生随机数,输入语句如下:

select rand(), rand(), rand();

+---------------------+--------------------+--------------------+
|              rand() |             rand() |             rand() |
+---------------------+--------------------+--------------------+
| 0.06712356588535343 | 0.7521834948586146 | 0.5595468073706579 |
+---------------------+--------------------+--------------------+

可以看到,不带参数的RAND()每次产生的随机数值是不同的。

使用RAND(x)函数产生随机数,输入语句如下:

select rand(10), rand(10), rand(11);

+--------------------+--------------------+-------------------+
|           rand(10) |           rand(10) |          rand(11) |
+--------------------+--------------------+-------------------+
| 0.6570515219653505 | 0.6570515219653505 | 0.907234631392392 |
+--------------------+--------------------+-------------------+

可以看到,当RAND(x)的参数相同时,将产生相同的随机数,不同的x产生的随机数值不同。

2.5、函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)

ROUND(x)返回最接近于参数x的整数,对x值进行四舍五入。

使用ROUND(x)函数对操作数进行四舍五入操作,输入语句如下:

select round(-1.14), round(-1.67), round(1.14), round(1.66);

+--------------+--------------+-------------+-------------+
| round(-1.14) | round(-1.67) | round(1.14) | round(1.66) |
+--------------+--------------+-------------+-------------+
|           -1 |           -2 |           1 |           2 |
+--------------+--------------+-------------+-------------+

可以看到,四舍五入处理之后,只保留了各个值的整数部分。

ROUND(x,y)返回最接近于参数x的数,其值保留到小数点后面y位,若y为负值,则将保留x值到小数点左边y位。

使用ROUND(x,y)函数对操作数进行四舍五入操作,结果保留小数点后面指定y位,输入语句如下:

select round(1.38, 1), round(1.38, 0), round(232.38, -1), round(232.38, -2);

+----------------+----------------+-------------------+-------------------+
| round(1.38, 1) | round(1.38, 0) | round(232.38, -1) | round(232.38, -2) |
+----------------+----------------+-------------------+-------------------+
|            1.4 |              1 |               230 |               200 |
+----------------+----------------+-------------------+-------------------+

ROUND(1.38, 1)保留小数点后面1位,四舍五入的结果为1.4;ROUND(1.38, 0)保留小数点后面0位,即返回四舍五入后的整数值;ROUND(23.38, -1)和ROUND (232.38,-2)分别保留小数点左边1位和2位。

y值为负数时,保留的小数点左边的相应位数直接保存为0,不进行四舍五入。

TRUNCATE(x,y)返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y设为负数,则截去(归零)x小数点左起第y位开始后面所有低位的值。

使用TRUNCATE(x,y)函数对操作数进行截取操作,结果保留小数点后面指定y位,输入语句如下:

select truncate(1.31, 1), truncate(1.99, 1), truncate(1.99, 0), truncate(19.99, -1);

+-------------------+-------------------+-------------------+---------------------+
| truncate(1.31, 1) | truncate(1.99, 1) | truncate(1.99, 0) | truncate(19.99, -1) |
+-------------------+-------------------+-------------------+---------------------+
|               1.3 |               1.9 |                 1 |                  10 |
+-------------------+-------------------+-------------------+---------------------+

TRUNCATE(1.31,1)和TRUNCATE(1.99,1)都保留小数点后1位数字,返回值分别为1.3和1.9;TRUNCATE(1.99,0)返回整数部分值1;TRUNCATE(19.99,-1)截去小数点左边第1位后面的值,并将整数部分的1位数字置0,结果为10。

ROUND(x,y)函数在截取值的时候会四舍五入,而TRUNCATE (x,y)直接截取值,并不进行四舍五入。

2.6、符号函数SIGN(x)

SIGN(x)返回参数的符号,x的值为负、零或正时返回结果依次为-1、0或1。

使用SIGN函数返回参数的符号,输入语句如下:

select sign(-21), sign(0), sign(21);

+-----------+---------+----------+
| sign(-21) | sign(0) | sign(21) |
+-----------+---------+----------+
|        -1 |       0 |        1 |
+-----------+---------+----------+

SIGN(-21)返回-1;SIGN(0)返回0;SIGN(21)返回1。

2.7、幂运算函数POW(x,y)、POWER(x,y)和EXP(x)

POW(x,y)或者POWER(x,y)函数返回x的y次乘方的结果值。

使用POW和POWER函数进行乘方运算,输入语句如下:

select pow(2, 2), power(2, 2), pow(2, -2), power(2, -2);

+-----------+-------------+------------+--------------+
| pow(2, 2) | power(2, 2) | pow(2, -2) | power(2, -2) |
+-----------+-------------+------------+--------------+
|       4.0 |         4.0 |       0.25 |         0.25 |
+-----------+-------------+------------+--------------+

可以看到,POW和POWER的结果是相同的,POW(2,2)和POWER(2,2)返回2的2次方,结果都是4;POW(2,-2)和POWER(2,-2)都返回2的-2次方,结果为4的倒数,即0.25。

EXP(x)返回e的x乘方后的值。

使用EXP函数计算e的乘方,输入语句如下:

select exp(3), exp(-3), exp(0);

+--------------------+----------------------+--------+
|             exp(3) |              exp(-3) | exp(0) |
+--------------------+----------------------+--------+
| 20.085536923187668 | 0.049787068367863944 |    1.0 |
+--------------------+----------------------+--------+

EXP(3)返回以e为底的3次方,结果为20.085536923187668;EXP(-3)返回以e为底的-3次方,结果为0.049787068367863944;EXP(0)返回以e为底的0次方,结果为1。

2.8、对数运算函数LOG(x)和LOG10(x)

LOG(x)返回x的自然对数,x相对于基数e的对数。

使用LOG(x)函数计算自然对数,输入语句如下:

select log(3), log(-3);

+--------------------+---------+
|             log(3) | log(-3) |
+--------------------+---------+
| 1.0986122886681098 |  <null> |
+--------------------+---------+

对数定义域不能为负数,因此LOG(-3)返回结果为NULL。

LOG10(x)返回x的基数为10的对数。

使用LOG10计算以10为基数的对数,输入语句如下:

select log10(2), log10(100), log10(-100);

+--------------------+------------+-------------+
|           log10(2) | log10(100) | log10(-100) |
+--------------------+------------+-------------+
| 0.3010299956639812 |        2.0 |      <null> |
+--------------------+------------+-------------+

10的2次乘方等于100,因此LOG10(100)返回结果为2,LOG10(-100)定义域非负,因此返回NULL。

2.9、角度与弧度相互转换的函数RADIANS(x)和DEGREES(x)

RADIANS(x)将参数x由角度转化为弧度。

使用RADIANS将角度转换为弧度,输入语句如下:

select radians(90), radians(180);

+--------------------+-------------------+
|        radians(90) |      radians(180) |
+--------------------+-------------------+
| 1.5707963267948966 | 3.141592653589793 |
+--------------------+-------------------+

DEGREES(x)将参数x由弧度转化为角度。

使用DEGREES将弧度转换为角度,输入语句如下:

select degrees(pi()), degrees(pi()/2);

+---------------+-----------------+
| degrees(pi()) | degrees(pi()/2) |
+---------------+-----------------+
|         180.0 |            90.0 |
+---------------+-----------------+

2.10、正弦函数SIN(x)和反正弦函数ASIN(x)

SIN(x)返回x正弦,其中x为弧度值。

使用SIN函数计算正弦值,输入语句如下:

select sin(1), round(sin(pi()));

+--------------------+------------------+
|             sin(1) | round(sin(pi())) |
+--------------------+------------------+
| 0.8414709848078965 |              0.0 |
+--------------------+------------------+

ASIN(x)返回x的反正弦,即正弦为x的值。若x不在-1到1的范围之内,则返回NULL。

使用ASIN函数计算反正弦值,输入语句如下:

select asin(0.8414709848078965), asin(3);

+--------------------------+---------+
| asin(0.8414709848078965) | asin(3) |
+--------------------------+---------+
|                      1.0 |  <null> |
+--------------------------+---------+

由结果可以看到,函数ASIN和SIN互为反函数;ASIN(3)中的参数3超出了正弦值的范围,因此返回NULL。

2.11、余弦函数COS(x)和反余弦函数ACOS(x)

COS(x)返回x的余弦,其中x为弧度值。

使用COS函数计算余弦值,输入语句如下:

select cos(0), cos(pi()), cos(1);

+--------+-----------+--------------------+
| cos(0) | cos(pi()) |             cos(1) |
+--------+-----------+--------------------+
|    1.0 |      -1.0 | 0.5403023058681398 |
+--------+-----------+--------------------+

由结果可以看到,COS(0)值为1;COS(PI())值为-1;COS(1)值为0.5403023058681398。

ACOS(x)返回x的反余弦,即余弦是x的值。若x不在-1~1的范围之内,则返回NULL。

使用ACOS函数计算反余弦值,输入语句如下:

select acos(1), acos(0), round(acos(0.5403023058681398));

+---------+--------------------+---------------------------------+
| acos(1) |            acos(0) | round(acos(0.5403023058681398)) |
+---------+--------------------+---------------------------------+
|     0.0 | 1.5707963267948966 |                             1.0 |
+---------+--------------------+---------------------------------+

由结果可以看到,函数ACOS和COS互为反函数。

2.12、正切函数、反正切函数和余切函数

TAN(x)返回x的正切,其中x为给定的弧度值。

使用TAN函数计算正切值,输入语句如下:

select tan(0.3), round(tan(pi()/4));

+---------------------+--------------------+
|            tan(0.3) | round(tan(pi()/4)) |
+---------------------+--------------------+
| 0.30933624960962325 |                1.0 |
+---------------------+--------------------+

ATAN(x)返回x的反正切,即正切为x的值。

使用ATAN函数计算反正切值,输入语句如下:

select atan(0.30933624960962325), atan(1);

+---------------------------+--------------------+
| atan(0.30933624960962325) |            atan(1) |
+---------------------------+--------------------+
|                       0.3 | 0.7853981633974483 |
+---------------------------+--------------------+

由结果可以看到,函数ATAN和TAN互为反函数。

COT(x)返回x的余切。

使用COT()函数计算余切值,输入语句如下:

select cot(0.3), 1/tan(0.3), cot(pi()/4);

+--------------------+--------------------+--------------------+
|           cot(0.3) |         1/tan(0.3) |        cot(pi()/4) |
+--------------------+--------------------+--------------------+
| 3.2327281437658275 | 3.2327281437658275 | 1.0000000000000002 |
+--------------------+--------------------+--------------------+

由结果可以看到,函数COT和TAN互为倒函数。

3、字符串函数

字符串函数主要用来处理数据库中的字符串数据。MySQL中的字符串函数有计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。

3.1、计算字符串字符数的函数char_length(str)和字符串长度的函数length(str)

CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。

使用CHAR_LENGTH函数计算字符串字符个数,输入语句如下:

select char_length('date'), char_length('egg');

+---------------------+--------------------+
| char_length('date') | char_length('egg') |
+---------------------+--------------------+
|                   4 |                  3 |
+---------------------+--------------------+

LENGTH(str)返回值为字符串的字节长度,使用utf8(UNICODE的一种变长字符编码,又称万国码)编码字符集时,一个汉字是3字节,一个数字或字母算1字节。

使用LENGTH函数计算字符串长度,输入语句如下:

select length('date'), length('egg');

+----------------+---------------+
| length('date') | length('egg') |
+----------------+---------------+
|              4 |             3 |
+----------------+---------------+

可以看到,计算的结果与CHAR_LENGTH相同,因为英文字符的个数和所占的字节相同,一个字符占1字节。

3.2、合并字符串函数CONCAT(s1,s2,…)、CONCAT_WS(x,s1,s2,…)

CONCAT(s1,s2,…)返回结果为连接参数产生的字符串,或许有一个或多个参数。如有任何一个参数为NULL,则返回值为NULL。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。

使用CONCAT函数连接字符串,输入语句如下:

select concat('My SQL', '8.0'), concat('My', NULL, 'SQL');

+-------------------------+---------------------------+
| concat('My SQL', '8.0') | concat('My', NULL, 'SQL') |
+-------------------------+---------------------------+
| My SQL8.0               | <null>                    |
+-------------------------+---------------------------+

CONCAT(‘My SQL’, ‘8.0’)返回两个字符串连接后的字符串;CONCAT(‘My’,NULL, ‘SQL’)中有一个参数为NULL,因此返回结果为NULL。

在CONCAT_WS(x,s1,s2,…)CONCAT_WS代表CONCAT WithSeparator,是CONCAT()的特殊形式。第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。

使用CONCAT_WS函数连接带分隔符的字符串,输入语句如下:

select concat_ws('-', '1st', '2nd', '3rd'), concat_ws('*', '1st', null, '3rd');

+-------------------------------------+------------------------------------+
| concat_ws('-', '1st', '2nd', '3rd') | concat_ws('*', '1st', null, '3rd') |
+-------------------------------------+------------------------------------+
| 1st-2nd-3rd                         | 1st*3rd                            |
+-------------------------------------+------------------------------------+

CONCAT_WS(‘-’, ‘1st’,‘2nd’, ‘3rd’)使用分隔符‘-’将3个字符串连接成一个字符串,结果为“1st-2nd-3rd”​;CONCAT_WS('', ‘1st’,NULL, ‘3rd’)使用分隔符‘’将两个字符串连接成一个字符串,同时忽略NULL值。

3.3、替换字符串的函数INSERT(s1,x,len,s2)

INSERT(s1,x,len,s2)返回字符串s1,其子字符串起始于x位置和被字符串s2取代的len字符。如果x超过字符串长度,则返回值为原始字符串。假如len的长度大于其他字符串的长度,则从位置x开始替换。若任何一个参数为NULL,则返回值为NULL。

使用INSERT函数进行字符串替代操作,输入语句如下:

select insert('Quest', 2, 4, 'What') as col1,
insert('Quest', -1, 4, 'What') as col2,
insert('Quest', 3, 100, 'Wh') as col3;


+-------+-------+------+
| col1  | col2  | col3 |
+-------+-------+------+
| QWhat | Quest | QuWh |
+-------+-------+------+

第一个函数INSERT(‘Quest’, 2, 4, ‘What’)将“Quest”第2个字符开始长度为4的字符串替换为What,结果为“QWhat”​;

第二个函数INSERT(‘Quest’, -1, 4, ‘What’)中起始位置-1超出了字符串长度,直接返回原字符;

第三个函数INSERT(‘Quest’, 3, 100, ‘What’)替换长度超出了原字符串长度,则从第3个字符开始,截取后面所有的字符,并替换为指定字符What,结果为“QuWhat”​。

3.4、字母大小写转换函数

LOWER (str)或者LCASE (str)可以将字符串str中的字母字符全部转换成小写字母。

使用LOWER函数或者LCASE函数将字符串中所有字母字符转换为小写,输入语句如下:

select lower('BEAUTIFUL'), lcase('Well');

+--------------------+---------------+
| lower('BEAUTIFUL') | lcase('Well') |
+--------------------+---------------+
| beautiful          | well          |
+--------------------+---------------+

由结果可以看到,原来所有字母为大写的,全部转换为小写,如“BEAUTIFUL”​,转换之后为“beautiful”​;大小写字母混合的字符串,小写不变,大写字母转换为小写字母,如“WelL”​,转换之后为“well”​。

UPPER(str)或者UCASE(str)可以将字符串str中的字母字符全部转换成大写字母。

使用UPPER函数或者UCASE函数将字符串中所有字母字符转换为大写,输入语句如下:

select upper('black'), ucase('BLacK');

+----------------+----------------+
| upper('black') | ucase('BLacK') |
+----------------+----------------+
| BLACK          | BLACK          |
+----------------+----------------+

由结果可以看到,原来所有字母字符为小写的,全部转换为大写,如“black”​,转换之后为“BLACK”​;大小写字母混合的字符串,大写不变,小写字母转换为大写字母,如“BLacK”​,转换之后为“BLACK”​。

3.5、获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)

LEFT(s,n)返回字符串s开始的最左边n个字符。

使用LEFT函数返回字符串中左边的字符,输入语句如下:

select left('football', 5);

+---------------------+
| left('football', 5) |
+---------------------+
| footb               |
+---------------------+

函数返回字符串“football”左边开始的长度为5的子字符串,结果为“footb”​。

RIGHT(s,n)返回字符串str最右边的n个字符。

使用RIGHT函数返回字符串中右边的字符,输入语句如下:

select right('football', 4);

+----------------------+
| right('football', 4) |
+----------------------+
| ball                 |
+----------------------+

函数返回字符串“football”右边开始的长度为4的子字符串,结果为“ball”​。

3.6、填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)

LPAD(s1,len,s2)返回字符串s1,其左边由字符串s2填补到len字符长度。假如s1的长度大于len,则返回值被缩短至len字符。

使用LPAD函数对字符串进行填充操作,输入语句如下:

select lpad('hello', 4, '??'), lpad('hello', 10, '??');

+------------------------+-------------------------+
| lpad('hello', 4, '??') | lpad('hello', 10, '??') |
+------------------------+-------------------------+
| hell                   | ?????hello              |
+------------------------+-------------------------+

字符串“hello”长度大于4,不需要填充,因此LPAD(‘hello’,4,‘??’)只返回被缩短的长度为4的子串“hell”​;字符串“hello”长度小于10,LPAD(‘hello’,10,‘??’)返回结果为“???hello”​,左侧填充‘?’,长度为10。

RPAD(s1,len,s2)返回字符串sl,其右边被字符串s2填补至len字符长度。假如字符串s1的长度大于len,则返回值被缩短到len字符长度。

使用RPAD函数对字符串进行填充操作,输入语句如下:

select rpad('hello', 4, '?'), rpad('hello', 10, '?');

+-----------------------+------------------------+
| rpad('hello', 4, '?') | rpad('hello', 10, '?') |
+-----------------------+------------------------+
| hell                  | hello?????             |
+-----------------------+------------------------+

字符串“hello”长度大于4,不需要填充,因此RPAD(‘hello’,4,‘?’)只返回被缩短的长度为4的子串“hell”​;字符串“hello”长度小于10,RPAD(‘hello’,10,‘?’)返回结果为“hello???”​,右侧填充‘?’,长度为10。

3.7、删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)

LTRIM(s)返回字符串s,字符串左侧空格字符被删除。

使用LTRIM函数删除字符串左边的空格,输入语句如下:

select '( book )', concat('(', ltrim(' book '), ')');

+----------+-----------------------------------+
| ( book ) | concat('(', ltrim(' book '), ')') |
+----------+-----------------------------------+
| ( book ) | (book )                           |
+----------+-----------------------------------+

LTRIM只删除字符串左边的空格,而右边的空格不会被删除,​“ book ”删除左边空格之后的结果为“book”​。

RTRIM(s)返回字符串s,字符串右侧空格字符被删除。

使用RTRIM函数删除字符串右边的空格,输入语句如下:

select '( book )', concat('(', rtrim(' book '), ')');

+----------+-----------------------------------+
| ( book ) | concat('(', rtrim(' book '), ')') |
+----------+-----------------------------------+
| ( book ) | ( book)                           |
+----------+-----------------------------------+

RTRIM只删除字符串右边的空格,左边的空格不会被删除,​“ book ”删除右边空格之后的结果为“ book”​。

TRIM(s)删除字符串s两侧的空格。

使用TRIM函数删除字符串两侧的空格,使用语句如下:

select '( book )', concat('(', trim(' book '), ')');

+----------+----------------------------------+
| ( book ) | concat('(', trim(' book '), ')') |
+----------+----------------------------------+
| ( book ) | (book)                           |
+----------+----------------------------------+

可以看到,函数执行之后字符串“ book ”两边的空格都被删除,结果为“book”​。

3.8、删除指定字符串的函数TRIM(s1 FROM s)

TRIM(s1 FROM s)删除字符串s中两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格。

使用TRIM(s1 FROM s)函数删除字符串中两端指定的字符,输入语句如下:

select trim('xy' from 'xyxboxyokxxyxy');

+----------------------------------+
| trim('xy' from 'xyxboxyokxxyxy') |
+----------------------------------+
| xboxyokx                         |
+----------------------------------+

删除字符串“xyxboxyokxxyxy”两端的重复字符串“xy”​,而中间的“xy”并不删除,结果为“xboxyokx”​。

3.9、重复生成字符串的函数REPEAT(s,n)

REPEAT(s,n)返回一个由重复的字符串s组成的字符串,字符串s的数目等于n。若n<=0,则返回一个空字符串。若s或n为NULL,则返回NULL。

使用REPEAT函数重复生成相同的字符串,输入语句如下:

select repeat('mysql', 3);

+--------------------+
| repeat('mysql', 3) |
+--------------------+
| mysqlmysqlmysql    |
+--------------------+

REPEAT(‘MySQL’, 3)函数返回的字符串由3个重复的“MySQL”字符串组成。

3.10、空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)

SPACE(n)返回一个由n个空格组成的字符串。

使用SPACE函数生成由空格组成的字符串,输入语句如下:

select concat('(', space(6), ')');

+----------------------------+
| concat('(', space(6), ')') |
+----------------------------+
| (      )                   |
+----------------------------+

SPACE(6)返回的字符串由6个空格组成。

REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。

使用REPLACE函数进行字符串替代操作,输入语句如下:

select replace('xxx.mysql.com', 'x', 'w');

+------------------------------------+
| replace('xxx.mysql.com', 'x', 'w') |
+------------------------------------+
| www.mysql.com                      |
+------------------------------------+

REPLACE(‘xxx.MySQL.com’, ‘x’, ‘w’)将“xxx.MySQL.com”字符串中的‘x’字符替换为‘w’字符,结果为“www.MySQL.com”​。

3.11、比较字符串大小的函数STRCMP(s1,s2)

STRCMP(s1,s2):若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1;其他情况返回1。

使用STRCMP函数比较字符串大小,输入语句如下:

select strcmp('txt', 'txt2'), strcmp('txt2', 'txt'), strcmp('txt', 'txt');

+-----------------------+-----------------------+----------------------+
| strcmp('txt', 'txt2') | strcmp('txt2', 'txt') | strcmp('txt', 'txt') |
+-----------------------+-----------------------+----------------------+
|                    -1 |                     1 |                    0 |
+-----------------------+-----------------------+----------------------+

“txt”小于“txt2”​,因此STRCMP(‘txt’, ‘txt2’)返回结果为-1,STRCMP(‘txt2’, ‘txt’)返回结果为1;​“txt”与“txt”相等,因此STRCMP(‘txt’, ‘txt’)返回结果为0。

3.12、获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)

SUBSTRING(s,n,len)带有len参数的格式,从字符串s返回一个长度与len字符相同的子字符串,起始于位置n。也可能对n使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的n字符,即倒数第n个字符,而不是字符串的开头位置。

使用SUBSTRING函数获取指定位置处的子字符串,输入语句如下:

select 
	substring('breakfast', 5) as col1,
	substring('breakfast', 5, 3) as col2,
	substring('lunch', -3) as col3,
	substring('lunch', -5, 3) as col4;

+-------+------+------+------+
| col1  | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa  | nch  | lun  |
+-------+------+------+------+

SUBSTRING(‘breakfast’,5)返回从第5个位置开始到字符串结尾的子字符串,结果为“kfast”​;SUBSTRING(‘breakfast’,5,3)返回从第5个位置开始长度为3的子字符串,结果为“kfa”​;SUBSTRING(‘lunch’, -3)返回从结尾开始第3个位置到字符串结尾的子字符串,结果为“nch”​;SUBSTRING(‘lunch’, -5, 3)返回从结尾开始第5个位置,即字符串开头起,长度为3的子字符串,结果为“lun”​。

MID(s,n,len)与SUBSTRING(s,n,len)的作用相同。

使用MID()函数获取指定位置处的子字符串,输入语句如下:

select mid('breakfast', 5) as col1,
	mid('breakfast', 5, 3) as col2,
	mid('lunch', -3) as col3,
	mid('lunch', -5, 3) as col4;

+-------+------+------+------+
| col1  | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa  | nch  | lun  |
+-------+------+------+------+

可以看到MID和SUBSTRING的结果是一样的。

3.13、匹配子串开始位置的函数

LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)3个函数的作用相同,返回子字符串str1在字符串str中的开始位置。

使用LOCATE、POSITION、INSTR函数查找字符串中指定子字符串的开始位置,输入语句如下:

select locate('ball', 'football'), position('ball' in 'football'), instr('football', 'ball');


+----------------------------+--------------------------------+---------------------------+
| locate('ball', 'football') | position('ball' in 'football') | instr('football', 'ball') |
+----------------------------+--------------------------------+---------------------------+
|                          5 |                              5 |                         5 |
+----------------------------+--------------------------------+---------------------------+

子字符串“ball”在字符串“football”中从第5个字母位置开始,因此3个函数返回结果都为5。

3.14、字符串逆序的函数REVERSE(s)

REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相反。

使用REVERSE函数反转字符串,输入语句如下:

select reverse('abc');

+----------------+
| reverse('abc') |
+----------------+
| cba            |
+----------------+

可以看到,字符串“abc”经过REVERSE函数处理之后所有字符串顺序被反转,结果为“cba”​。

3.15、返回指定位置的字符串的函数

ELT(N,字符串1,字符串2,字符串3,…,字符串N):若N = 1,则返回值为字符串1;若N=2,则返回值为字符串2;以此类推;若N小于1或大于参数的数目,则返回值为NULL。

使用ELT函数返回指定位置字符串,输入语句如下:

select elt(3, '1st', '2nd', '3rd'), elt(3, 'net', 'os');

+-----------------------------+---------------------+
| elt(3, '1st', '2nd', '3rd') | elt(3, 'net', 'os') |
+-----------------------------+---------------------+
| 3rd                         | <null>              |
+-----------------------------+---------------------+

由结果可以看到,ELT(3,‘1st’,‘2nd’,‘3rd’)返回第3个位置的字符串“3rd”​;ELT(3,‘net’,‘os’)指定返回字符串位置超出参数个数,返回NULL。

3.16、返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)

FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回值为0。如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。

使用FIELD函数返回指定字符串第一次出现的位置,输入语句如下:

select field('Hi', 'hihi', 'Hey', 'Hi', 'bas') as col1,
	field('Hi', 'Hey', 'Lo', 'Hilo', 'foo') as col2;

+------+------+
| col1 | col2 |
+------+------+
|    3 |    0 |
+------+------+

在FIELD(‘Hi’, ‘hihi’, ‘Hey’, ‘Hi’, ‘bas’)函数中,字符串“Hi”出现在列表的第3个字符串位置,因此返回结果为3;FIELD(‘Hi’, ‘Hey’,‘Lo’, ‘Hilo’, ‘foo’)列表中没有字符串“Hi”​,因此返回结果为0。

3.17、返回子串位置的函数FIND_IN_SET(s1,s2)

FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。

使用FIND_IN_SET()函数返回子字符串在字符串列表中的位置,输入语句如下:

select find_in_set('Hi', 'hihi,Hey,Hi,bas');

+--------------------------------------+
| find_in_set('Hi', 'hihi,Hey,Hi,bas') |
+--------------------------------------+
|                                    3 |
+--------------------------------------+

虽然FIND_IN_SET()和FIELD()两个函数格式不同,但作用类似,都可以返回指定字符串在字符串列表中的位置。

3.18、选取字符串的函数MAKE_SET(x,s1,s2,…,sn)

MAKE_SET(x,s1,s2,…,sn)函数按x的二进制数从s1,s2,…,sn中选取字符串。例如5的二进制是0101,这个二进制从右往左的第1位和第3位是1,所以选取s1和s3。s1,s2,…,sn中的NULL值不会被添加到结果中。

使用MAKE_SET根据二进制位选取指定字符串,输入语句如下:

select 
	make_set(1, 'a', 'b', 'c') as col1,
	make_set(1 | 4, 'hello', 'nice', 'world') as col2,
	make_set(1 | 4, 'hello', 'nice', null, 'world') as col3,
	make_set(0, 'a', 'b', 'c') as col4;

+------+-------------+-------+------+
| col1 | col2        | col3  | col4 |
+------+-------------+-------+------+
| a    | hello,world | hello |      |
+------+-------------+-------+------+

1的二进制值为0001,4的二进制值为0100,1与4进行或操作之后的二进制值为0101,从右到左第1位和第3位为1。MAKE_SET(1,‘a’,‘b’,‘c’)返回第1个字符串;SET(1 | 4,‘hello’,‘nice’,‘world’)返回从左端开始第1个和第3个字符串组成的字符串;NULL不会添加到结果中,因此SET(1 |4,‘hello’,‘nice’,NULL,‘world’)只返回第1个字符串‘hello’;SET(0,‘a’,‘b’,‘c’)返回空字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值