07_MySQL函数

一、数学函数

1.绝对值函数:ABS(x)
ABS(x) 用于返回 x 的绝对值

mysql> select abs(22),abs(-22),abs(33),abs(-33);
+---------+----------+---------+----------+
| abs(22) | abs(-22) | abs(33) | abs(-33) |
+---------+----------+---------+----------+
|      22 |       22 |      33 |       33 |
+---------+----------+---------+----------+
1 row in set (0.00 sec)

2.返回圆周率的函数:PI()
PI() 返回圆周率值

mysql> select pi();
+----------+
| pi()     |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)

3.平方根函数:SQRT(x)
返回非负数 x 的二次方根

mysql> select sqrt(9),sqrt(40),sqrt(-49);
+---------+-------------------+-----------+
| sqrt(9) | sqrt(40)          | sqrt(-49) |
+---------+-------------------+-----------+
|       3 | 6.324555320336759 |      NULL |
+---------+-------------------+-----------+
1 row in set (0.00 sec)

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

mysql> select mod(9,3),mod(9,2),mod(11,6);
+----------+----------+-----------+
| mod(9,3) | mod(9,2) | mod(11,6) |
+----------+----------+-----------+
|        0 |        1 |         5 |
+----------+----------+-----------+
1 row in set (0.00 sec)

5.获取整数的函数:CEIL(x) 、CEILING(x) 、FLOOR(x)

(1) CEIL(x) 用于返回不小于 x 的最小整数值

mysql> select ceil(1.24),ceil(6.34),ceil(5);
+------------+------------+---------+
| ceil(1.24) | ceil(6.34) | ceil(5) |
+------------+------------+---------+
|          2 |          7 |       5 |
+------------+------------+---------+
1 row in set (0.00 sec)

或者:CEILING(x)

mysql> select ceiling(1.24),ceil(6.34),ceil(5);
+---------------+------------+---------+
| ceiling(1.24) | ceil(6.34) | ceil(5) |
+---------------+------------+---------+
|             2 |          7 |       5 |
+---------------+------------+---------+
1 row in set (0.00 sec)

(2) FLOOR(x) 返回不大于 x 的最大整数值。

mysql> select floor(3.35),floor(-3.35);
+-------------+--------------+
| floor(3.35) | floor(-3.35) |
+-------------+--------------+
|           3 |           -4 |
+-------------+--------------+
1 row in set (0.00 sec)

6.获取随机数的函数:RAND() 、RAND(x)
RAND() 用于返回一个随机浮点值,范围在 0 ~ 1 之间

mysql> select rand(),rand(),rand();
+--------------------+--------------------+--------------------+
| rand()             | rand()             | rand()             |
+--------------------+--------------------+--------------------+
| 0.5841327454747006 | 0.4200328732095965 | 0.3477661603575257 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)

RAND(x) 用于返回一个随机浮点值,范围在 0~1 之间,x 被用作种子值,用来产生重复序列

mysql> select rand(3),rand(6),rand(3);
+--------------------+--------------------+--------------------+
| rand(3)            | rand(6)            | rand(3)            |
+--------------------+--------------------+--------------------+
| 0.9057697559760601 | 0.6563190842571847 | 0.9057697559760601 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)

7. 四舍五入的函数:ROUND(x) 、ROUND(x,y)
ROUND(x) 用于对 x 进行四舍五入

mysql> select round(-1.14),round(1.14),round(1.5);
+--------------+-------------+------------+
| round(-1.14) | round(1.14) | round(1.5) |
+--------------+-------------+------------+
|           -1 |           1 |          2 |
+--------------+-------------+------------+
1 row in set (0.00 sec)

ROUND(x,y) 用于对 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.00 sec)

8. 截取数值的函数:TRUNCATE(x,y)
TRUNCATE(x,y) 用于对 x 进行截取,结果保留小数点后 y 位(只是单纯的截取,并没有四舍五入功能)

mysql> select truncate(1.311,1),truncate(1.99,1),truncate(1.99,0);
+-------------------+------------------+------------------+
| truncate(1.311,1) | truncate(1.99,1) | truncate(1.99,0) |
+-------------------+------------------+------------------+
|               1.3 |              1.9 |                1 |
+-------------------+------------------+------------------+
1 row in set (0.00 sec)

9. 符号函数:SIGN(x)
SIGN(x) 用于返回参数 x 的符号,当 x 为负数时返回 -1 ,当 x 为正数时返回 1 , 当 x 为零时返回 0

mysql> select sign(-21),sign(0),sign(21);
+-----------+---------+----------+
| sign(-21) | sign(0) | sign(21) |
+-----------+---------+----------+
|        -1 |       0 |        1 |
+-----------+---------+----------+
1 row in set (0.00 sec)

10. 幂运算函数:POW(x,y) 、POWER(x,y) 、EXP(x)
POW(x,y) 用于返回 x 的 y 次方的结果

mysql> select pow(2,4),pow(2,-4);
+----------+-----------+
| pow(2,4) | pow(2,-4) |
+----------+-----------+
|       16 |    0.0625 |
+----------+-----------+
1 row in set (0.00 sec)

二、字符串函数

1. 计算字符串长度的函数:CHAR_LENGTH(str) 、LENGTH(str)
CHAR_LENGTH(str) 用于统计str 的字符个数

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) 用于统计 str 的字节长度,使用 utf8 编码字符集时,一个汉字是3个字节,一个数字或字母是1个字节

