MySQL学习之路6

MySQL函数

1.数学函数
1.1绝对值函数ABS(x),返回圆周率的函数PI(x)
例:
使用绝对值函数

mysql> SELECT ABS(-33),ABS(-3.3),ABS(2);
+----------+-----------+--------+
| ABS(-33) | ABS(-3.3) | ABS(2) |
+----------+-----------+--------+
|       33 |       3.3 |      2 |
+----------+-----------+--------+
1 row in set (0.11 sec)

使用圆周率函数

mysql> SELECT PI();
+----------+
| PI()     |
+----------+
| 3.141593 |
+----------+
1 row in set (0.10 sec)

1.2 平方根函数SQRT(x),求余函数MOD(x)
例:
使用平方根函数:

mysql> SELECT SQRT(9),SQRT(40),SQRT(-49);
+---------+-------------------+-----------+
| SQRT(9) | SQRT(40)          | SQRT(-49) |
+---------+-------------------+-----------+
|       3 | 6.324555320336759 |      NULL |
+---------+-------------------+-----------+
1 row in set (0.10 sec)

发现负数没有平方根。

使用求余函数:

mysql> 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 |
+-----------+-------------+-------------+
1 row in set (0.00 sec)

1.3 取整函数CEIL(x),CEILING(x),FLOOR(x)
CEIL(x),CEILING(x)返回不小于x的最小整数值,返回值转化为一个BIGINT。
FLOOR(x)返回不大于x的最大整数值,返回值转化为一个BEGINT。

1.4 获取随机数函数RAND(x)、RAND(x)
RAND(x)返回一个浮点值v,范围在0~1之间。若 已指定一个整数参数x,则它被用作种子值,用来产生重复序列。
例:使用RAND()函数产生随机数,输入如下语句:

mysql> SELECT RAND(),RAND(),RAND();
+---------------------+--------------------+--------------------+
| RAND()              | RAND()             | RAND()             |
+---------------------+--------------------+--------------------+
| 0.18683199322487412 | 0.5247255373045109 | 0.0631317375815769 |
+---------------------+--------------------+--------------------+
1 row in set (0.55 sec)

用RAND(x)函数产生随机数:

mysql> SELECT RAND(10),RAND(10),RAND(11);
+--------------------+--------------------+-------------------+
| RAND(10)           | RAND(10)           | RAND(11)          |
+--------------------+--------------------+-------------------+
| 0.6570515219653505 | 0.6570515219653505 | 0.907234631392392 |
+--------------------+---

1.5 四舍五入函数ROUND(x),ROUND(x,y)和TRUNCATE(x,y)
例:用ROUND(x)函数对操作数进行四舍五入操作,输入如下语句:

mysql> 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 |
+--------------+--------------+-------------+-------------+
1 row in set (0.19 sec)

返回最接近x的整数。

例:使用ROUND(x,y)函数对操作数进行四舍五入操作:

mysql> 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 |
+---------------+---------------+------------------+------------------+
1 row in set (0.03 sec)
mysql> SELECT ROUND(236.38,-1);
+------------------+
| ROUND(236.38,-1) |
+------------------+
|              240 |
+------------------+
1 row in set (0.00 sec)

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

TRUNCATE(x,y)返回被舍去小数点后y位的数字x;若y为0,不保留小数;若y为负数,则将左起第y位开始后面的所有数归零。
TRUNCATE(x,y)直接截取,不进行四舍五入。

mysql> SELECT TRUNCATE(1.31,1),TRUNCATE(1.99,1),TRUNCATE(1.99,-1),TRUNCATE(1.99,0);
+------------------+------------------+-------------------+------------------+
| TRUNCATE(1.31,1) | TRUNCATE(1.99,1) | TRUNCATE(1.99,-1) | TRUNCATE(1.99,0) |
+------------------+------------------+-------------------+------------------+
|              1.3 |              1.9 |                 0 |                1 |
+------------------+------------------+-------------------+------------------+
1 row in set (0.00 sec)

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

