Mysql第七期 函数
Posted zgrjddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql第七期 函数相关的知识,希望对你有一定的参考价值。
文章目录
1. 函数的理解
1.1 什么是函数
函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既 提高了代码效率 ,又 提高了可维护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数,可以极大地 提高用户对数据库的管理效率 。
从函数定义的角度出发,我们可以将函数分成 内置函数
和 自定义函数
。在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的.
1.2 不同DBMS函数的差异
我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异
。实际上,只有很少的函数是被 DBMS 同时支持的。比如,大多数 DBMS 使用(||)(orcle就是如此)或者(+)来做拼接符,而在 mysql 中的字符串拼接函数为concat()。大部分 DBMS 会有自己特定的函数,这就意味着采用 SQL 函数的代码可移植性是很差的,因此在使用函数的时候需要特别注意。
MySQL提供了丰富的内置函数,这些函数使得数据的维护与管理更加方便,能够更好地提供数据的分析与统计功能,在一定程度上提高了开发人员进行数据分析与统计的效率。
MySQL提供的内置函数从 实现的功能角度 可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。这里,我将这些丰富的内置函数再分为两类: 单行函数 、 聚合函数(或分组函数) 。
单行函数
- 操作数据对象
- 接受参数返回一个结果
- 只对一行进行变换
- 每行返回一个结果
- 可以嵌套
- 参数可以是一列或一个值
2. 数值函数
eg:
SELECT
ABS(-123),ABS(32),SIGN(-23),SIGN(43),
、PI(),CEIL(32.32),CEILING(-43.23),
FLOOR(32.32),FLOOR(-43.23),MOD(12,5);
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1);
SELECT
ROUND(12.33),ROUND(12.343,2),ROUND(12.324,-1),
TRUNCATE(12.66,1),TRUNCATE(12.66,-1);
SELECT RADIANS(30),RADIANS(60),RADIANS(90),DEGREES(2*PI()),DEGREES(RADIANS(90));
CEIL(x):返回大于或等于 x 的最小整数
SELECT CEIL(1.5) -- 返回2
CEILING(x) :返回大于或等于 x 的最小整数
SELECT CEILING(1.5); -- 返回2
GREATEST(expr1, expr2, expr3, …):返回列表中的最大值
返回以下数字列表中的最大值:
SELECT GREATEST(3, 12, 34, 8, 25); -- 34
返回以下字符串列表中的最大值:
SELECT GREATEST("Google", "Runoob", "Apple"); -- Runoob
LEAST(expr1, expr2, expr3, …): 返回列表中的最小值
返回以下数字列表中的最小值:
SELECT LEAST(3, 12, 34, 8, 25); -- 3
返回以下字符串列表中的最小值:
SELECT LEAST("Google", "Runoob", "Apple"); -- Apple
2.3 三角函数
eg:
ATAN2(M,N)函数返回两个参数的反正切值。 与ATAN(X)函数相比,ATAN2(M,N)需要两个参数,例如有两个点point(x1,y1)和point(x2,y2),使用ATAN(X)函数计算反正切值为ATAN((y2-y1)/(x2-x1)),使用ATAN2(M,N)计算反正切值则为ATAN2(y2-y1,x2-x1)。由使用方式可以看出,当x2-x1等于0时,ATAN(X)函数会报错,而ATAN2(M,N)函数则仍然可以计算。
ATAN2(M,N)函数的使用示例如下:
SELECT
SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1)),DEGREES(ATAN2(1,1)
);
SELECT POW(2,5),POWER(2,4),EXP(2),LN(10),LOG10(10),LOG2(4);
2.5 进制间的转换
SELECT BIN(10),HEX(10),OCT(10),CONV(10,2,8);
3. 字符串函数
注意:MySQL中,字符串的位置是从1开始的。
常用函数
FIELD和FIND_iN_SET
前者是返回字符串s在字符串列表中第一次出现的位置,后者是返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串
SELECT FIELD('mm','hello','msm','amma'),
FIND_IN_SET('mm','hello,mm,amma');
NULLIF(value1,value2):比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1
SELECT NULLIF('mysql','mysql'),NULLIF('mysql', '');
REVERSE(s):将字符串s的顺序反过来
SELECT REVERSE('abc') -- cba
CHAR_LENGTH(s):返回字符串 s 的字符数
SELECT CHAR_LENGTH("RUNOOB") AS 返回字符数;
CONCAT(s1,s2…sn):字符串 s1,s2 等多个字符串合并为一个字符串
SELECT CONCAT("SQL ", "Runoob ", "Gooogle ") AS 合并字符串;
CONCAT_WS(x, s1,s2…sn):同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
合并多个字符串,并添加分隔符:
SELECT CONCAT_WS("-", "SQL", "Tutorial", "is", "fun!") AS 合并字符串;
FORMAT(x,n):函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。
SELECT FORMAT(250500.5634, 2); -- 输出 250,500.56
INSERT(s1,x,len,s2):字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
从字符串第一个位置开始的 6 个字符替换为 runoob:
SELECT INSERT("google.com", 1, 6, "runoob"); -- 输出:runoob.com
REPLACE(s,s1,s2):将字符串 s2 替代字符串 s 中的字符串 s1
将字符串 abc 中的字符 a 替换为字符 x:
SELECT REPLACE('abc','a','x') --xbc
REVERSE(s):将字符串s的顺序反过来,也称反转函数
将字符串 abc 的顺序反过来:
SELECT REVERSE('abc') -- cba
RIGHT(s,n): 返回字符串 s 的后 n 个字符
返回字符串 runoob 的后两个字符:
SELECT RIGHT('runoob',2) -- ob
LEFT(s,n):返回字符串 s 的前 n 个字符 简称左膀右臂
返回字符串 runoob 中的前两个字符:
SELECT LEFT('runoob',2) -- ru
SUBSTR(s, start, length): 从字符串 s 的 start 位置截取长度为 length 的子字符串
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串,等同于 SUBSTR(s, start, length)
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString; -- UNO
MID(s,n,len):从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT MID("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING_INDEX(s, delimiter, number): 返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX('a*b','*',1) -- a
SELECT SUBSTRING_INDEX('a*b','*',-1) -- b
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1) -- c
LCASE(s):将字符串 s 的所有字母变成小写字母
字符串 RUNOOB 转换为小写:
SELECT LCASE('RUNOOB') -- runoob
UCASE(s): 将字符串转换为大写
将字符串 runoob 转换为大写:
SELECT UCASE("runoob"); -- RUNOOB
LOWER(s):将字符串 s 的所有字母变成小写字母
字符串 RUNOOB 转换为小写:
SELECT LOWER('RUNOOB') -- runoob
UPPER(s) 将字符串转换为大写
将字符串 runoob 转换为大写:
SELECT UPPER("runoob"); -- RUNOOB
LPAD(s1,len,s2):在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
将字符串 xx 填充到 abc 字符串的开始处:
SELECT LPAD('abc',5,'xx') -- xxabc
RPAD(s1,len,s2) :在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
将字符串 xx 填充到 abc 字符串的结尾处:
SELECT RPAD('abc',5,'xx') -- abcxx
POSITION(s1 IN s):从字符串 s 中获取 s1 的开始位置
返回字符串 abc 中 b 的位置:
SELECT POSITION('b' in 'abc') -- 2
LOCATE(s1,s) :从字符串 s 中获取 s1 的开始位置
获取 b 在字符串 abc 中的位置:
SELECT LOCATE('st','myteststring'); -- 5
返回字符串 abc 中 b 的位置:
SELECT LOCATE('b', 'abc') -- 2
LTRIM(s) :去掉字符串 s 开始处的空格
去掉字符串 RUNOOB开始处的空格:
SELECT LTRIM(" RUNOOB") AS LeftTrimmedString;-- RUNOOB
RTRIM(s) 去掉字符串 s 结尾处的空格
去掉字符串 RUNOOB 的末尾空格:
SELECT RTRIM("RUNOOB ") AS RightTrimmedString; -- RUNOOB
REPEAT(s,n) 将字符串 s 重复 n 次
将字符串 runoob 重复三次:
SELECT REPEAT('runoob',3) -- runoobrunoobrunoob
SPACE(n):返回 n 个空格
返回 10 个空格:
SELECT SPACE(10);
4. 日期和时间函数
4.1 获取日期、时间
SELECT
CURDATE(),CURTIME(),NOW(),SYSDATE()+0,UTC_DATE(),UTC_DATE()+0,UTC_TIME(),UTC_TIME()+0;
获取月份、星期、星期数、天数等函数
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),
HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE());
SELECT MONTHNAME('2021-10-26'),DAYNAME('2021-10-26'),
('2021-10-26'),
QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),
DAYOFMONTH(NOW()),DAYOFWEEK(NOW());
ADDDATE(d,n):计算起始日期 d 加上 n 天的日期
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
->2017-06-25
ADDTIME(t,n) :n 是一个时间表达式,时间 t 加上时间表达式 n
加 5 秒:
SELECT ADDTIME('2011-11-11 11:11:11', 5);
->2011-11-11 11:11:16 (秒)
添加 2 小时, 10 分钟, 5 秒:
SELECT ADDTIME("2020-06-15 09:34:21", "2:10:5");
-> 2020-06-15 11:44:26
4.2 日期与时间戳的转换
eg:
SELECT
CURDATE(),CURTIME(),NOW(),SYSDATE()+0,UTC_DATE(),UTC_DATE()+0,UTC_TIME(),UTC_TIME()+0
FROM DUAL;
mysql> SELECT UNIX_TIMESTAMP(now());
+-----------------------+
| UNIX_TIMESTAMP(now()) |
+-----------------------+
| 1576380910 |
+-----------------------+
1 row in set (0.01 sec)
mysql> SELECT UNIX_TIMESTAMP(CURDATE());
+---------------------------+
| UNIX_TIMESTAMP(CURDATE()) |
+---------------------------+
| 1576339200 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT UNIX_TIMESTAMP(CURTIME());
+---------------------------+
| UNIX_TIMESTAMP(CURTIME()) |
+---------------------------+
| 1576380969 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT UNIX_TIMESTAMP('2011-11-11 11:11:11')
+---------------------------------------+
| UNIX_TIMESTAMP('2011-11-11 11:11:11') |
+---------------------------------------+
| 1320981071 |
+---------------------------------------+
1 row in set (0.00 sec)
4.3 获取月份,星期,星期数,天数等函数
eg:
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),
HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())
FROM DUAL;
SELECT MONTHNAME('2021-10-26'),DAYNAME('2021-10-26'),WEEKDAY('2021-10-26'),
QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),
DAYOFMONTH(NOW()),DAYOFWEEK(NOW())
FROM DUAL;
4.5 时间和秒钟转换的函数
| TIME_TO_SEC(NOW()) |
+--------------------+
| 78774 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT SEC_TO_TIME(78774);
+--------------------+
| SEC_TO_TIME(78774) |
+--------------------+
| 21:52:54 |
+--------------------+
1 row in set (0.12 sec)
4.6 计算日期和时间的函数
上述函数中type的取值:
eg:
ADDDATE('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col3,
DATE_ADD('2021-10-21 23:32:12',INTERVAL '1_1' MINUTE_SECOND) AS col4,
DATE_ADD(NOW(), INTERVAL -1 YEAR) AS col5, #可以是负数
DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH) AS col6 #需要单引号
FROM DUAL;
SELECT DATE_SUB('2021-01-21',INTERVAL 31 DAY) AS col1,
SUBDATE('2021-01-21',INTERVAL 31 DAY) AS col2,
DATE_SUB('2021-01-21 02:01:01',INTERVAL '1 1' DAY_HOUR) AS col3
FROM DUAL;
eg:
SELECT
ADDTIME(NOW(),20),SUBTIME(NOW(),30),SUBTIME(NOW(),'1:1:3'),DATEDIFF(NOW(),'2021-10-
01'),
TIMEDIFF(NOW(),'2021-10-25 22:10:10'),FROM_DAYS(366),TO_DAYS('0000-12-25'),
LAST_DAY(NOW()),MAKEDATE(YEAR(NOW()),12),MAKETIME(10,21,23),PERIOD_ADD第七期,MySQL如何创建分组查询!!!!