mysql> select length('我'),length('我们'),length('egg');
+---------------+------------------+---------------+
| length('我')  | length('我们')   | length('egg') |
+---------------+------------------+---------------+
|             3 |                6 |             3 |
+---------------+------------------+---------------+
1 row in set (0.00 sec)

2. 合并字符串的函数:CONCAT(s1,s2,...) 、CONCAT_WS(x,s1,s2,...)
CONCAT(s1,s2,…) 用于合并字符串 s1, s2, …,如果有一个参数为 NULL,则结果为 NULL

mysql> select concat('qin','zi','teng');
+---------------------------+
| concat('qin','zi','teng') |
+---------------------------+
| qinziteng                 |
+---------------------------+
1 row in set (0.00 sec)

CONCAT_WS(x,s1,s2,…) 以 x 作为分隔符,将 s1, s2, … 合并,如果分隔符为 NULL ,则结果为 NULL

mysql> select concat_ws('-','qin','zi','teng');
+----------------------------------+
| concat_ws('-','qin','zi','teng') |    #以'-'作为分隔符
+----------------------------------+
| qin-zi-teng                      |
+----------------------------------+
1 row in set (0.00 sec)

3. 替换字符串的函数:INSERT(s1,x,len,s2)

  • INSERT(s1,x,len,s2) 用于返回字符串 s1,其子字符串起始于 x 位置和被字符串 s2 取代的 len 字符 (简单理解:s1:是字符串 x:是从字符串的第几位开始替换 len:是替换几位 s2:是替换的新字符串)
  • 如果 x 超过字符串长度,则返回值为原始字符串,如果 len 的长度大于其他字符串的长度则从位置 x 开始替换
  • 如果任何一个参数为 NULL ,则返回值为 NULL
mysql> select insert('qinziteng',2,4,'what') as t1,   #从第2个字符开始替换,替换4位
    -> insert('qinziteng',-1,4,'what') as t2,
    -> insert('qinziteng',3,100,'what') as t3;
+-----------+-----------+--------+
| t1        | t2        | t3     |
+-----------+-----------+--------+
| qwhatteng | qinziteng | qiwhat |
+-----------+-----------+--------+
1 row in set (0.00 sec)

4.转换大小写的函数:LOWER(str) 、LCASE(str) 、UPPER(str) 、UCASE(str)
(1) LOWER(str)用于将字符串 str 中的字母字符全部转换成小写字母。