mysql> SELECT SIGN(-21),SIGN(0),SIGN(21);
+-----------+---------+----------+
| SIGN(-21) | SIGN(0) | SIGN(21) |
+-----------+---------+----------+
|        -1 |       0 |        1 |
+-----------+---------+----------+
1 row in set (0.02 sec)

1.7 幂运算函数POW(x,y)、POWER(x,y)和EXP(x)
POW(x,y)、POWER(x,y)函数返回x的y次乘方的结果值。
例:使用POW和POWER函数进行乘方运算:

mysql> 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 |          4 |      0.25 |        0.25 |
+----------+------------+-----------+-------------+
1 row in set (0.07 sec)

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

mysql> SELECT EXP(3),EXP(-3),EXP(0);_
+--------------------+----------------------+--------+
| EXP(3)             | EXP(-3)              | EXP(0) |
+--------------------+----------------------+--------+
| 20.085536923187668 | 0.049787068367863944 |      1 |
+--------------------+----------------------+--------+
1 row in set (0.05 sec)

1.8 对数运算函数LOG(x)和LOG10(x)
LOG(x)返回x的自然对数,LOG10(x)返回x的基数为10的对数。
例:使用LOG(x)函数计算自然对数:

mysql> SELECT LOG(3),LOG(-3);
+--------------------+---------+
| LOG(3)             | LOG(-3) |
+--------------------+---------+
| 1.0986122886681098 |    NULL |
+--------------------+---------+
1 row in set, 1 warning (0.32 sec)

例:使用LOG10(x)计算以10为基数的对数:

mysql> SELECT LOG10(2),LOG10(100),log10(-100);
+--------------------+------------+-------------+
| LOG10(2)           | LOG10(100) | log10(-100) |
+--------------------+------------+-------------+
| 0.3010299956639812 |          2 |        NULL |
+--------------------+------------+-------------+
1 row in set, 1 warning (0.02 sec)

1.9 角度与弧度相互转换的函数RADIANS(x)和DEGREES(x)
RADIANS(x)将参数x由角度转化为弧度。
例:使用RADIANS将角度转换为弧度:

mysql> SELECT RADIANS(90),RADIANS(180);
+--------------------+-------------------+
| RADIANS(90)        | RADIANS(180)      |
+--------------------+-------------------+
| 1.5707963267948966 | 3.141592653589793 |
+--------------------+-------------------+
1 row in set (0.01 sec)

mysql> SELECT PI()/2;
+--------------+
| PI()/2       |
+--------------+
| 1.5707963268 |
+--------------+
1 row in set (0.14 sec)

DEGREES(x)将参数x转换为角度。
例:使用DEGREES将弧度转换为角度:

mysql> SELECT DEGREES(PI()),DEGREES(PI()/2);
+---------------+-----------------+
| DEGREES(PI()) | DEGREES(PI()/2) |
+---------------+-----------------+
|           180 |              90 |
+---------------+-----------------+
1 row in set (0.00 sec)

1.10 正弦函数SIN(x)和反正弦函数ASIN(x)
SIN(x)返回正弦,x为弧度值。
例:使用SIN函数计算正弦值:

mysql> SELECT SIN(1),ROUND(SIN(PI()));
+--------------------+------------------+
| SIN(1)             | ROUND(SIN(PI())) |
+--------------------+------------------+
| 0.8414709848078965 |                0 |
+--------------------+------------------+
1 row in set (0.14 sec)

round(x)返回接近x的整数。
ASIN(x)返回x的反正弦,即正弦为x的值。若x不在-1~1之间,返回NULL。
例:使用ASIN函数计算反正弦:

mysql> SELECT ASIN( 0.8414709848078965),asin(3);
+---------------------------+---------+
| ASIN( 0.8414709848078965) | asin(3) |
+---------------------------+---------+
|                         1 |    NULL |
+---------------------------+---------+
1 row in set (0.11 sec)

1.11 余弦函数COS(x)和反余弦函数ACOS(x)
COS(x)返回x的余弦,x为弧度值。
例:使用COS函数计算余弦值:

