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如何创建分组查询!!!!

第七期,MySQL如何创建分组查询!!!!

第七期,MySQL如何创建分组查询!!!!

微服务过时了 - Serverless了解一下 | 技术专题第七期征文

前端周刊第七期

艺术编程-技术之声第七期