mysql> select lower('ABCTFG'),lower('Well');
+-----------------+---------------+
| lower('ABCTFG') | lower('Well') |
+-----------------+---------------+
| abctfg          | well          |
+-----------------+---------------+
1 row in set (0.00 s

或者使用LCASE(str)

mysql> select lcase('ABCTFG'),lcase('Well');
+-----------------+---------------+
| lcase('ABCTFG') | lcase('Well') |
+-----------------+---------------+
| abctfg          | well          |
+-----------------+---------------+
1 row in set (0.00 sec)

UPPER(str) 用于将 str 中的小写字母转换成大写字母。

mysql> select upper('test'),upper('gee');
+---------------+--------------+
| upper('test') | upper('gee') |
+---------------+--------------+
| TEST          | GEE          |
+---------------+--------------+
1 row in set (0.00 sec)

或者使用UCASE(str)

mysql> select ucase('test'),ucase('gee');
+---------------+--------------+
| ucase('test') | ucase('gee') |
+---------------+--------------+
| TEST          | GEE          |
+---------------+--------------+
1 row in set (0.00 sec)

5. 获取指定长度的字符串的函数:LEFT(s,n) 、RIGHT(s,n)
LEFT(s,n) 用于返回字符串 s 开始的最左边 n 个字符。

mysql> select left('football',5);
+--------------------+
| left('football',5) |
+--------------------+
| footb              |
+--------------------+
1 row in set (0.00 sec)

RIGHT(s,n) 用于返回字符串 s 中右边 n 个字符。

mysql> select right('football',5);
+---------------------+
| right('football',5) |
+---------------------+
| tball               |
+---------------------+
1 row in set (0.00 sec)

6.填充字符串的函数:LPAD(s1,len,s2) 、RPAD(s1,len,s2)
(1) LPAD(s1,len,s2) 返回字符串 s1 ,其左边由字符串 s2填充到 len 字符长度,如果 s1 的长度大于 len ,则返回值被缩短至 len 长度。(填充到左边)

mysql> select lpad('hello',4,'??'),lpad('hello',10,'??');
+----------------------+-----------------------+
| lpad('hello',4,'??') | lpad('hello',10,'??') |
+----------------------+-----------------------+
| hell                 | ?????hello            |
+----------------------+-----------------------+
1 row in set (0.00 sec)

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

mysql> select rpad('hello',4,'??'),rpad('hello',10,'??');
+----------------------+-----------------------+
| rpad('hello',4,'??') | rpad('hello',10,'??') |
+----------------------+-----------------------+
| hell                 | hello?????            |
+----------------------+-----------------------+
1 row in set (0.00 sec)

7.删除空格的函数:LTRIM(s) 、RTRIM(s) 、TRIM(s)
(1) LTRIM(s) 用于删除字符串 s 左侧的空格 (删除左侧空格)

mysql> select ltrim('     rr      ');
+------------------------+
| ltrim('     rr      ') |
+------------------------+
| rr                     |
+------------------------+
1 row in set (0.00 sec)

(2)RTRIM(s) 用于删除字符串 s 右侧的空格(删除右侧空格)

mysql> select rtrim('     rr      ');
+------------------------+
| rtrim('     rr      ') |
+------------------------+
|      rr                |
+------------------------+
1 row in set (0.00 sec)

(3) TRIM(s) 用于删除字符串 s 两侧的空格

mysql> select trim('     rr      ');
+-----------------------+
| trim('     rr      ') |
+-----------------------+
| rr                    |
+-----------------------+
1 row in set (0.00 sec)

8.删除指定两侧字符串的函数:TRIM(s1 FROM s)
TRIM(s1 FROM s) 用于删除字符串 s 中两端所有的子字符串 s1 ,如果没有指定 s1 ,则默认删除字符串 s 两侧的空格。

mysql> select trim('xy' from 'xytestxyxy');
+------------------------------+
| trim('xy' from 'xytestxyxy') |
+------------------------------+
| test                         |
+------------------------------+
1 row in set (0.00 sec)

9.重复生成字符串的函数:REPEAT(s,n)
REPEAT(s,n) 用于重复字符串 s ,n 表示重复多少次

mysql> select repeat('test',3);
+------------------+
| repeat('test',3) |
+------------------+
| testtesttest     |
+------------------+
1 row in set (0.00 sec)

10.空格函数:SPACE(n)
SPACE(n) 用于返回 n 个空格

mysql> select space(20);
+----------------------+
| space(20)            |
+----------------------+
|                      |
+----------------------+
1 row in set (0.00 sec)

11. 替换函数:REPLACE(s,s1,s2)
REPLACE(s,s1,s2) 表示使用字符串 s2 替换字符串 s 中所有的字符串 s1

mysql> select replace('xxx.mysql.com','x','w');  #将xxx替换成www
+----------------------------------+
| replace('xxx.mysql.com','x','w') |
+----------------------------------+
| www.mysql.com                    |
+----------------------------------+
1 row in set (0.00 sec)

12.比较字符串大小的函数:STRCMP(s1,s2)
STRCMP(s1,s2) 用于比较字符串 s1 和 s2 的大小,若所有字符串相同则返回 0 ,若第一个字符串大于第二个字符串则返回 1 ,若第一个字符串小于第二个字符串则返回 -1

mysql> select strcmp('aaa','aaa'),strcmp('aa','aaa'),strcmp('aaaa','aaa');
+---------------------+--------------------+----------------------+
| strcmp('aaa','aaa') | strcmp('aa','aaa') | strcmp('aaaa','aaa') |
+---------------------+--------------------+----------------------+
|                   0 |                 -1 |                    1 |
+---------------------+--------------------+----------------------+
1 row in set (0.00 sec)

13. 获取子字符串的函数:SUBSTRING(s,n,len) 、MID(s,n,len)
SUBSTRING(s,n,len) 用于获取指定位置的子字符串

mysql> select substring('qinziteng',5) as t1,  # 从第5个字符串开始获取
   -> substring('qinziteng',5,3) as t2,       # 从第5个字符串开始,获取3个
   -> substring('qinziteng',-5) as t3,       # (倒向)从第5个字符串开始获取
   -> substring('qinziteng',-5,3) as t4;    # (倒向)从第5个字符串开始获取,获取
+-------+------+-------+------+
| t1    | t2   | t3    | t4   |
+-------+------+-------+------+
| iteng | ite  | iteng | ite  |
+-------+------+-------+------+
1 row in set (0.00 sec)

或者使用MID(s,n,len)

mysql> select mid('qinziteng',5) as t1,
    -> mid('qinziteng',5,3) as t2,
    -> mid('qinziteng',-5) as t3,
    -> mid('qinziteng',-5,3) as t4;
+-------+------+-------+------+
| t1    | t2   | t3    | t4   |
+-------+------+-------+------+
| iteng | ite  | iteng | ite  |
+-------+------+-------+------+
1 row in set (0.00 sec)

14. 匹配子字符串开始位置的函数:LOCATE(str1,str) 、POSITION(str1 IN str) 、INSTR(str, str1)
(1) LOCATE(str1,str) 用于返回字符串 str1 在字符串 str 中的开始位置

mysql> select locate('ball','football');
+---------------------------+
| locate('ball','football') |
+---------------------------+
|                         5 |
+---------------------------+
1 row in set (0.00 sec)

或者使用 POSITION(str1 IN str)

mysql> select position('ball' in 'football');
+--------------------------------+
| position('ball' in 'football') |
+--------------------------------+
|                              5 |
+--------------------------------+
1 row in set (0.00 sec)

(2)INSTR(str, str1) 用于返回子字符串 str1 在字符串 str 中的开始位置

mysql> select instr('football','ball');
+--------------------------+
| instr('football','ball') |
+--------------------------+
|                        5 |
+--------------------------+
1 row in set (0.00 sec)

15. 反转字符串的函数:REVERSE(s)
REVERSE(s) 用于将字符串 s 反转

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

16.返回指定位置的字符串的函数:ELT(n, s1, s2, s3, .....)
ELT(n, s1, s2, s3, …) 用于返回第 n 个字符串,如果 n超出范围则返回 NULL

mysql> select elt(3,'a','b','c','d'),elt(5, 'a', 'b', 'c', 'd');
+------------------------+----------------------------+
| elt(3,'a','b','c','d') | elt(5, 'a', 'b', 'c', 'd') |
+------------------------+----------------------------+
| c                      | NULL                       |
+------------------------+----------------------------+
1 row in set (0.00 sec)

17.返回指定字符串位置的函数:FIELD(s, s1, s2, .....)
FIELD(s, s1, s2, …) 用于返回字符串 s 在列表 s1, s2, … 中的位置,如果不存在字符串 s 则返回 0 ,如果字符串 s 是 NULL 也返回 0

mysql> select field('hi','hihi','hey','hi','bas');
+-------------------------------------+
| field('hi','hihi','hey','hi','bas') |
+-------------------------------------+
|                                   3 |
+-------------------------------------+
1 row in set (0.00 sec)

18.返回子字符串位置的函数:FIND_IN_SET(s1, s2)
FIND_IN_SET(s1, s2) 用于返回字符串 s1 在字符串列表 s2中的位置

mysql> select find_in_set('hi','hihi,key,hi,bas');
+-------------------------------------+
| find_in_set('hi','hihi,key,hi,bas') |
+-------------------------------------+
|                                   3 |
+-------------------------------------+
1 row in set (0.00 sec)

三、日期和时间函数

1.获取当前日期的函数:CURDATE() 、CURRENT_DATE()
CURDATE() 、CURRENT_DATE()用于获取系统当前日期

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2020-12-06 |
+------------+
1 row in set (0.00 sec)
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2020-12-06     |
+----------------+
1 row in set (0.00 sec)

2. 获取当前时间的函数:CURTIME() 、CURRENT_TIME()
CURTIME() 、CURRENT_TIME()用于获取系统当前时间

mysql> select current_time;
+--------------+
| current_time |
+--------------+
| 18:15:01     |
+--------------+
1 row in set (0.00 sec)
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 18:15:28  |
+-----------+
1 row in set (0.00 sec)

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

mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2020-12-06 18:17:53 |
+---------------------+
1 row in set (0.00 sec)
mysql> select localtime();
+---------------------+
| localtime()         |
+---------------------+
| 2020-12-06 18:18:20 |
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-12-06 18:18:41 |
+---------------------+
1 row in set (0.00 sec)
mysql> select sysdate();
+---------------------+
| sysdate()           |
+---------------------+
| 2020-12-06 18:18:53 |
+---------------------+
1 row in set (0.00 sec)

4.获取时间戳的函数:UNIX_TIMESTAMP()
UNIX_TIMESTAMP() 用于获取 UNIX 格式的时间戳

mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1607250086 |
+------------------+
1 row in set (0.00 sec)

5.转换时间戳的函数:FROM_UNIXTIME()
FROM_UNIXTIME() 用于将 UNIX 格式的时间戳转换为普通格式的时间

mysql> select from_unixtime(1607250086);
+---------------------------+
| from_unixtime(1607250086) |
+---------------------------+
| 2020-12-06 18:21:26       |
+---------------------------+
1 row in set (0.00 sec)

6.获取 UTC 日期的函数:UTC_DATE()
UTC_DATE() 用于获取当前 UTC (世界标准时间) 日期值

mysql> select utc_date();
+------------+
| utc_date() |
+------------+
| 2020-12-06 |
+------------+
1 row in set (0.00 sec)

7. 获取 UTC 时间的函数:UTC_TIME()
UTC_TIME() 用于获取当前 UTC (世界标准时间) 时间值

mysql> select utc_time();
+------------+
| utc_time() |
+------------+
| 10:24:56   |
+------------+
1 row in set (0.00 sec)

8. 获取月份的函数:MONTH(date) 、MONTHNAME(date)
MONTH(date) 用于返回 date 对应的月份

mysql> select month('2020-12-06');
+---------------------+
| month('2020-12-06') |
+---------------------+
|                  12 |
+---------------------+
1 row in set (0.00 sec)

MONTHNAME(date) 用于返回 date 对应月份的英文全名

mysql> select monthname('2020-12-06');
+-------------------------+
| monthname('2020-12-06') |
+-------------------------+
| December                |
+-------------------------+
1 row in set (0.01 sec)

9. 获取星期的函数:DAYNAME(date) 、DAYOFWEEK(date) 、WEEKDAY(date) 、WEEK(date) 、 WEEKOFYEAR(date)
(1) DAYNAME(date) 用于返回 date 对应的工作日的英文名称

mysql> select dayname('2020-12-06');
+-----------------------+
| dayname('2020-12-06') |
+-----------------------+
| Sunday                |
+-----------------------+
1 row in set (0.00 sec)

(2) DAYOFWEEK(date) 用于返回 date 对应的一周中的索引,1 表示周日,2 表示周一,… ,7 表示周六

mysql> select dayofweek('2020-12-06');
+-------------------------+
| dayofweek('2020-12-06') |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

(3) WEEKDAY(date) 用于返回日期对应的工作日索引,0 表示周一,1 表示周二,… ,6 表示周日

mysql> select weekday('2020-12-06');
+-----------------------+
| weekday('2020-12-06') |
+-----------------------+
|                     6 |
+-----------------------+
1 row in set (0.00 sec)

(4) WEEK(date) 用于计算 date 是一年中的第几周,一年有 53 周

mysql> select week('2020-12-06');
+--------------------+
| week('2020-12-06') |
+--------------------+
|                 49 |
+--------------------+
1 row in set (0.00 sec)

(5) WEEKOFYEAR(date) 用于计算日期 date 是一年中的第几周,一年有 53 周

mysql> select weekofyear('2020-12-06');
+--------------------------+
| weekofyear('2020-12-06') |
+--------------------------+
|                       49 |
+--------------------------+
1 row in set (0.00 sec)

10.获取天数的函数:DAYOFYEAR(date) 、DAYOFMONTH(date)
DAYOFYEAR(date) 用于返回 date 是一年中的第几天,一年有 365 天

mysql> select dayofyear('2020-12-06');
+-------------------------+
| dayofyear('2020-12-06') |
+-------------------------+
|                     341 |
+-------------------------+
1 row in set (0.00 sec)

DAYOFMONTH(date) 用于计算 date 是一个月中的第几天

mysql> select dayofmonth('2020-12-06');
+--------------------------+
| dayofmonth('2020-12-06') |
+--------------------------+
|                        6 |
+--------------------------+
1 row in set (0.00 sec)

11. 获取年份的函数:YEAR(date)
YEAR(date) 返回 date 对应的年份

mysql> select year(now());
+-------------+
| year(now()) |
+-------------+
|        2020 |
+-------------+
1 row in set (0.01 sec

12. 获取季度的函数:QUARTER(date)
QUARTER(date) 返回 date 对应的一年中的季度值

mysql> select quarter(now());
+----------------+
| quarter(now()) |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)

13.获取分钟的函数:MINUTE(time)
MINUTE(time) 返回 time 对应的分钟值

mysql> select minute('2020-12-18 10:19:03');
+-------------------------------+
| minute('2020-12-18 10:19:03') |
+-------------------------------+
|                            19 |
+-------------------------------+
1 row in set (0.00 sec)

14.获取秒钟的函数:SECOND(time)
SECOND(time) 返回 time 对应的秒数

mysql> select second('10:05:03');
+--------------------+
| second('10:05:03') |
+--------------------+
|                  3 |
+--------------------+
1 row in set (0.00 sec)

15. 获取日期的指定值的函数:EXTRACT(type FROM date)
EXTRACT(type FROM date) 用于获取指定的日期值

mysql> select extract(year from '2020-12-11') as t1, # 当type为YEAR
时,只返回年值
    -> extract(year_month from '2016-07-02 01:02:03') as t2, # 当type为YEAR_MONTH时,返回年与月
    -> extract(day_minute from '2020-07-02 01:02:03') as t3; # 当type为DAY_MINUTE时,返回日、小时、分钟
    
 +------+--------+-------+
| t1   | t2     | t3    |
+------+--------+-------+
| 2020 | 201607 | 20102 |
+------+--------+-------+
1 row in set (0.01 sec)

16. 时间和秒钟转换的函数:TIME_TO_SEC(time) 、SEC_TO_TIME(time)
TIME_TO_SEC(time) 用于将 time 转换为秒钟,公式为 " 小时3600 + 分钟60 + 秒 "

mysql> select time_to_sec('23:23:00');
+-------------------------+
| time_to_sec('23:23:00') |
+-------------------------+
|                   84180 |
+-------------------------+
1 row in set (0.01 sec)

SEC_TO_TIME(time) 用于将秒值转换为时间格式

mysql> select sec_to_time(' 83088');
+-----------------------+
| sec_to_time(' 83088') |
+-----------------------+
| 23:04:48.000000       |
+-----------------------+
1 row in set (0.00 sec)

17. 计算日期和时间的函数:DATE_ADD() 、ADDDATE() 、DATE_SUB() 、SUBDATE() 、ADDTIME() 、SUBTIME() 、DATE_DIFF()
(1) DATE_ADD() 用于对日期进行加运算,格式为DATE_ADD(date, INTERVAL expr type),expr 与 type 的关系

mysql> select date_add('2020-12-08 23:59:59',interval 1 second);# 对指定的日期增加1秒
+---------------------------------------------------+
| date_add('2020-12-08 23:59:59',interval 1 second) |
+---------------------------------------------------+
| 2020-12-09 00:00:00                               |
+---------------------------------------------------+
1 row in set (0.01 sec)

mysql> select date_add('2020-12-08 23:59:59', interval '1:1' minute_second); #对指定的日期增加1分1秒
+---------------------------------------------------------------+
| date_add('2020-12-08 23:59:59', interval '1:1' minute_second) |
+---------------------------------------------------------------+
| 2020-12-09 00:01:00                                           |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

(2) DATE_SUB() 用于对日期进行减运算,格式为 DATE_SUB(date, INTERVAL expr type) ,expr 与 type 的关系

mysql> select date_sub('2020-01-02', interval 31 day); # 给指定的日期减去31天
+-----------------------------------------+
| date_sub('2020-01-02', interval 31 day) |
+-----------------------------------------+
| 2019-12-02                              |
+-----------------------------------------+
1 row in set (0.00 sec)

(3) SUBDATE() 用于对日期进行减运算,格式为 SUBDATE(date, INTERVAL expr type) ,expr 与 type 的关系

mysql> select subdate('2020-01-02', interval 31 day);
+----------------------------------------+
| subdate('2020-01-02', interval 31 day) |
+----------------------------------------+
| 2019-12-02                             |
+----------------------------------------+
1 row in set (0.00 sec)

(4) ADDTIME() 用于对日期进行加运算,格式为 ADDTIME(date, expr)

mysql> select addtime('2020-12-31 23:59:59', '1:1:1'); # 给指定的日期增加1时1分1
+-----------------------------------------+
| addtime('2020-12-31 23:59:59', '1:1:1') |
+-----------------------------------------+
| 2021-01-01 01:01:00                     |
+-----------------------------------------+
1 row in set (0.00 sec)

(5) SUBTIME() 用于对日期进行减运算,格式为 SUBTIME(date, expr)

mysql> select subtime('2000-12-31 23:59:59','1:1:1');
+----------------------------------------+
| subtime('2000-12-31 23:59:59','1:1:1') |
+----------------------------------------+
| 2000-12-31 22:58:58                    |
+----------------------------------------+
1 row in set (0.00 sec)

(6) DATEDIFF() 用于计算两个日期之间的间隔天数

mysql> select datediff('2017-12-31','2010-12-31');
+-------------------------------------+
| datediff('2017-12-31','2010-12-31') |
+-------------------------------------+
|                                2557 |
+-------------------------------------+
1 row in set (0.00 sec)

18.将日期和时间格式化的函数:DATE_FORMAT(date, format) 、TIME_FORMAT(time, format) 、GET_FORMAT(val_type, format_type)
(1) DATE_FORMAT(date, format) 用于格式化日期,即根据 format 指定的格式显示 date 值,format 格式

mysql> select date_format('1997-10-04 22:23:00','%W %M %Y');
+-----------------------------------------------+
| date_format('1997-10-04 22:23:00','%W %M %Y') |
+-----------------------------------------------+
| Saturday October 1997                         |
+-----------------------------------------------+
1 row in set (0.00 sec)

(2) TIME_FORMAT(time, format) 用于格式化时间,即根据 format 指定的格式显示 time 值,format 格式

mysql> select time_format('16:00:00', '%H %k %I');
+-------------------------------------+
| time_format('16:00:00', '%H %k %I') |
+-------------------------------------+
| 16 16 04                            |
+-------------------------------------+
1 row in set (0.00 sec)

(3) GET_FORMAT() ,我们指定值类型和格式化类型,然后会显示成格式字符串

mysql> select date_format('2000-10-05 22:23:00', get_format(date,'usa'));
+------------------------------------------------------------+
| date_format('2000-10-05 22:23:00', get_format(date,'usa')) |
+------------------------------------------------------------+
| 10.05.2000                                                 |
+------------------------------------------------------------+
1 row in set (0.00 sec)
  • %d该月日期,数字形式(00…31)
  • %e该月日期,数字形式(0…31)
  • %f微秒(000000…999999)
  • %H以2位数表示24小时(00…23)
  • %h,%I 以2位数表示12小时(01…12)
  • %i分钟,数字形式(00-59)
  • %j一年中的天数(001-366)
  • %k以24小时(0-23)
  • %l以12小时(0…12)
  • %M月份名称(january…December)
  • %m月份数字形式(00…12)
  • %p上午(AM)或下午(PM)
  • %r时间,12小时制(小时hh:分钟mm:秒钟ss后面加AM或PM)
  • %S,%s以2位数形式表示秒(00…59)
  • %T时间,24小时制(小时hh:分钟mm:秒数ss)
  • %U周(00…53),其中周日为每周的第一天
  • %u周(00…53),其中周一为每周的第一天
  • %V周(01…53),其中周日为每周的第一 天,和%X一起使用
  • %v周(01…53),其中周一为每周的第一天,和%x一起使用
  • %W工作日名称(周日…周六)
  • %w一周中的每日(0=周日…6=周六)
  • %X该周的年份,其中周日为每周的第一天;数字形式4位数,和%V同时 使用
  • %x该周的年份,其中周一为每周的第一天;数字形式4位数,和%v同时使用
  • %Y4位数形式表示年份
  • %y2 位数形式表示年份 %% “%”文字字符

四、条件判断函数

1. IF()
IF(expr, v1, v2) 如果表达式 expr 为 TRUE ,则返回值为 v1 ,否则返回 v2

mysql> select if(1>2,2,3);
+-------------+
| if(1>2,2,3) |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)