mysql> SELECT COS(0),COS(PI()),COS(1);
+--------+-----------+--------------------+
| COS(0) | COS(PI()) | COS(1)             |
+--------+-----------+--------------------+
|      1 |        -1 | 0.5403023058681398 |
+--------+-----------+--------------------+
1 row in set (0.02 sec)

ACOS(x)返回x的反余弦。
例:使用ACOS(x)计算反余弦值:

mysql> SELECT ACOS(1),ACOS(0),ROUND(ACOS(0.5403023058681398));
+---------+--------------------+---------------------------------+
| ACOS(1) | ACOS(0)            | ROUND(ACOS(0.5403023058681398)) |
+---------+--------------------+---------------------------------+
|       0 | 1.5707963267948966 |                               1 |
+---------+--------------------+---------------------------------+
1 row in set (0.11 sec)

1.12 正切函数、反正切函数和余切函数
TAN(x)返回x的正切;
ATAN(x)返回x的反正切;
COT(x)返回x的余切。
例:使用TAN(x)、ATAN(x)、COT(x)计算:

mysql> SELECT TAN(0.3),ROUND(TAN(PI()/4));
+---------------------+--------------------+
| TAN(0.3)            | ROUND(TAN(PI()/4)) |
+---------------------+--------------------+
| 0.30933624960962325 |                  1 |
+---------------------+--------------------+
1 row in set (0.00 sec)


mysql> SELECT ATAN( 0.30933624960962325),ATAN(1);
+----------------------------+--------------------+
| ATAN( 0.30933624960962325) | ATAN(1)            |
+----------------------------+--------------------+
|                        0.3 | 0.7853981633974483 |
+----------------------------+--------------------+
1 row in set (0.02 sec)


mysql> 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 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)

2.字符串函数
2.1 计算字符串字符数的函数和字符串长度的函数
CHAR_LENGTH(str)返回字符串str所包含的字符个数。一个多字节字符算作一个单字符。
例:使用CHAR_LENGTH函数计算字符串字符个数:

mysql> SELECT CHAR_LENGTH('DATE'),CHAR_LENGTH('egg');
+---------------------+--------------------+
| CHAR_LENGTH('DATE') | CHAR_LENGTH('egg') |
+---------------------+--------------------+
|                   4 |                  3 |
+---------------------+--------------------+
1 row in set (0.00 sec)

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

mysql> SELECT LENGTH('DATE'),LENGTH('egg');
+----------------+---------------+
| LENGTH('DATE') | LENGTH('egg') |
+----------------+---------------+
|              4 |             3 |
+----------------+---------------+
1 row in set (0.00 sec)

2.2 合并字符串函数CONTACT(s1,s2,…),CONTACT_WS(x,s1,s2,…)
CONTACT(s1,s2,…)返回结果为连接参数产生的字符串,当有任意一个参数为NULL时,返回结果为NULL。
例:使用CONCAT函数连接字符串:

mysql> SELECT CONCAT('My SQL','5.5'),CONCAT('My',NULL,'SQL');
+------------------------+-------------------------+
| CONCAT('My SQL','5.5') | CONCAT('My',NULL,'SQL') |
+------------------------+-------------------------+
| My SQL5.5              | NULL                    |
+------------------------+-------------------------+
1 row in set (0.12 sec)

CONTACT_WS(x,s1,s2,…),CONTACT_WS代表CONCAT With Separator,是CONCAT的特殊形式。第一个参数x是其他参数的分隔符,放在要连接的两个字符之间。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL。
例:使用CONCAT_WS函数连接带分隔符的字符串:

mysql> 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                         |
+----------------------------------+---------------------------------+
1 row in set (0.10 sec)

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

mysql> 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 |
+-------+-------+------+
1 row in set (0.16 sec)

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

例:使用LOWER(str)或者LCASE(str)函数:

mysql> SELECT LOWER('BEAUTIFUL'),LCASE('Well');
+--------------------+---------------+
| LOWER('BEAUTIFUL') | LCASE('Well') |
+--------------------+---------------+
| beautiful          | well          |
+--------------------+---------------+
1 row in set (0.12 sec)

UPPER(str)或者UCASE(str)将字母全部转换为大写字母。
例:使用字母转大写函数UPPER(str)或者UCASE(str):

