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)