2. IFNULL()
IFNULL(v1, v2) ,如果 v1 不为 NULL ,则返回值为 v1 ;如果 v1 为 NULL ,则返回值为 v2

mysql> select ifnull(1,2),ifnull(null,10);
+-------------+-----------------+
| ifnull(1,2) | ifnull(null,10) |
+-------------+-----------------+
|           1 |              10 |
+-------------+-----------------+
1 row in set (0.00 sec)

3.CASE
语法:CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END 含义:如果 expr 等于某个 vn,则返回对应位置 THEN 后面的结果,如果与所有值都不相等,则返回 ELSE 后面的 rn

mysql> select case 2 when 1 then 'one'  #如果是1则输出one
    -> when 2 then 'two'   #如果是2则输出two
    -> else 'nono'  #如果都不是则输出nono
    -> end;
+-------------------------------------------------------------+
| case 2 when 1 then 'one' 
when 2 then 'two'
else 'nono'
end |
+-------------------------------------------------------------+
| two                                                         |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

五、系统信息函数

1.获取 MySQL 版本号的函数:VERSION()
VERSION() 用于获取 MySQL 版本号

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.32    |
+-----------+
1 row in set (0.00 sec)

2.查看当前用户的连接数的ID函数:CONNECTION_ID()
CONNECTION_ID() 用于查看当前用户的连接数

mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|               2 |
+-----------------+
1 row in set (0.00 sec)
mysql> show processlist;
+----+------+-----------+--------+---------+------+----------+------------------+
| Id | User | Host      | db     | Command | Time | State    | Info             |
+----+------+-----------+--------+---------+------+----------+------------------+
|  2 | root | localhost | mytest | Query   |    0 | starting | show processlist |
+----+------+-----------+--------+---------+------+----------+------------------+
1 row in set (0.00 sec)

解释:

  1. Id :用户登录 MySQL 时,系统分配的连接 id
  2. User :当前连接的用户
  3. Host :显示这个语句是从哪个 IP 的哪个端口上发出的,可以用来追踪出现问题语句的用户
  4. db :显示这个进程目前连接的是哪个数据库
  5. Command :显示当前连接执行的命令,一般取值为休眠(Sleep)、查询(Query)、连接(Connect)
  6. Time :显示这个状态持续的时间,单位是秒
  7. State :显示使用当前连接的 SQL 语句的状态
  8. Info :显示这个 SQL 语句

3.查看当前使用的数据库的函数:DATABASE() 、SCHEMA()
DATABASE() 用于查看当前使用的数据库

mysql> select database();
+------------+
| database() |
+------------+
| mytest     |
+------------+
1 row in set (0.00 sec)