mysql> SELECT UPPER('black'),UCASE('SFDdds');
+----------------+-----------------+
| UPPER('black') | UCASE('SFDdds') |
+----------------+-----------------+
| BLACK          | SFDDDS          |
+----------------+-----------------+
1 row in set (0.10 sec)

2.5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
LEFT(s,n)返回字符串s开始的最左边n个字符;
RIGHT(s,n)返回字符串s最右边n个字符。
例:使用函数LEFT(s,n)和RIGHT(s,n):

mysql> SELECT LEFT('football',5),RIGHT('FOOTBALL',5);
+--------------------+---------------------+
| LEFT('football',5) | RIGHT('FOOTBALL',5) |
+--------------------+---------------------+
| footb              | TBALL               |
+--------------------+---------------------+
1 row in set (0.00 sec)

2.6 填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)
LPAD(s1,len,s2)返回字符串s1,其左边由字符串s2填补到len字符长度。若s1的长度大于len,则返回值被缩短至len字符。
例:使用LPAD函数对字符串进行填充操作:

mysql> SELECT LPAD('HELLO',4,'??'),LPAD('HELLO',10,'??');
+----------------------+-----------------------+
| LPAD('HELLO',4,'??') | LPAD('HELLO',10,'??') |
+----------------------+-----------------------+
| HELL                 | ?????HELLO            |
+----------------------+-----------------------+
1 row in set (0.02 sec)

RPAD用法与LPAD相似,只是从右边开始。
例:使用RPAD函数对字符串进行填充:

mysql> SELECT RPAD('HELLO',4,'?'),RPAD('HELLO',10,'?');
+---------------------+----------------------+
| RPAD('HELLO',4,'?') | RPAD('HELLO',10,'?') |
+---------------------+----------------------+
| HELL                | HELLO?????           |
+---------------------+----------------------+
1 row in set (0.10 sec)

2.7 删除空格的函数LTRIM(s)、RTRIM(s)、TRIM(s)
LTRIM(s):返回字符串s,字符串左侧空格字符被删除。
RTRIM(s):返回字符串s,字符串右侧空格字符被删除。
TRIM(S):删除字符串s两侧的空格。
例:使用删除空格的函数LTRIM(s)、RTRIM(s)、TRIM(s):

LTRIM:

mysql> SELECT LTRIM('    BOOK    '),CONCAT('(',LTRIM('  BOOK   '),')');
+-----------------------+------------------------------------+
| LTRIM('    BOOK    ') | CONCAT('(',LTRIM('  BOOK   '),')') |
+-----------------------+------------------------------------+
| BOOK                  | (BOOK   )                          |
+-----------------------+------------------------------------+
1 row in set (0.13 sec)

RTRIM:

mysql> SELECT RTRIM('    BOOK    '),CONCAT('(',RTRIM('  BOOK   '),')');
+-----------------------+------------------------------------+
| RTRIM('    BOOK    ') | CONCAT('(',RTRIM('  BOOK   '),')') |
+-----------------------+------------------------------------+
|     BOOK              | (  BOOK)                           |
+-----------------------+------------------------------------+
1 row in set (0.00 sec)

TRIM:

mysql> SELECT TRIM('    BOOK    '),CONCAT('(',TRIM('  BOOK   '),')');
+----------------------+-----------------------------------+
| TRIM('    BOOK    ') | CONCAT('(',TRIM('  BOOK   '),')') |
+----------------------+-----------------------------------+
| BOOK                 | (BOOK)                            |
+----------------------+-----------------------------------+
1 row in set (0.00 sec)

2.9 重复生成字符串的函数REPEAT(s,n)
REPEAT(s,n)返回一个由重复的字符串s组成的字符串,重复n。若n<=0,则返回一个空字符串;若s或n为NULL,则返回NULL。
例:使用REPEAT函数重复生成相同的字符串:

