数据库内置函数学习
MySQL内置函数
MySQL 字符串函数
- ASCII(s):返回字符串 s 的第一个字符的 ASCII 码。
MariaDB [test3]> select ASCII(title) from test5;
+--------------+
| ASCII(title) |
+--------------+
| 98 |
| 87 |
| 67 |
| 83 |
+--------------+
4 rows in set (0.00 sec)
MariaDB [test3]> select title from test5;
+-------------+
| title |
+-------------+
| binary star |
| WISH |
| CRY |
| Seven |
+-------------+
4 rows in set (0.00 sec)
- CHAR_LENGTH(s):返回字符串 s 的字符数
MariaDB [test3]> select CHAR_LENGTH("author");
+-----------------------+
| CHAR_LENGTH("author") |
+-----------------------+
| 6 |
+-----------------------+
1 row in set (0.00 sec)
- CHARACTER_LENGTH(s)
返回字符串 s 的字符数,等同于 CHAR_LENGTH(s)
MariaDB [test3]> select CHARACTER_LENGTH("author");
+----------------------------+
| CHARACTER_LENGTH("author") |
+----------------------------+
| 6 |
+----------------------------+
1 row in set (0.00 sec)
- CONCAT(s1,s2...sn)
字符串 s1,s2 等多个字符串合并为一个字符串
MariaDB [test3]> SELECT CONCAT("ID","AUTHOR","TITLE");
+-------------------------------+
| CONCAT("ID","AUTHOR","TITLE") |
+-------------------------------+
| IDAUTHORTITLE |
+-------------------------------+
1 row in set (0.00 sec)
- CONCAT_WS(x, s1,s2...sn)
同 CONCAT(s1,s2,...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
MariaDB [test3]> select concat_ws("-","SQL","Tutorial","is","fun!")AS ConcatenatedString;
+----------------------+
| ConcatenatedString |
+----------------------+
| SQL-Tutorial-is-fun! |
+----------------------+
1 row in set (0.00 sec)
- FIELD(s,s1,s2...)
返回第一个字符串 s 在字符串列表(s1,s2...)中的位置
MariaDB [test3]> SELECT FIELD("ID","TITLE");
+---------------------+
| FIELD("ID","TITLE") |
+---------------------+
| 0 |
+---------------------+
1 row in set (0.00 sec)
- FIND_IN_SET(s1,s2)
返回在字符串s2中与s1匹配的字符串的位置
MariaDB [test3]> SELECT FIND_IN_SET("C","A,B,C,D,E");
+------------------------------+
| FIND_IN_SET("C","A,B,C,D,E") |
+------------------------------+
| 3 |
+------------------------------+
1 row in set (0.01 sec)
- FORMAT(x,n)
函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。
MariaDB [test3]> SELECT FORMAT(250500.5634,2);
+-----------------------+
| FORMAT(250500.5634,2) |
+-----------------------+
| 250,500.56 |
+-----------------------+
1 row in set (0.00 sec)
- INSERT(s1,x,len,s2)
字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
MariaDB [test3]> SELECT INSERT("google.com",1,6,"runoob");
+-----------------------------------+
| INSERT("google.com",1,6,"runoob") |
+-----------------------------------+
| runoob.com |
+-----------------------------------+
1 row in set (0.00 sec)
- LOCATE(s1,s)
从字符串 s 中获取 s1 的开始位置
MariaDB [test3]> select locate('st','myteststring');
+-----------------------------+
| locate('st','myteststring') |
+-----------------------------+
| 5 |
+-----------------------------+
1 row in set (0.00 sec)
- LCASE(s)
将字符串 s 的所有字母变成小写字母
MariaDB [test3]> SELECT LCASE('RUNOOB');
+-----------------+
| LCASE('RUNOOB') |
+-----------------+
| runoob |
+-----------------+
1 row in set (0.00 sec)
- LEFT(s,n)
返回字符串 s 的前 n 个字符
MariaDB [(none)]> select LEFT('runoob',2);
+------------------+
| LEFT('runoob',2) |
+------------------+
| ru |
+------------------+
1 row in set (0.00 sec)
- LOWER(s)
将字符串 s 的所有字母变成小写字母
MariaDB [test5]> select lower('RUNOOB');
+-----------------+
| lower('RUNOOB') |
+-----------------+
| runoob |
+-----------------+
1 row in set (0.00 sec)
- LPAD(s1,len,s2)
在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
MariaDB [test5]> select lpad('abc',5,'xx')
-> ;
+--------------------+
| lpad('abc',5,'xx') |
+--------------------+
| xxabc |
+--------------------+
1 row in set (0.00 sec)
- LTRIM(s)
去掉字符串 s 开始处的空格
MariaDB [test5]> select LTRIM(" RUNOOB")AS leftTrimmedString;
+-------------------+
| leftTrimmedString |
+-------------------+
| RUNOOB |
+-------------------+
1 row in set (0.00 sec)
- MID(s,n,len)
从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)
MariaDB [test5]> select MID("RUNOOB",2,3)AS ExtracString;
+--------------+
| ExtracString |
+--------------+
| UNO |
+--------------+
1 row in set (0.00 sec)
- POSITION(s1 IN s)
从字符串 s 中获取 s1 的开始位置
MariaDB [test5]> SELECT POSITION('b' in 'abc');
+------------------------+
| POSITION('b' in 'abc') |
+------------------------+
| 2 |
+------------------------+
1 row in set (0.00 sec)
- REPEAT(s,n)
将字符串 s 重复 n 次
MariaDB [test5]> select REPEAT('runoob',3);
+--------------------+
| REPEAT('runoob',3) |
+--------------------+
| runoobrunoobrunoob |
+--------------------+
1 row in set (0.00 sec)
- REPLACE(s,s1,s2)
将字符串 s2 替代字符串 s 中的字符串 s1
MariaDB [test5]> select REPLACE('abc','a','x');
+------------------------+
| REPLACE('abc','a','x') |
+------------------------+
| xbc |
+------------------------+
1 row in set (0.00 sec)
- REVERSE(s)
将字符串s的顺序反过来
MariaDB [test5]> select REVERSE('abc');
+----------------+
| REVERSE('abc') |
+----------------+
| cba |
+----------------+
1 row in set (0.00 sec)
- RIGHT(s,n)
返回字符串 s 的后 n 个字符
MariaDB [test5]> select RIGHT('runoob',2);
+-------------------+
| RIGHT('runoob',2) |
+-------------------+
| ob |
+-------------------+
1 row in set (0.00 sec)
- RPAD(s1,len,s2)
在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
MariaDB [test5]> select RPAD('abc',5,'xx');
+--------------------+
| RPAD('abc',5,'xx') |
+--------------------+
| abcxx |
+--------------------+
1 row in set (0.00 sec)
- RTRIM(s)
去掉字符串 s 结尾处的空格
MariaDB [test5]> select RTRIM("RUNOOB ")AS RightTrimmedString;
+--------------------+
| RightTrimmedString |
+--------------------+
| RUNOOB |
+--------------------+
1 row in set (0.00 sec)
- SPACE(n)
返回 n 个空格
MariaDB [test5]> select SPACE(10);
+------------+
| SPACE(10) |
+------------+
| |
+------------+
1 row in set (0.00 sec)
- STRCMP(s1,s2)
比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
MariaDB [test5]> select STRCMP("runoob","runoob");
+---------------------------+
| STRCMP("runoob","runoob") |
+---------------------------+
| 0 |
+---------------------------+
1 row in set (0.00 sec)
MariaDB [test5]> select STRCMP("Runooc","runoob");
+---------------------------+
| STRCMP("Runooc","runoob") |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
MariaDB [test5]> select STRCMP("runnoob","runoac");
+----------------------------+
| STRCMP("runnoob","runoac") |
+----------------------------+
| -1 |
+----------------------------+
1 row in set (0.00 sec)
- SUBSTR(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
MariaDB [test5]> select SUBSTR('RUNOOB',2,3)AS ExtractString;
+---------------+
| ExtractString |
+---------------+
| UNO |
+---------------+
1 row in set (0.00 sec)
- SUBSTRING(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串,等同于 SUBSTR(s, start, length)
MariaDB [test5]> select SUBSTRING('RUNOOB',2,3)AS ExtracString;
+--------------+
| ExtracString |
+--------------+
| UNO |
+--------------+
1 row in set (0.00 sec)
- SUBSTRING_INDEX(s, delimiter, number)
返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
MariaDB [test5]> select SUBSTRING_INDEX('a*b','*',1);
+------------------------------+
| SUBSTRING_INDEX('a*b','*',1) |
+------------------------------+
| a |
+------------------------------+
1 row in set (0.00 sec)
MariaDB [test5]> select SUBSTRING_INDEX('a*b','*',-1);
+-------------------------------+
| SUBSTRING_INDEX('a*b','*',-1) |
+-------------------------------+
| b |
+-------------------------------+
1 row in set (0.00 sec)
MariaDB [test5]> select SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1);
+------------------------------------------------------------+
| SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1) |
+------------------------------------------------------------+
| c |
+------------------------------------------------------------+
1 row in set (0.00 sec)
- TRIM(s)
去掉字符串 s 开始和结尾处的空格
MariaDB [test5]> select TRIM(' RUNOOB ')AS TrimmedString;
+---------------+
| TrimmedString |
+---------------+
| RUNOOB |
+---------------+
1 row in set (0.00 sec)
- UCASE(s)
将字符串转换为大写
MariaDB [test5]> select UCASE('runoob');
+-----------------+
| UCASE('runoob') |
+-----------------+
| RUNOOB |
+-----------------+
1 row in set (0.00 sec)
- UPPER(s)
将字符串转换为大写
MariaDB [test5]> select UPPER("runoob");
+-----------------+
| UPPER("runoob") |
+-----------------+
| RUNOOB |
+-----------------+
1 row in set (0.00 sec)
MySQL 数字函数
- ABS(x)
返回 x 的绝对值
MariaDB [test5]> select ABS(-1);
+---------+
| ABS(-1) |
+---------+
| 1 |
+---------+
1 row in set (0.01 sec)
- ACOS(x)
求 x 的反余弦值(单位为弧度),x 为一个数值
MariaDB [test5]> SELECT ACOS(0.25);
+-------------------+
| ACOS(0.25) |
+-------------------+
| 1.318116071652818 |
+-------------------+
1 row in set (0.00 sec)
- ASIN(x)
求反正弦值(单位为弧度),x 为一个数值
MariaDB [test5]> SELECT ASIN(0.25);
+---------------------+
| ASIN(0.25) |
+---------------------+
| 0.25268025514207865 |
+---------------------+
1 row in set (0.00 sec)
- ATAN(x)
求反正切值(单位为弧度),x 为一个数值
MariaDB [test5]> SELECT ATAN(2.5);
+--------------------+
| ATAN(2.5) |
+--------------------+
| 1.1902899496825317 |
+--------------------+
1 row in set (0.00 sec)
- ATAN2(n, m)
求反正切值(单位为弧度)
MariaDB [test5]> SELECT ATAN2(-0.8,2);
+---------------------+
| ATAN2(-0.8,2) |
+---------------------+
| -0.3805063771123649 |
+---------------------+
1 row in set (0.00 sec)
- AVG(expression)
返回一个表达式的平均值,expression 是一个字段
MariaDB [test3]> select AVG(Title) AS AveragePrice FROM test5;
+--------------+
| AveragePrice |
+--------------+
| 0 |
+--------------+
1 row in set, 3 warnings (0.00 sec)
- CEIL(x)
返回大于或等于 x 的最小整数
MariaDB [test3]> select CEIL(1.5);
+-----------+
| CEIL(1.5) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
- CEILING(x)
返回大于或等于 x 的最小整数
MariaDB [test3]> SELECT CEILING(1.5);
+--------------+
| CEILING(1.5) |
+--------------+
| 2 |
+--------------+
1 row in set (0.00 sec)
- COS(x)
求余弦值(参数是弧度)
MariaDB [test3]> SELECT COS(2);
+---------------------+
| COS(2) |
+---------------------+
| -0.4161468365471424 |
+---------------------+
1 row in set (0.00 sec)
- COT(x)
求余切值(参数是弧度)
MariaDB [test3]> SELECT COT(6);
+--------------------+
| COT(6) |
+--------------------+
| -3.436353004180128 |
+--------------------+
1 row in set (0.00 sec)
- COUNT(expression)
返回查询的记录总数,expression 参数是一个字段或者 * 号
MariaDB [test3]> SELECT COUNT(ID) AS NumberOfProducts FROM test5;
+------------------+
| NumberOfProducts |
+------------------+
| 4 |
+------------------+
1 row in set (0.00 sec)
- DEGREES(x)
将弧度转换为角度
MariaDB [test3]> select DEGREES(3.1415926535898);
+--------------------------+
| DEGREES(3.1415926535898) |
+--------------------------+
| 180.0000000000004 |
+--------------------------+
1 row in set (0.00 sec)
- n DIV m
整除,n 为被除数,m 为除数
MariaDB [test3]> SELECT 10 DIV 5;
+----------+
| 10 DIV 5 |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
- EXP(x)
返回 e 的 x 次方
MariaDB [test3]> SELECT EXP(3)
-> ;
+--------------------+
| EXP(3) |
+--------------------+
| 20.085536923187668 |
+--------------------+
1 row in set (0.00 sec)
- FLOOR(x)
返回小于或等于 x 的最大整数
MariaDB [test3]> SELECT FLOOR(1.5);
+------------+
| FLOOR(1.5) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
- GREATEST(expr1, expr2, expr3, ...)
返回列表中的最大值
MariaDB [test3]> SELECT GREATEST(3,12,34,8,25);
+------------------------+
| GREATEST(3,12,34,8,25) |
+------------------------+
| 34 |
+------------------------+
1 row in set (0.00 sec)
MariaDB [test3]> SELECT GREATEST('Google','Runoob','Apple');
+-------------------------------------+
| GREATEST('Google','Runoob','Apple') |
+-------------------------------------+
| Runoob |
+-------------------------------------+
1 row in set (0.00 sec)
- LEAST(expr1, expr2, expr3, ...)
返回列表中的最小值
MariaDB [test3]> select least(3,12,24,5,35);
+---------------------+
| least(3,12,24,5,35) |
+---------------------+
| 3 |
+---------------------+
1 row in set (0.00 sec)
MariaDB [test3]> select least('google','runnoob','apple');
+-----------------------------------+
| least('google','runnoob','apple') |
+-----------------------------------+
| apple |
+-----------------------------------+
1 row in set (0.00 sec)
- LN
返回数字的自然对数,以 e 为底。
MariaDB [test3]> select ln(2);
+--------------------+
| ln(2) |
+--------------------+
| 0.6931471805599453 |
+--------------------+
1 row in set (0.00 sec)
- LOG(x) 或 LOG(base, x)
返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。
MariaDB [test3]> select log(20.085536923188);
+----------------------+
| log(20.085536923188) |
+----------------------+
| 3.0000000000000164 |
+----------------------+
1 row in set (0.00 sec)
MariaDB [test3]> select LOG(2,4);
+----------+
| LOG(2,4) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
- LOG10(x)
返回以 10 为底的对数
MariaDB [test3]> select LOG10(100);
+------------+
| LOG10(100) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
- LOG2(x)
返回以 2 为底的对数
MariaDB [test3]> select LOG2(6);
+-------------------+
| LOG2(6) |
+-------------------+
| 2.584962500721156 |
+-------------------+
1 row in set (0.00 sec)
- MAX(expression)
返回字段 expression 中的最大值
MariaDB [test3]> SELECT MAX(AUTHOR) AS LargestAuthor FROM test5;
+---------------+
| LargestAuthor |
+---------------+
| wish |
+---------------+
1 row in set (0.00 sec)
- MIN(expression)
返回字段 expression 中的最小值
MariaDB [test3]> select MIN(author) AS Minauthor From test5;
+-----------+
| Minauthor |
+-----------+
| Aimer |
+-----------+
1 row in set (0.00 sec)
- MOD(x,y)
返回 x 除以 y 以后的余数
MariaDB [test3]> select MOD(5,2);
+----------+
| MOD(5,2) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
- PI()
返回圆周率(3.141593)
MariaDB [test3]> SELECT PI()
-> ;
+----------+
| PI() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
- POW(x,y)
返回 x 的 y 次方
MariaDB [test3]> SELECT POW(2,3);
+----------+
| POW(2,3) |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)
- POWER(x,y)
返回 x 的 y 次方
MariaDB [test3]> SELECT POWER(2,3);
+------------+
| POWER(2,3) |
+------------+
| 8 |
+------------+
1 row in set (0.00 sec)
- RADIANS(x)
将角度转换为弧度
MariaDB [test3]> SELECT RADIANS(180);
+-------------------+
| RADIANS(180) |
+-------------------+
| 3.141592653589793 |
+-------------------+
1 row in set (0.00 sec)
- RAND()
返回 0 到 1 的随机数
MariaDB [test5]> select RAND();
+---------------------+
| RAND() |
+---------------------+
| 0.32665407594913065 |
+---------------------+
1 row in set (0.00 sec)
- ROUND(x)
返回离 x 最近的整数
MariaDB [test5]> SELECT ROUND(1.22);
+-------------+
| ROUND(1.22) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
- SIGN(x)
返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1
MariaDB [test5]> SELECT SIGN(-10);
+-----------+
| SIGN(-10) |
+-----------+
| -1 |
+-----------+
1 row in set (0.00 sec)
MariaDB [test5]> SELECT SIGN(10);
+----------+
| SIGN(10) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
- SIN(x)
求正弦值(参数是弧度)
MariaDB [test5]> SELECT SIN(RADIANS(30));
+---------------------+
| SIN(RADIANS(30)) |
+---------------------+
| 0.49999999999999994 |
+---------------------+
1 row in set (0.00 sec)
- SQRT(x)
返回x的平方根
MariaDB [test5]> SELECT SQRT(25);
+----------+
| SQRT(25) |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)
- SUM(expression)
返回指定字段的总和
MariaDB [test3]> select SUM(id) as Totalauthor FROM test5;
+-------------+
| Totalauthor |
+-------------+
| 10 |
+-------------+
1 row in set (0.00 sec)
- TAN(x)
求正切值(参数是弧度)
MariaDB [test3]> select TAN(1.75);
+-------------------+
| TAN(1.75) |
+-------------------+
| -5.52037992250933 |
+-------------------+
1 row in set (0.00 sec)
- TRUNCATE(x,y)
返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
MariaDB [test3]> SELECT TRUNCATE(1.23456,3);
+---------------------+
| TRUNCATE(1.23456,3) |
+---------------------+
| 1.234 |
+---------------------+
1 row in set (0.00 sec)
MySQL 日期函数
- ADDDATE(d,n)
计算起始日期 d 加上 n 天的日期
MariaDB [test3]> SELECT ADDDATE("2022-05-05",INTERVAL 10 DAY);
+---------------------------------------+
| ADDDATE("2022-05-05",INTERVAL 10 DAY) |
+---------------------------------------+
| 2022-05-15 |
+---------------------------------------+
1 row in set (0.00 sec)
- ADDTIME(t,n)
n 是一个时间表达式,时间 t 加上时间表达式 n
MariaDB [test3]> SELECT ADDTIME("2022-05-05 11:11:11",5);
+----------------------------------+
| ADDTIME("2022-05-05 11:11:11",5) |
+----------------------------------+
| 2022-05-05 11:11:16 |
+----------------------------------+
1 row in set (0.00 sec)
- CURDATE()
返回当前日期
MariaDB [test3]> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2022-05-05 |
+------------+
1 row in set (0.00 sec)
- CURRENT_DATE()
返回当前日期
MariaDB [test3]> SELECT CURRENT_DATE();
+----------------+
| CURRENT_DATE() |
+----------------+
| 2022-05-05 |
+----------------+
1 row in set (0.00 sec)
- CURRENT_TIME
返回当前时间
MariaDB [test3]> SELECT CURRENT_TIME();
+----------------+
| CURRENT_TIME() |
+----------------+
| 21:28:04 |
+----------------+
1 row in set (0.00 sec)
- CURRENT_TIMESTAMP()
返回当前日期和时间
MariaDB [test3]> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2022-05-05 21:28:47 |
+---------------------+
1 row in set (0.00 sec)
- CURTIME()
返回当前时间
MariaDB [test3]> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 21:29:28 |
+-----------+
1 row in set (0.00 sec)
- DATE()
从日期或日期时间表达式中提取日期值
MariaDB [test3]> SELECT DATE("2022-05-15");
+--------------------+
| DATE("2022-05-15") |
+--------------------+
| 2022-05-15 |
+--------------------+
1 row in set (0.00 sec)
- DATEDIFF(d1,d2)
计算日期 d1->d2 之间相隔的天数
MariaDB [test3]> SELECT DATEDIFF('2001-01-01','2001-02-02')
-> ;
+-------------------------------------+
| DATEDIFF('2001-01-01','2001-02-02') |
+-------------------------------------+
| -32 |
+-------------------------------------+
1 row in set (0.00 sec)
- DATE_ADD(d,INTERVAL expr type)
计算起始日期 d 加上一个时间段后的日期,type 值可以是:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
MariaDB [test3]> SELECT DATE_ADD('2022-05-05',INTERVAL 10 DAY);
+----------------------------------------+
| DATE_ADD('2022-05-05',INTERVAL 10 DAY) |
+----------------------------------------+
| 2022-05-15 |
+----------------------------------------+
1 row in set (0.00 sec)
MariaDB [test3]> SELECT DATE_ADD('2017-06-15 09:34:21',INTERVAL 15 MINUTE);
+----------------------------------------------------+
| DATE_ADD('2017-06-15 09:34:21',INTERVAL 15 MINUTE) |
+----------------------------------------------------+
| 2017-06-15 09:49:21 |
+----------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [test3]> SELECT DATE_ADD('2017-05-15 09:34:21',INTERVAL -3 HOUR);
+--------------------------------------------------+
| DATE_ADD('2017-05-15 09:34:21',INTERVAL -3 HOUR) |
+--------------------------------------------------+
| 2017-05-15 06:34:21 |
+--------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [test3]> SELECT DATE_ADD('2017-05-015 09:34:21',INTERVAL -3 MONTH);
+----------------------------------------------------+
| DATE_ADD('2017-05-015 09:34:21',INTERVAL -3 MONTH) |
+----------------------------------------------------+
| 2017-02-15 09:34:21 |
+----------------------------------------------------+
1 row in set (0.00 sec)
- DATE_FORMAT(d,f)
按表达式 f的要求显示日期 d
MariaDB [test3]> SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r');
+--------------------------------------------------+
| DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r') |
+--------------------------------------------------+
| 2011-11-11 11:11:11 AM |
+--------------------------------------------------+
1 row in set (0.00 sec)
- DATE_SUB(date,INTERVAL expr type)
函数从日期减去指定的时间间隔。
MariaDB [test3]> select * from test5;
+----+-------------+--------+-----------------+
| id | title | author | submission_date |
+----+-------------+--------+-----------------+
| 1 | binary star | ss | 2022-04-19 |
| 2 | WISH | Aimer | 2022-04-19 |
| 3 | CRY | wish | 2022-04-19 |
| 4 | Seven | Aimer | 2022-04-19 |
+----+-------------+--------+-----------------+
4 rows in set (0.00 sec)
MariaDB [test3]> SELECT id ,DATE_SUB(submission_date,INTERVAL 2 DAY) AS OrderDate from test5;
+----+------------+
| id | OrderDate |
+----+------------+
| 1 | 2022-04-17 |
| 2 | 2022-04-17 |
| 3 | 2022-04-17 |
| 4 | 2022-04-17 |
+----+------------+
4 rows in set (0.00 sec)
- DAY(d)
返回日期值 d 的日期部分
MariaDB [test3]> select DAY("2022-05-15");
+-------------------+
| DAY("2022-05-15") |
+-------------------+
| 15 |
+-------------------+
1 row in set (0.00 sec)
- DAYNAME(d)
返回日期 d 是星期几,如 Monday,Tuesday
MariaDB [test3]> SELECT DAYOFMONTH('2022-11-11 11:11:11');
+-----------------------------------+
| DAYOFMONTH('2022-11-11 11:11:11') |
+-----------------------------------+
| 11 |
+-----------------------------------+
1 row in set (0.00 sec)
- DAYOFWEEK(d)
日期 d 今天是星期几,1 星期日,2 星期一,以此类推
MariaDB [test3]> SELECT DAYOFWEEK('2022-11-11 11:11:11');
+----------------------------------+
| DAYOFWEEK('2022-11-11 11:11:11') |
+----------------------------------+
| 6 |
+----------------------------------+
1 row in set (0.00 sec)
- DAYOFYEAR(d)
计算日期 d 是本年的第几天
MariaDB [test5]> select DAYOFYEAR('2022-11-11 11:11:11');
+----------------------------------+
| DAYOFYEAR('2022-11-11 11:11:11') |
+----------------------------------+
| 315 |
+----------------------------------+
1 row in set (0.00 sec)
- EXTRACT(type FROM d)
从日期 d 中获取指定的值,type 指定返回的值。
type可取值为:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
MariaDB [test5]> SELECT EXTRACT(MINUTE FROM '2022-10-24 10:24:11');
+--------------------------------------------+
| EXTRACT(MINUTE FROM '2022-10-24 10:24:11') |
+--------------------------------------------+
| 24 |
+--------------------------------------------+
1 row in set (0.00 sec)
- FROM_DAYS(n)
计算从 0000 年 1 月 1 日开始 n 天后的日期
MariaDB [test5]> SELECT FROM_DAYS(1111)
-> ;
+-----------------+
| FROM_DAYS(1111) |
+-----------------+
| 0003-01-16 |
+-----------------+
1 row in set (0.00 sec)
- HOUR(t)
返回 t 中的小时值
MariaDB [test5]> SELECT HOUR('1:2:3');
+---------------+
| HOUR('1:2:3') |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
- LAST_DAY(d)
返回给给定日期的那一月份的最后一天
MariaDB [test5]> SELECT LAST_DAY('2022-06-22');
+------------------------+
| LAST_DAY('2022-06-22') |
+------------------------+
| 2022-06-30 |
+------------------------+
1 row in set (0.00 sec)
- LOCALTIME()
返回当前日期和时间
MariaDB [test5]> SELECT LOCALTIME();
+---------------------+
| LOCALTIME() |
+---------------------+
| 2022-05-06 09:57:02 |
+---------------------+
1 row in set (0.00 sec)
- LOCALTIMESTAMP()
返回当前日期和时间
MariaDB [test5]> SELECT LOCALTIMESTAMP();
+---------------------+
| LOCALTIMESTAMP() |
+---------------------+
| 2022-05-06 09:57:45 |
+---------------------+
1 row in set (0.00 sec)
- MAKEDATE(year, day-of-year)
基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
MariaDB [test5]> SELECT MAKEDATE(2022,3);
+------------------+
| MAKEDATE(2022,3) |
+------------------+
| 2022-01-03 |
+------------------+
1 row in set (0.00 sec)
- MICROSECOND(date)
返回日期参数所对应的微秒数
MariaDB [test5]> SELECT MICROSECOND("2022-05-20 09:34:00.000023");
+-------------------------------------------+
| MICROSECOND("2022-05-20 09:34:00.000023") |
+-------------------------------------------+
| 23 |
+-------------------------------------------+
1 row in set (0.00 sec)
- MINUTE(t)
返回 t 中的分钟值
MariaDB [test5]> SELECT MINUTE('1:2:3');
+-----------------+
| MINUTE('1:2:3') |
+-----------------+
| 2 |
+-----------------+
1 row in set (0.00 sec)
- MONTHNAME(d)
返回日期当中的月份名称,如 November
MariaDB [test5]> SELECT MONTHNAME('2022-06-16 15:11:14');
+----------------------------------+
| MONTHNAME('2022-06-16 15:11:14') |
+----------------------------------+
| June |
+----------------------------------+
1 row in set (0.00 sec)
- MONTH(d)
返回日期d中的月份值,1 到 12
MariaDB [test5]> SELECT MONTH('2022-11-11 11:11:11');
+------------------------------+
| MONTH('2022-11-11 11:11:11') |
+------------------------------+
| 11 |
+------------------------------+
1 row in set (0.00 sec)
- NOW()
返回当前日期和时间
MariaDB [test5]> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2022-05-06 10:02:40 |
+---------------------+
1 row in set (0.00 sec)
- PERIOD_ADD(period, number)
为 年-月 组合日期添加一个时段
MariaDB [test5]> SELECT PERIOD_ADD(202206,6);
+----------------------+
| PERIOD_ADD(202206,6) |
+----------------------+
| 202212 |
+----------------------+
1 row in set (0.00 sec)
- PERIOD_DIFF(period1, period2)
返回两个时段之间的月份差值
MariaDB [test5]> SELECT PERIOD_DIFF(202206,202209);
+----------------------------+
| PERIOD_DIFF(202206,202209) |
+----------------------------+
| -3 |
+----------------------------+
1 row in set (0.00 sec)
- QUARTER(d)
返回日期d是第几季节,返回 1 到 4
MariaDB [test5]> SELECT QUARTER("2022-11-11 11:11:11");
+--------------------------------+
| QUARTER("2022-11-11 11:11:11") |
+--------------------------------+
| 4 |
+--------------------------------+
1 row in set (0.00 sec)
- SECOND(t)
返回 t 中的秒钟值
MariaDB [test5]> SELECT SECOND('1:2:3');
+-----------------+
| SECOND('1:2:3') |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)
- SEC_TO_TIME(s)
将以秒为单位的时间 s 转换为时分秒的格式
MariaDB [test5]> select second(3345);
+--------------+
| second(3345) |
+--------------+
| 45 |
+--------------+
1 row in set (0.00 sec)
- STR_TO_DATE(string, format_mask)
将字符串转变为日期
MariaDB [test5]> SELECT STR_TO_DATE("August 10 2022","%M %d %Y");
+------------------------------------------+
| STR_TO_DATE("August 10 2022","%M %d %Y") |
+------------------------------------------+
| 2022-08-10 |
+------------------------------------------+
1 row in set (0.00 sec)
- SUBDATE(d,n)
日期 d 减去 n 天后的日期
MariaDB [test5]> select subdate('2022-11-11 11:11:11',1);
+----------------------------------+
| subdate('2022-11-11 11:11:11',1) |
+----------------------------------+
| 2022-11-10 11:11:11 |
+----------------------------------+
1 row in set (0.01 sec)
- SUBTIME(t,n)
时间 t 减去 n 秒的时间
MariaDB [test5]> select subtime('2022-11-11 11:11:11',5);
+----------------------------------+
| subtime('2022-11-11 11:11:11',5) |
+----------------------------------+
| 2022-11-11 11:11:06 |
+----------------------------------+
1 row in set (0.00 sec)
- SYSDATE()
返回当前日期和时间
MariaDB [test5]> select SYSDATE();
+---------------------+
| SYSDATE() |
+---------------------+
| 2022-05-06 10:11:20 |
+---------------------+
1 row in set (0.00 sec)
- TIME(expression)
提取传入表达式的时间部分
MariaDB [test5]> SELECT TIME('20:22:10');
+------------------+
| TIME('20:22:10') |
+------------------+
| 20:22:10 |
+------------------+
1 row in set (0.00 sec)
- TIME_FORMAT(t,f)
按表达式 f 的要求显示时间 t
MariaDB [test5]> SELECT TIME_FORMAT('11:11:11','%r');
+------------------------------+
| TIME_FORMAT('11:11:11','%r') |
+------------------------------+
| 11:11:11 AM |
+------------------------------+
1 row in set (0.01 sec)
- TIME_TO_SEC(t)
将时间 t 转换为秒
MariaDB [test5]> select TIME_TO_SEC('1:12:00');
+------------------------+
| TIME_TO_SEC('1:12:00') |
+------------------------+
| 4320 |
+------------------------+
1 row in set (0.00 sec)
- TIMEDIFF(time1, time2)
计算时间差值
MariaDB [test5]> SELECT TIMEDIFF('13:10:11','13:11:12');
+---------------------------------+
| TIMEDIFF('13:10:11','13:11:12') |
+---------------------------------+
| -00:01:01 |
+---------------------------------+
1 row in set (0.00 sec)
- TIMESTAMP(expression, interval)
单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和
MariaDB [test5]> SELECT TIMESTAMP('2022-06-22','13:11:11');
+------------------------------------+
| TIMESTAMP('2022-06-22','13:11:11') |
+------------------------------------+
| 2022-06-22 13:11:11 |
+------------------------------------+
1 row in set (0.00 sec)
- TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
计算时间差,返回 datetime_expr2 − datetime_expr1 的时间差
MariaDB [test5]> SELECT TIMESTAMPDIFF(DAY,'2022-06-01','2022-05-01');
+----------------------------------------------+
| TIMESTAMPDIFF(DAY,'2022-06-01','2022-05-01') |
+----------------------------------------------+
| -31 |
+----------------------------------------------+
1 row in set (0.00 sec)
- TO_DAYS(d)
计算日期 d 距离 0000 年 1 月 1 日的天数
MariaDB [test5]> SELECT TO_DAYS('0001-01-01 01;01:01');
+--------------------------------+
| TO_DAYS('0001-01-01 01;01:01') |
+--------------------------------+
| 366 |
+--------------------------------+
1 row in set (0.00 sec)
- WEEK(d)
计算日期 d 是本年的第几个星期,范围是 0 到 53
MariaDB [test5]> SELECT WEEK('2022-11-11 11:11:11');
+-----------------------------+
| WEEK('2022-11-11 11:11:11') |
+-----------------------------+
| 45 |
+-----------------------------+
1 row in set (0.00 sec)
- WEEKDAY(d)
日期 d 是星期几,0 表示星期一,1 表示星期二
MariaDB [test5]> SELECT WEEKDAY('2022-06-15');
+-----------------------+
| WEEKDAY('2022-06-15') |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.00 sec)
- WEEKOFYEAR(d)
计算日期 d 是本年的第几个星期,范围是 0 到 53
MariaDB [test5]> SELECT WEEKOFYEAR('2022-11-11 11:11:11');
+-----------------------------------+
| WEEKOFYEAR('2022-11-11 11:11:11') |
+-----------------------------------+
| 45 |
+-----------------------------------+
1 row in set (0.00 sec)
- YEAR(d)
返回年份
MariaDB [test5]> SELECT YEAR('2022-06-11');
+--------------------+
| YEAR('2022-06-11') |
+--------------------+
| 2022 |
+--------------------+
1 row in set (0.00 sec)
- YEARWEEK(date, mode)
返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
MariaDB [test5]> SELECT YEARWEEK('2022-06-11');
+------------------------+
| YEARWEEK('2022-06-11') |
+------------------------+
| 202223 |
+------------------------+
1 row in set (0.00 sec)
MySQL 高级函数
- BIN(x)
返回 x 的二进制编码
MariaDB [test5]> SELECT BIN(16);
+---------+
| BIN(16) |
+---------+
| 10000 |
+---------+
1 row in set (0.00 sec)
- BINARY(s)
将字符串 s 转换为二进制字符串
MariaDB [test5]> SELECT BINARY 'RUNOOB';
+-----------------+
| BINARY 'RUNOOB' |
+-----------------+
| RUNOOB |
+-----------------+
1 row in set (0.00 sec)
- CASE expression
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
WHEN conditionN THEN resultN
ELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
MariaDB [test5]> SELECT CASE
-> WHEN 1>0
-> THEN '1>0'
-> WHEN 2>0
-> THEN '2>0'
-> ELSE '3>0'
-> END
-> ;
+-------------------------------------------------------------+
| CASE
WHEN 1>0
THEN '1>0'
WHEN 2>0
THEN '2>0'
ELSE '3>0'
END |
+-------------------------------------------------------------+
| 1>0 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
- CAST(x AS type)
转换数据类型
MariaDB [test5]> SELECT CAST('2022-08-25' AS DATE);
+----------------------------+
| CAST('2022-08-25' AS DATE) |
+----------------------------+
| 2022-08-25 |
+----------------------------+
1 row in set (0.00 sec)
- COALESCE(expr1, expr2, ...., expr_n)
返回参数中的第一个非空表达式(从左向右)
MariaDB [test5]> SELECT COALESCE(NULL,NULL,NULL,'runoob.com',NULL,'google.com');
+---------------------------------------------------------+
| COALESCE(NULL,NULL,NULL,'runoob.com',NULL,'google.com') |
+---------------------------------------------------------+
| runoob.com |
+---------------------------------------------------------+
1 row in set (0.00 sec)
- CONNECTION_ID()
返回唯一的连接 ID
MariaDB [test5]> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)
- CONV(x,f1,f2)
返回 f1 进制数变成 f2 进制数
MariaDB [test5]> select CONV(15,10,2);
+---------------+
| CONV(15,10,2) |
+---------------+
| 1111 |
+---------------+
1 row in set (0.00 sec)
- CONVERT(s USING cs)
函数将字符串 s 的字符集变成 cs
MariaDB [test5]> SELECT CHARSET('ABC')
-> ;
+----------------+
| CHARSET('ABC') |
+----------------+
| utf8 |
+----------------+
1 row in set (0.00 sec)
MariaDB [test5]> SELECT CHARSET(CONVERT('ABC' USING gbk));
+-----------------------------------+
| CHARSET(CONVERT('ABC' USING gbk)) |
+-----------------------------------+
| gbk |
+-----------------------------------+
1 row in set (0.01 sec)
- CURRENT_USER()
返回当前用户
MariaDB [test5]> select CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.01 sec)
- DATABASE()
返回当前数据库名
MariaDB [test5]> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test5 |
+------------+
1 row in set (0.00 sec)
- IF(expr,v1,v2)
如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
MariaDB [test5]> SELECT IF(1 > 0,'TRUE','FALSE');
+--------------------------+
| IF(1 > 0,'TRUE','FALSE') |
+--------------------------+
| TRUE |
+--------------------------+
1 row in set (0.00 sec)
如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
MariaDB [test5]> SELECT IFNULL(null,'HELLO WORD')
-> ;
+---------------------------+
| IFNULL(null,'HELLO WORD') |
+---------------------------+
| HELLO WORD |
+---------------------------+
1 row in set (0.00 sec)
- ISNULL(expression)
判断表达式是否为 NULL
MariaDB [test5]> select ISNULL(NULL);
+--------------+
| ISNULL(NULL) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
- LAST_INSERT_ID()
返回最近生成的 AUTO_INCREMENT 值
MariaDB [test5]> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
- NULLIF(expr1, expr2)
比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
MariaDB [test5]> SELECT NULLIF(25,25);
+---------------+
| NULLIF(25,25) |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
- SESSION_USER()
返回当前用户
MariaDB [test5]> SELECT SESSION_USER();
+----------------+
| SESSION_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
- SYSTEM_USER()
返回当前用户
MariaDB [test5]> SELECT SYSTEM_USER();
+----------------+
| SYSTEM_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
- USER()
返回当前用户
MariaDB [test5]> SELECT USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
- VERSION()
返回数据库的版本号
MariaDB [test5]> SELECT VERSION();
+----------------+
| VERSION() |
+----------------+
| 5.5.68-MariaDB |
+----------------+
1 row in set (0.00 sec)
小结
可以用来获取数据库信息,Mysql授权的用户名和主机名,还有版本号,以及当前的数据库,利用user()、system_user()获取用户名信息,version()获取版本号。
执行系统命令
- 使用system
在 MySQL 的命令行界面中可以使用 system shell-cmd 或者 ! shell-cmd 格式执行 shell 命令
# 查看当前目录
MariaDB [test5]> \! pwd
/home/seven
# 开启新的shell
MariaDB [test5]> \! bash
[seven@centos7 ~]$
只需要在mysql
命令行界面使用system + linux命令
即可。
# 查看当前目录
MariaDB [test5]> system ls;
test1.txt 公共 模板 视频 图片 文档 下载 音乐 桌面
# 查看当前时间
MariaDB [test5]> system date;
2022年 05月 06日 星期五 11:17:55 CST
# 查看当前用户
MariaDB [test5]> system whoami;
seven
Mysql udf
UDF是mysql的一个拓展接口,UDF(User-defined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。
安装环境
yum install mysql-server
yum install mysql-devel
1.编写c++代码并生成动态链接库
示例c++代码如下:
// g++ -shared -fPIC -I /usr/include/mysql -o udf.so udf.cc to compile
#include <mysql/mysql.h>
extern "C"{
long long myadd(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);
my_bool myadd_init(UDF_INIT *initid, UDF_ARGS *args,
char *message);
}
long long myadd(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error) {
int a = *((long long *)args->args[0]);
int b = *((long long *)args->args[1]);
return a + b;
}
my_bool myadd_init(UDF_INIT *initid, UDF_ARGS *args,
char *message){
return 0;
}
完成以后, 将文件保存为udf.cpp 然后使用如下的命令编译动态链接库:
g++ -shared -fPIC -I /usr/include/mysql -o udf.so udf.cpp
Step2: 在MySQL中添加函数
完成上述的编写以后, 将udf.so文件拷贝到MySQL的plugin目录下:
/usr/lib/mysql/plugin/
然后使用如下的命令在MySQL中安装动态链接库
CREATE FUNCTION myadd RETURNS INTEGER SONAME 'udf.so'
Step3: 调用函数以及相关查询
- 调用函数
select myadd(1,2);
可以获得计算结果3
- 查询安装列表
select * from mysql.func;
可以查看数据库当前被安装的.so的库列表.
- 用drop function来删除函数:
DROP FUNCTION myadd;
小结
可以看到, MySQL的UDF可以用于处理MySQL表中的数据, 其对外提供了普通函数与Aggregate函数接口, 普通函数处理一行的数据, Aggregate函数处理一个group的数据. 其函数头是固定的, 对外提供了5种数据类型.需要注意的是, 我们编写的MySQL UDF必须保证是线程安全的。