mysql> select schema();
+----------+
| schema() |
+----------+
| mytest   |
+----------+
1 row in set (0.00 sec)

4.查看当前登录的用户名的函数:USER() 、CURRENT_USER() 、SYSTEM_USER()
USER() 返回当前登录的用户及主机名

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> select system_user();
+----------------+
| system_user()  |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

5. 查看指定字符串的字符集的函数:CHARSET(str)
CHARSET(str) 用于查看字符串 str 的字符集


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

6. 查看指定字符串的排列方式的函数(校验):COLLATION(str)
COLLATION(str) 用于查看字符串 str 的字符排列方式

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

7. 获取最后一个自动生成的 ID 值得函数:LAST_INSERT_ID()
LAST_INSERT_ID() 用于获取最后一个自动生成的ID 值

mysql> create table work
    -> (
    -> id int primary key auto_increment, # 先创建一个表,其id字段带有AUTO_INCREMENT约束
    -> name varchar(30)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into work values(null,'t1'); # 插入一条数据,这时id没有指定,则自动生成,id为1
Query OK, 1 row affected (0.00 sec)

mysql> insert into work values(null,'t2'); # 插入一条数据,这时id没有指定,则自动生成,id为2
Query OK, 1 row affected (0.00 sec)

mysql> select * from work;
+----+------+
| id | name |
+----+------+
|  1 | t1   |
|  2 | t2   |
+----+------+
2 rows in set (0.00 sec)

mysql> select last_insert_id(); # 查看最后一个自动生成的id值
+------------------+
| last_insert_id() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

mysql> insert into work values(null,'t3'),(null,'t4'),(null,'t5'); 
# 如果我们一次性插入多条数据,虽然id到了5
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
# 但我们用LAST_INSERT_ID()查看时却为3
# 这是因为LAST_INSERT_ID()只返回插入的第一行数据时产生值
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

mysql> insert into work values(null,'t6'); 插入一条新的就恢复了

Query OK, 1 row affected (0.01 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                6 |
+------------------+
1 row in set (0.00 sec)

六、加/解密函数

1. 加密函数:PASSWORD(str) 、MD5(str) 、ENCODE(str, pswd_str)
(1) PASSWORD(str) 从明文密码 str 计算并返回加密后的密码字符串,当参数为 NULL 时,返回 NULL

mysql> select password('pwd');
+-------------------------------------------+
| password('pwd')                           |
+-------------------------------------------+
| *975B2CD4FF9AE554FE8AD33168FBFC326D2021DD |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

(2) MD5(str) 为字符串 str 算出一个 MD5 128 比特校验和

mysql> select md5('pwd');
+----------------------------------+
| md5('pwd')                       |
+----------------------------------+
| 9003d1df22eb4d3820015070385194c8 |
+----------------------------------+
1 row in set (0.00 sec)

(3) ENCODE(str, pswd_str) 使用 pswd_str 作为密码,加密 str

mysql> select encode('server','pwd');
+------------------------+
| encode('server','pwd') |
+------------------------+
| 1ȅđ                    |
+------------------------+
1 row in set, 1 warning (0.00 sec)

2. 解密函数:DECODE(crypt_str, pswd_str)
DECODE(crypt_str, pswd_str) 使用 pswd_str 作为密码,解密加密字符串 crypt_str

mysql> select decode(encode('server','pwd'),'pwd');
+--------------------------------------+
| decode(encode('server','pwd'),'pwd') |
+--------------------------------------+
| server                               |
+--------------------------------------+
1 row in set, 2 warnings (0.00 sec)

七、其他函数

1.格式化函数:FORMAT(x, n)
FORMAT(x, n) 将数字 x 格式化,并以四舍五入的方式保留小数点后 n 位,结果以字符串的形式返回

mysql> select format(1.23456,4),format(1.2,4),format(1.234,0);
+-------------------+---------------+-----------------+
| format(1.23456,4) | format(1.2,4) | format(1.234,0) |
+-------------------+---------------+-----------------+
| 1.2346            | 1.2000        | 1               |
+-------------------+---------------+-----------------+
1 row in set (0.00 sec)

2. 不同进制的数字进行转换的函数:CONV()
CONV() 用于不同进制数之间的转换

mysql> select conv('a',16,2), # 将16进制的a转换为2进制
    -> conv(15,10,2),  # 将10进制的15转换为2进制
    -> conv(15,10,8),   # 将10进制的15转换为8进制
    -> conv(15,10,16);   # 将10进制的15转换为16进制
+----------------+---------------+---------------+----------------+
| conv('a',16,2) | conv(15,10,2) | conv(15,10,8) | conv(15,10,16) |
+----------------+---------------+---------------+----------------+
| 1010           | 1111          | 17            | F              |
+----------------+---------------+---------------+----------------+
1 row in set (0.00 sec)

3. IP 地址与数字互相转换的函数:INET_ATON(expr) 、INET_NTOA(expr)
INET_ATON(expr) 用于将网络地址转换为一个代表该地址数值的整数

mysql> select inet_aton('192.168.1.0');
+--------------------------+
| inet_aton('192.168.1.0') |
+--------------------------+
|               3232235776 |
+--------------------------+
1 row in set (0.00 sec)

4. 加锁函数和解锁函数:GET_LOCK(str, timeout) 、RELEASE_LOCAK(str) 、IS_FREE_LOCK(str) 、 IS_USED_LOCK(str)
(1) GET_LOCK(str, timeout) 使用字符串 str 来得到一个锁,持续时间 timeout 秒

  1. 若成功得到锁,则返回 1
  2. 若操作超时,则返回 0
  3. 若发生错误,则返回 NULL
mysql> select get_lock('lock1',10);
+----------------------+
| get_lock('lock1',10) | # 返回结果为1,说明成功得到了一个名称为'lock1'的锁,持续时间为
10秒
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

(2) RELEASE_LOCK(str) 用于解开被 GET_LOCK() 获取的,用字符串 str 所命名的锁

  1. 若锁被解开,则返回 1
  2. 若该线程尚未创建锁,则返回 0
  3. 若命名的锁不存在,则返回 NULL
  4. 若该锁从未被 GET_LOCK() 的调用获取,或锁已经被提前解开,则该锁不存在
mysql> select release_lock('lock1');
+-----------------------+
| release_lock('lock1') |
+-----------------------+
|                     1 | # 返回值为1说明解锁成功
+-----------------------+
1 row in set (0.00 sec)

(3) IS_FREE_LOCK(str) 检查名为 str 的锁是否可以使用

  1. 若锁可以使用,则返回 1
  2. 若锁正在被使用,则返回 0
  3. 若出现错误,则返回 NULL
mysql> select is_free_lock('lock1');
+-----------------------+
| is_free_lock('lock1') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

(4) IS_USED_LOCK(str) 用于检查名为 str 的锁是否正在被使用,若被封锁,则返回使用该锁的客户端的连接标识符,否则返回 NULL

mysql> select is_used_lock('lock1');
+-----------------------+
| is_used_lock('lock1') |
+-----------------------+
|                  10   | # 返回结果为当前连接ID,表示名称为'lock1'的锁正在被使用
+-----------------------+

5. 重复执行指定操作的函数:BENCHMARK(count, expr)
BENCHMARK(count, expr) 用于重复 count 次执行表达式 expr

  1. 可以用于计算 MySQL 处理表达式的速度
  2. 可以在 MySQL 客户端内部报告语句执行的时间
mysql> select password('pwd');
+-------------------------------------------+
| password('pwd')                           |
+-------------------------------------------+
| *975B2CD4FF9AE554FE8AD33168FBFC326D2021DD |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)  # 执行1次加密操作花费了0.00秒
 
mysql> select benchmark(500000, password('pwd'));
+------------------------------------+
| benchmark(500000, password('pwd')) |
+------------------------------------+
|                                  0 |
+------------------------------------+
1 row in set, 1 warning (0.07 sec)

6. 改变字符集的函数:CONVERT(... USING ...)
CONVERT(… USING …) 用于改变字符串的默认字符集

mysql> select charset(convert('abc' using latin1));
+--------------------------------------+
| charset(convert('abc' using latin1)) |
+--------------------------------------+
| latin1                               |
+--------------------------------------+
1 row in set (0.00 sec)

7.改变数据类型的函数:CAST(x, AS type) 、CONVERT(x, type)
(1) CAST(x, AS type) 用于将一个数据类型的值转换为另一个数据类型的值 CONVERT(x, type) 用于将一个数据类型的值转换为另一个数据类型的值

mysql> select cast(100 as char(2));
+----------------------+
| cast(100 as char(2)) |
+----------------------+
| 10                   | # 将整数类型100转换为带有两个显示宽度的字符串类型,结果为'10'
+----------------------+
1 row in set, 1 warning (0.00 sec)

(2) CONVERT(x, type) 用于将一个数据类型的值转换为另一个数据类型的值

mysql> select convert(100,char(2));
+----------------------+
| convert(100,char(2)) |
+----------------------+
| 10                   | # 将整数类型的100转换为带有两个显示宽度的字符串类型,结果为'10'
+----------------------+
1 row in set, 1 warning (0.00 sec)

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/110704628