mysql> SELECT REPEAT('ASDSD',6),REPEAT('SAFFG',0),REPEAT('DAG',NULL),REPEAT(NULL,3);
+--------------------------------+-------------------+--------------------+----------------+
| REPEAT('ASDSD',6)              | REPEAT('SAFFG',0) | REPEAT('DAG',NULL) | REPEAT(NULL,3) |
+--------------------------------+-------------------+--------------------+----------------+
| ASDSDASDSDASDSDASDSDASDSDASDSD |                   | NULL               | NULL           |
+--------------------------------+-------------------+--------------------+----------------+
1 row in set (0.11 sec)

2.10 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)
SPACE(n)返回一个由n个空格组成的字符串;
REPLACE(s,s1,s2)使用s2代替s中的所有s1。
例:使用空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)

mysql> SELECT CONCAT('(',SPACE(4),')'),REPLACE('XXX.MYSQL.COM','X','W');
+--------------------------+----------------------------------+
| CONCAT('(',SPACE(4),')') | REPLACE('XXX.MYSQL.COM','X','W') |
+--------------------------+----------------------------------+
| (    )                   | WWW.MYSQL.COM                    |
+--------------------------+----------------------------------+
1 row in set (0.06 sec)

mysql> SELECT CONCAT('(',SPACE(4),')'),REPLACE('XXX.MYSQL.COM','XX','WW');
+--------------------------+------------------------------------+
| CONCAT('(',SPACE(4),')') | REPLACE('XXX.MYSQL.COM','XX','WW') |
+--------------------------+------------------------------------+
| (    )                   | WWX.MYSQL.COM                      |
+--------------------------+------------------------------------+
1 row in set (0.00 sec)

2.11 比较字符串大小的函数STRCMP(s1,s2)
例:

mysql> SELECT STRCMP('TXT','TXT2'),STRCMP('TXT2','TXT'),STRCMP('TXT','TXT');
+----------------------+----------------------+---------------------+
| STRCMP('TXT','TXT2') | STRCMP('TXT2','TXT') | STRCMP('TXT','TXT') |
+----------------------+----------------------+---------------------+
|                   -1 |                    1 |                   0 |
+----------------------+----------------------+---------------------+
1 row in set (0.14 sec)

2.12 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)
例:使用SUBSTRING函数获取指定位置处的字符串:

mysql> SELECT SUBSTRING('BREAKFAST',5)  AS COL1,
    -> SUBSTRING('BREAKFAST',5,3) AS COL2,
    -> SUBSTRING('LUNCH',-3)  AS COL3;
+-------+------+------+
| COL1  | COL2 | COL3 |
+-------+------+------+
| KFAST | KFA  | NCH  |
+-------+------+------+
1 row in set (0.00 sec)

例:使用MID函数获取指定位置处的子字符串:

mysql> SELECT MID('BREAKFAST',5)  AS COL1,
    -> MID('BREAKFAST',5,3)  AS COL2,
    -> MID('BREAKFAST',-5)  AS COL3,
    -> MID('BREAKFAST',-5,3)  AS COL4;
+-------+------+-------+------+
| COL1  | COL2 | COL3  | COL4 |
+-------+------+-------+------+
| KFAST | KFA  | KFAST | KFA  |
+-------+------+-------+------+
1 row in set (0.00 sec)

2.13 匹配子串开始位置的函数
LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str,str1)三个函数的作用是相同的,返回子字符串str1在str中的开始位置。
例:使用LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str,str1)三个函数:

mysql> SELECT LOCATE('BALL','FOOTBALL'),POSITION('BALL' IN 'FOOTBALL'),INSTR('FOOTBALL','BALL');
+---------------------------+--------------------------------+--------------------------+
| LOCATE('BALL','FOOTBALL') | POSITION('BALL' IN 'FOOTBALL') | INSTR('FOOTBALL','BALL') |
+---------------------------+--------------------------------+--------------------------+
|                         5 |                              5 |                        5 |
+---------------------------+--------------------------------+--------------------------+
1 row in set (0.11 sec)

2.14 字符串逆序的函数REVERSE(s)
函数REVERSE(s)将字符串s反转。
例:使用函数REVERSE(s)反转字符串:

mysql> select reverse('abc');
+----------------+
| reverse('abc') |
+----------------+
| cba            |
+----------------+
1 row in set (0.00 sec)

2.16 返回指定字符串位置的函数 FIELD(s,s1,s2,…)
FIELD(s,s1,s2,…)返回字符串s在列表s1,s2,…中第一次出现的位置。
例:使用FIELD函数返回指定字符串第一次出现的位置:

mysql> SELECT FIELD('Hi','hihi','Hi','Hey','bas') AS col1,
    -> FIELD('Hi','Hey','Lo','fdjkhg') as col2;
+------+------+
| col1 | col2 |
+------+------+
|    2 |    0 |
+------+------+
1 row in set (0.00 sec)

2.17 返回子串位置的函数FIND_IN_SET(s1,s2)
FIND_IN_SET(s1,s2)返回s1在字符串列表s2中出现的位置。
例:使用FIND_IN_SET( )函数返回子字符串在字符串列表中的位置:

mysql> SELECT FIND_IN_SET('HI','HI,DF,DOF');
+-------------------------------+
| FIND_IN_SET('HI','HI,DF,DOF') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.00 sec)

2.18 选取字符串的函数MAKE_SET(x,s1,s2,…)
MAKE_SET(x,s1,s2,…)返回由x的二进制数指定的相应位的字符串组成的字符串,s1对应比特1,s2对应比特01以此类推。s1,s2,…中的NULL值不会被添加到结果中。
例:只用MAKE_SET(x,s1,s2,…)选取指定字符串:

mysql> SELECT MAKE_SET(1,'A','B','C') AS COL1,
    ->  MAKE_SET(1,'A','B','C') AS COL1,
    -> MAKE_SET(1|4,'HELLO','KJJ',NULL,'WORD') AS COL3,
    ->  MAKE_SET(0,'HELLO','WORD') AS COL4;
+------+------+-------+------+
| COL1 | COL1 | COL3  | COL4 |
+------+------+-------+------+
| A    | A    | HELLO |      |
+------+------+-------+------+
1 row in set (0.12 sec)

 1的二进制位为0001,4的二进制位为0100,1与4操作后得0101,从右到左第1位和第3位为1。

3. 日期和时间函数
3.1 获取当前日期的函数和获取当前时间的函数
CURDATE()和CURRENT_DATE()返回当前日期。
CURTIME()和CURRENT_TIME()返回当前时间。

mysql> SELECT CURDATE(),CURRENT_DATE(),CURDATE()+0;
+------------+----------------+-------------+
| CURDATE()  | CURRENT_DATE() | CURDATE()+0 |
+------------+----------------+-------------+
| 2018-12-14 | 2018-12-14     |    20181214 |
+------------+----------------+-------------+
1 row in set (0.00 sec)
mysql> SELECT CURTIME(),CURRENT_TIME(),CURTIME()+0;
+-----------+----------------+-------------+
| CURTIME() | CURRENT_TIME() | CURTIME()+0 |
+-----------+----------------+-------------+
| 13:28:46  | 13:28:46       |      132846 |
+-----------+----------------+-------------+
1 row in set (0.10 sec)

3.2 获取当前日期和时间函数
获取当前日期和时间的函数有:CURRENT_TIMESTAMP()、LOCALTIME()、NOW()和SYSDATE()。

mysql> SELECT CURRENT_TIMESTAMP(),LOCALTIME(),NOW(),SYSDATE();
+---------------------+---------------------+---------------------+---------------------+
| CURRENT_TIMESTAMP() | LOCALTIME()         | NOW()               | SYSDATE()           |
+---------------------+---------------------+---------------------+---------------------+
| 2018-12-14 13:31:12 | 2018-12-14 13:31:12 | 2018-12-14 13:31:12 | 2018-12-14 13:31:12 |
+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.11 sec)

3.3 UNIX时间戳函数
UNIX_TIMESTAMP(date),若无参数调用,返回一个Unix时间戳(‘1970-01-01 00:0000’ GMT之后的秒数)作为无符号整数。GMT为格林尼治标准时间。若用date来调用UNIX_TIMESTAMP(),它会将参数值以GMT后的秒数的形式返回。
使用FROM_UNIXTIME(date)函数可以把Unix时间戳返回普通格式。

mysql> SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP(NOW()),NOW();
+------------------+-----------------------+---------------------+
| UNIX_TIMESTAMP() | UNIX_TIMESTAMP(NOW()) | NOW()               |
+------------------+-----------------------+---------------------+
|       1544765873 |            1544765873 | 2018-12-14 13:37:53 |
+------------------+-----------------------+---------------------+
1 row in set (0.03 sec)

mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()));
+--------------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())) |
+--------------------------------------+
| 2018-12-14 13:38:36                  |
+--------------------------------------+
1 row in set (0.12 sec)

3.4 返回UTC日期和返回UTC时间函数
UTC_DATE()返回当前时区日期值。
UTC_TIME()返回当前时区时间值。

mysql> SELECT UTC_DATE(),UTC_TIME();
+------------+------------+
| UTC_DATE() | UTC_TIME() |
+------------+------------+
| 2018-12-14 | 05:41:52   |
+------------+------------+
1 row in set (0.00 sec)

3.5 获取月份的函数MONTH(date)和MONTHNAME(date)
MONTH(date)返回date对应的月份。
MONTHNAME(date)返回日期date对应月份的英文全名。

mysql> SELECT MONTH('2011-02-13'),MONTHNAME('2011-02-13');
+---------------------+-------------------------+
| MONTH('2011-02-13') | MONTHNAME('2011-02-13') |
+---------------------+-------------------------+
|                   2 | February                |
+---------------------+-------------------------+
1 row in set (0.07 sec)

3.6 获取星期的函数DAYNAME(date)、DAYOFWEEK(d)和WEEKDAY(d)
DAYOFWEEK(d):1

mysql> SELECT DAYNAME('2011-02-13'),DAYOFWEEK('2011-02-13'),WEEKDAY('2011-02-13');
+-----------------------+-------------------------+-----------------------+
| DAYNAME('2011-02-13') | DAYOFWEEK('2011-02-13') | WEEKDAY('2011-02-13') |
+-----------------------+-------------------------+-----------------------+
| Sunday                |                       1 |                     6 |
+-----------------------+-------------------------+-----------------------+
1 row in set (0.11 sec)

3.7 获取星期数的函数
WEEK(d)计算日期d是一年中的第几周,WEEK()默认参数为0,代表一周中的第一天为周日,若1代表第一天为周一。
查看default_week_format系统自变量的值:

mysql> SELECT @@default_week_format;
+-----------------------+
| @@default_week_format |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'default_week_format';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| default_week_format | 0     |
+---------------------+-------+
1 row in set, 6 warnings (0.00 sec)
自己设置值:
mysql> SET GLOBAL default_week_format=1;
Query OK, 0 rows affected (0.00 sec)

WEEKOFYEAR(d)计算某天位于一年中的第几周。相当于WEEK(d,3)

3.8 获取天数的函数DAYOFYEAR(d)和DAYOFMONTH(d)
DAYOFYEAR(d)返回d是一年中的第几天。
DAYOFMONTH(d)返回d是一个月中的第几天。

3.9 获取年份、季度、小时、分钟和秒钟的函数
YEAR(date)返回date对应的年份。
QUARTER(date)返回date对应一年中的季度值。
MINUTE(time)返回time对应的分钟数。
SECOND(time)返回time对应的秒数。

4. 条件判断函数
4.1 IF(expr,v1,v2)函数

mysql> SELECT IF(1>2,2,3),
    -> IF(1<2,'yes','no'),
    -> IF(STRCMP('test','test1'),'no','yes');
+-------------+--------------------+---------------------------------------+
| IF(1>2,2,3) | IF(1<2,'yes','no') | IF(STRCMP('test','test1'),'no','yes') |
+-------------+--------------------+---------------------------------------+
|           3 | yes                | no                                    |
+-------------+--------------------+---------------------------------------+
1 row in set (0.07 sec)

4.2 IFNULL(v1,v2)函数
如果v1不为NULL,则IFNULL返回v1;否则返回v2。

4.3 CASE函数

mysql> SELECT CASE 2 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
+------------------------------------------------------------+
| CASE 2 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END |
+------------------------------------------------------------+
| two                                                        |
+------------------------------------------------------------+
1 row in set (0.00 sec)

5. 系统信息函数
5.1 获取MySQL版本号、连接数和数据库名的函数

VERSION()返回指示服务器版本的字符串。(utf8字符集)

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.14    |
+-----------+
1 row in set (0.00 sec)

CONNECTION_ID()返回MySQL服务器当前连接的次数,每个连接都有各自唯一的ID。

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               6 |
+-----------------+
1 row in set (0.12 sec)

SHOW PROCESSLIST;SHOW FULL PROCESSLIST;
processlist命令的输出结果显示有哪些线程正在运行,可以查看当前所有的连接数和连接状态,帮助识别出有问题的查询语句等。


mysql> SHOW PROCESSLIST;
+----+------+-----------------+---------+---------+------+----------+------------------+
| Id | User | Host            | db      | Command | Time | State    | Info             |
+----+------+-----------------+---------+---------+------+----------+------------------+
|  6 | root | localhost:52733 | test_db | Query   |    0 | starting | SHOW PROCESSLIST |
+----+------+-----------------+---------+---------+------+----------+------------------+
1 row in set (0.11 sec)

DATABASE(),SCHEMA()函数返回使用utf8字符集的默认(当前)数据库名。

mysql> SELECT DATABASE(),SCHEMA();
+------------+----------+
| DATABASE() | SCHEMA() |
+------------+----------+
| test_db    | test_db  |
+------------+----------+
1 row in set (0.00 sec)

5.2 获取用户名的函数
USER()、CURRENT_USER、CURRENT_USER()、SYSTEM_USER()和SESSION_USER()。返回MySQL服务器验证的用户名和主机名组合。

mysql> SELECT USER(),CURRENT_USER(),SYSTEM_USER();
+----------------+----------------+----------------+
| USER()         | CURRENT_USER() | SYSTEM_USER()  |
+----------------+----------------+----------------+
| root@localhost | root@localhost | root@localhost |
+----------------+----------------+----------------+
1 row in set (0.10 sec)

5.3 获取最后一个自动生成的ID值的函数
LAST_INSERT_ID()自动返回最后一个INSERT或UPDATE为AUTO_INCREMENT列设置的第一个发生的值。
一次插入一条记录,返回值为最后一条插入记录的id:

mysql> CREATE TABLE worker (Id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> name VARCHAR(30));
Query OK, 0 rows affected (1.21 sec)

mysql> INSERT INTO worker VALUES(NULL,'jimy');
Query OK, 1 row affected (0.29 sec)

mysql> INSERT INTO worker VALUES(NULL,'Tom');
Query OK, 1 row affected (0.16 sec)

mysql> SELECT * FROM worker;
+----+------+
| Id | name |
+----+------+
|  1 | jimy |
|  2 | Tom  |
+----+------+
2 rows in set (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.10 sec)

同时插入多条记录时,返回插入的第一行数据时产生的值:

mysql> INSERT INTO worker VALUES(NULL,'Keiven'),(NULL,'Michal'),(NULL,'Nick');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM worker;
+----+--------+
| Id | name   |
+----+--------+
|  1 | jimy   |
|  2 | Tom    |
|  3 | Keiven |
|  4 | Michal |
|  5 | Nick   |
+----+--------+
5 rows in set (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

6.其他函数
6.1 IP地址与数字相互转换的函数

INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。

mysql> SELECT INET_ATON('209.207.224.40');
+-----------------------------+
| INET_ATON('209.207.224.40') |
+-----------------------------+
|                  3520061480 |
+-----------------------------+
1 row in set (0.11 sec)

INET_NTOA(expr)返回地址:

mysql> SELECT INET_NTOA('3520061480');
+-------------------------+
| INET_NTOA('3520061480') |
+-------------------------+
| 209.207.224.40          |
+-------------------------+
1 row in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/weixin_43037507/article/details/84992418
今日推荐