MySql不难,我们一起进步之函数篇

368 阅读10分钟

MySQL 常用内置函数

字符串函数

1、 LOWER(str) 将输入的字符串全部转换为小写:

SELECT LOWER('MySQL');

输出结果:

+----------------+
| LOWER('MySQL') |
+----------------+
| mysql          |
+----------------+
1 row in set (0.00 sec)

2、 CONCAT(str1, str2) 将字符串 str1 和 str2 首尾连接后返回:

SELECT CONCAT ('My', 'SQL');

输出结果:

+----------------------+
| CONCAT ('My', 'SQL') |
+----------------------+
| MySQL                |
+----------------------+
1 row in set (0.00 sec)

3、 SUBSTR(str, m, n) 获取字符串中指定的子字符串,从 m 位置开始,取 n 个字符,如果 n 被忽略,则取到字符串结尾处:

SELECT SUBSTR('MySQL', 3, 3);

输出结果:

+-----------------------+
| SUBSTR('MySQL', 3, 3) |
+-----------------------+
| SQL                   |
+-----------------------+
1 row in set (0.00 sec)

结果解析:第一个字符的起始位置是 1,不是 0。

4、 LENGTH(str) 返回字符串的长度:

SELECT LENGTH('MySQL');

输出结果:

+-----------------+
| LENGTH('MySQL') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.00 sec)

5、 INSTR(str, substr) 从字符串 str 中返回子串 substr 第一次出现的位置:

SELECT INSTR('MySQLSQL', 'SQL');

输出结果:

+--------------------------+
| INSTR('MySQLSQL', 'SQL') |
+--------------------------+
|                        3 |
+--------------------------+
1 row in set (0.00 sec)

结果解析:“SQL” 在 “MySQLSQL” 中第一次出现的位置是 3。

6、 LPAD(str1, n, str2) 在字符串 str1 的左边使用字符串 str2 进行填充,直到总长度达到 n 为止:

SELECT LPAD('MySQL', 8, '*');

输出结果:

+-----------------------+
| LPAD('MySQL', 8, '*') |
+-----------------------+
| ***MySQL              |
+-----------------------+
1 row in set (0.00 sec)

结果解析:把 * 添加到 MySQL 的左边,总长度达到 8 为止。

7、 REPLACE(str, old_str, new_str) 在字符串 str 中查找所有的子串 old_str,使用 new_str 替换,并返回替换后的结果:

SELECT REPLACE('MySQL', 'SQL', 'sql');

输出结果:

+--------------------------------+
| REPLACE('MySQL', 'SQL', 'sql') |
+--------------------------------+
| Mysql                          |
+--------------------------------+
1 row in set (0.06 sec)

结果解析:把 MySQL 中的 SQL 替换为小写的 sql。

8、 REPEAT(str, count) 将字符串 str 重复 count 次,并返回重复后的结果:

SELECT REPEAT('MySQL', 2);

输出结果:

+--------------------+
| REPEAT('MySQL', 2) |
+--------------------+
| MySQLMySQL         |
+--------------------+
1 row in set (0.00 sec)

结果解析:MySQL 字符串重复输出两次。

9、 REVERSE(str) 将字符串 str 反转,返回反转后的结果:

SELECT REVERSE('MySQL');

输出结果:

+------------------+
| REVERSE('MySQL') |
+------------------+
| LQSyM            |
+------------------+
1 row in set (0.00 sec)

数值函数

1、 ABS(num) 返回 num 的绝对值:

SELECT ABS(-5);

输出结果:

+---------+
| ABS(-5) |
+---------+
|       5 |
+---------+
1 row in set (0.00 sec)

2、 CEIL(num) 返回大于 num 的最小整数值:

SELECT CEIL(5.1);

输出结果:

+-----------+
| CEIL(5.1) |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

3、 FLOOR(num) 返回小于 num 的最大整数值:

SELECT FLOOR(5.1);

输出结果:

+------------+
| FLOOR(5.1) |
+------------+
|          5 |
+------------+
1 row in set (0.00 sec)

4、 MOD(num1, num2) 返回 num1 对 num2 进行模运算结果:

SELECT MOD(6, 4);

输出结果:

+-----------+
| MOD(6, 4) |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)

5、 RAND() 返回 0 到 1 内的随机值:

SELECT RAND();

输出结果:

+---------------------+
| RAND()              |
+---------------------+
| 0.19370275940159593 |
+---------------------+
1 row in set (0.00 sec)

6、 ROUND(num, n) 返回 num 的四舍五入的 n 位小数的值:

SELECT ROUND(5.1364, 2);

输出结果:

+------------------+
| ROUND(5.1364, 2) |
+------------------+
|             5.14 |
+------------------+
1 row in set (0.00 sec)

如果 num 中的小数位数小于 n,缺少的位数用 0 补上。

7、 TRUNCATE(num, n) 返回数字 num 截断为 n 位小数的结果:

SELECT TRUNCATE(5.1364, 2);

输出结果:

+---------------------+
| TRUNCATE(5.1364, 2) |
+---------------------+
|                5.13 |
+---------------------+
1 row in set (0.01 sec)

如果 num 中的小数位数小于 n,缺少的位数用 0 补上。

8、 SQRT(num) 返回 num 的平方根:

SELECT SQRT(16);

输出结果:

+----------+
| SQRT(16) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

时间日期函数

1、 NOW() 返回当前日期时间:

SELECT NOW();

输出结果:

+---------------------+
| NOW()               |
+---------------------+
| 2022-05-07 21:53:41 |
+---------------------+
1 row in set (0.00 sec)

2、 CURDATE() 返回当前日期:

SELECT CURDATE();

输出结果:

+------------+
| CURDATE()  |
+------------+
| 2022-05-07 |
+------------+
1 row in set (0.00 sec)

3、 CURTIME() 返回当前时间:

SELECT CURTIME();

输出结果:

+-----------+
| CURTIME() |
+-----------+
| 21:54:20  |
+-----------+
1 row in set (0.00 sec)

4、 WEEK(date) 返回 date 日期是一年中的第几周:

SELECT WEEK('2020-07-01');

输出结果:

+--------------------+
| WEEK('2020-07-01') |
+--------------------+
|                 26 |
+--------------------+
1 row in set (0.00 sec)

5、 YEAR(date)MONTH(date)DAY(date) 返回 date 日期中的年份、月份、日:

SELECT YEAR('2020-07-01'), MONTH('2020-07-01'), DAY('2020-07-01');

输出结果:

+--------------------+---------------------+-------------------+
| YEAR('2020-07-01') | MONTH('2020-07-01') | DAY('2020-07-01') |
+--------------------+---------------------+-------------------+
|               2020 |                   7 |                 1 |
+--------------------+---------------------+-------------------+
1 row in set (0.00 sec)

6、 DATEDIFF(date1, date2) 返回 date1 与 date2 间隔的天数:

SELECT DATEDIFF('2020-07-01', '2020-06-01');

输出结果:

+--------------------------------------+
| DATEDIFF('2020-07-01', '2020-06-01') |
+--------------------------------------+
|                                   30 |
+--------------------------------------+
1 row in set (0.00 sec)

结果说明:如果 date1 日期比 date2 日期小,输出为负值。

7、 ADDDATE(date, n) 返回 date 日期添加 n 天后的新日期:

SELECT ADDDATE('2020-07-01', 10);

输出结果:

+---------------------------+
| ADDDATE('2020-07-01', 10) |
+---------------------------+
| 2020-07-11                |
+---------------------------+
1 row in set (0.00 sec)

转换函数

DATE_FORMAT() 函数

显示今天是星期几

SELECT DATE_FORMAT(NOW(), '%W');

输出结果:

+--------------------------+
| DATE_FORMAT(NOW(), '%W') |
+--------------------------+
| Saturday                  |
+--------------------------+
1 row in set (0.000 sec)

上面例子中可以使用 %a 代替 %W ,那么输出结果则为 Sat ,英文单词的简写;也可以使用 %w 替换 %W ,输出结果为 6 ,即星期几的数值。

只显示年月

只显示年月,且年用四位数字形式来表示,年月之间使用 - 连接。

SELECT DATE_FORMAT(NOW(), '%Y-%c');

输出结果:

+-----------------------------+
| DATE_FORMAT(NOW(), '%Y-%c') |
+-----------------------------+
| 2022-5                      |
+-----------------------------+
1 row in set (0.000 sec)

年份只显示后两位,则上面例子可以使用 %y 代替 %Y ,输出结果为 21-3。

显示当前时间的分钟数和秒数

显示当前时间的分钟数和秒数,分和秒之间用 : 连接。

SELECT DATE_FORMAT(CURTIME(), '%i:%S');

输出结果:

+---------------------------------+
| DATE_FORMAT(CURTIME(), '%i:%S') |
+---------------------------------+
| 55:47                           |
+---------------------------------+
1 row in set (0.000 sec)

STR_TO_DATE() 函数

1、 待转换字符串中只能出现数字,否则返回结果为 NULL :

SELECT STR_TO_DATE('2020070a', '%Y%m%d');

输出结果:

+-----------------------------------+
| STR_TO_DATE('2020070a', '%Y%m%d') |
+-----------------------------------+
| NULL                              |
+-----------------------------------+
1 row in set, 2 warnings (0.000 sec)

2、 如果格式字符串仅包含日期,则待转字符串至少需要 8 位数字:

SELECT STR_TO_DATE('202007', '%Y%m%d');

输出结果:

+---------------------------------+
| STR_TO_DATE('202007', '%Y%m%d') |
+---------------------------------+
| NULL                            |
+---------------------------------+
1 row in set, 1 warning (0.000 sec)

结果解析:字符串 202007 低于 8 位,故结果返回 NULL 。

3、 转换后日期时间必须有效,否则返回结果为 NULL :

SELECT STR_TO_DATE('20201301', '%Y%m%d');

输出结果:

+-----------------------------------+
| STR_TO_DATE('20201301', '%Y%m%d') |
+-----------------------------------+
| NULL                              |
+-----------------------------------+
1 row in set, 1 warning (0.000 sec)

结果解析:20201301 转换为日期后得到的月份是 13,超出有效范围,故结果返回 NULL 。

4、 如果被转字符串超出 8 位且格式字符串中无时间格式,则自动取前 8 位转换为日期:

SELECT STR_TO_DATE('2020070110', '%Y%m%d');

输出结果:

+-------------------------------------+
| STR_TO_DATE('2020070110', '%Y%m%d') |
+-------------------------------------+
| 2020-07-01                          |
+-------------------------------------+
1 row in set, 1 warning (0.000 sec)

5、 格式字符串可以包含时间格式:

SELECT STR_TO_DATE('20200701104523', '%Y%m%d%H%i%S');

输出结果:

+-----------------------------------------------+
| STR_TO_DATE('20200701104523', '%Y%m%d%H%i%S') |
+-----------------------------------------------+
| 2020-07-01 10:45:23                           |
+-----------------------------------------------+
1 row in set (0.000 sec)

CAST 函数与 CONVERT 函数

1、 数字和小数点组成的字符串转换为整型:

SELECT CAST('3.12' AS SIGNED);

输出结果:

+------------------------+
| CAST('3.12' AS SIGNED) |
+------------------------+
|                      3 |
+------------------------+
1 row in set, 1 warning (0.00 sec)

使用 CONVERT() 函数则是:CONVERT('3.12', SIGNED),得到的结果相同。

2、 非数值字符串转换为整型:

SELECT CAST('30a1.12' AS SIGNED);

输出结果:

+---------------------------+
| CAST('30a1.12' AS SIGNED) |
+---------------------------+
|                        30 |
+---------------------------+
1 row in set, 1 warning (0.00 sec)

在转换为整型的时候,如果遇到无法识别的字符则停止转换,只返回能正常识别的部分。如果一开始就无法识别则返回 0。

3、 把整型转换为二进制:

SELECT CAST(123 AS BINARY);

输出结果:

+---------------------+
| CAST(123 AS BINARY) |
+---------------------+
| 123                 |
+---------------------+
1 row in set (0.00 sec)

使用 BINARY 将数值或字符串进行二进制转换,在打印结果上看不出变化。此处我们可以举一个小例子。

当我们使用等号进行「等值判断」时,大小写英文字母是等值的:

mysql> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
|         1 |
+-----------+
1 row in set (0.01 sec)

如果要使得结果为「否」(也就是 0),可以在字符前面加上 BINARY 关键字将其转换成二进制字符串,这样的判断结果就是「否」了:

mysql> SELECT BINARY 'A' = BINARY 'a';
+-------------------------+
| BINARY 'A' = BINARY 'a' |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

4、 数字和小数点组成的字符串转换为浮点型:

SELECT CAST('12.34' AS DECIMAL(3, 1));

输出结果:

+------------------------------+
| CAST('12.34' AS DECIMAL(3, 1)) |
+------------------------------+
|                         12.3 |
+------------------------------+
1 row in set (0.00 sec)

结果解析:DECIMAL(m, n) ,其中 m 必须大于 n,表示总共 m 位数据,其中小数 n 位,整数 m-n 位。

通用函数

条件判断:IF() 函数

条件判断函数 IF() 的基本语法如下:

IF(expr, value1, value2)

其中 expr 是布尔类型的条件判断表达式,如果 expr 为真返回 value1,否则返回 value2。

举例说明

判断一个比较算术式:

SELECT IF(1 > 2, '是', '否');

输出结果:

+-------------------------+
| IF(1 > 2, '是', '否')   |
+-------------------------+
||
+-------------------------+
1 row in set (0.000 sec)

条件判断:IFNULL 函数

条件判断函数 IFNULL() 的基本语法如下:

IFNULL(value1, value2)

该函数先判断 value1,如果 value1 不为 NULL,该函数返回 value1,否则返回 value2。

举例说明

判断一个数值是否为空值:

SELECT IFNULL(NULL, 1);

输出结果:

+-----------------+
| IFNULL(NULL, 1) |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.000 sec)

条件判断:CASE() 函数

条件判断函数 CASE() 的基本语法如下:

CASE expr WHEN value1 THEN result1 [WHEN value2 THEN result2 …… WHEN valuen THEN resultn] [ELSE DEFAULT] END

如果 expr 等于其中一个 value 的值,则返回对应 THEN 后的结果,如果都不等,则返回 ELSE 后面的 DEFAULT。

举例说明

1、 成功匹配其中一条 WHEN 分支:

SELECT CASE 2 WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' ELSE 'D' END;

输出结果:

+---------------------------------------------------------------------+
| CASE 2 WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' ELSE 'D' END |
+---------------------------------------------------------------------+
| B                                                                   |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

2、 所有 WHEN 分支匹配失败,进入 ELSE 默认分支:

SELECT CASE 5 WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' ELSE 'D' END;

输出结果:

+---------------------------------------------------------------------+
| CASE 5 WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' ELSE 'D' END |
+---------------------------------------------------------------------+
| D                                                                   |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

系统信息函数

1、 查看当前 MySQL 数据库版本号:

SELECT VERSION();

2、 查看当前使用的数据库:

SELECT DATABASE();

3、 查看当前服务器连接次数:

SELECT CONNECTION_ID();

两个不同的加密函数

使用 MD5 进行加密

MD5 是一种被广泛使用的加密方法,它是一个密码散列函数,可以产生一个 128 位的散列值,这些值按一定规则进行排序。当你的保护对象发生变化后,其 MD5 的值也会不一样,所以 MD5 经常用来验证数据有没有被篡改。使用方式如下:

SELECT MD5(123);

输出结果:

+----------------------------------+
| MD5(123)                         |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
1 row in set (0.00 sec)

使用 SHA 进行加密

SHA 和 MD5 一样,也是一个密码散列函数,是 FIFS 认证的安全散列算法,比 MD5 更安全。 使用方式如下:

SELECT SHA(123);

输出结果:

+------------------------------------------+
| SHA(123)                                 |
+------------------------------------------+
| 40bd001563085fc35165329ea1ff5c5ecbdbbeef |
+------------------------------------------+
1 row in set (0.00 sec)

sha更加长

格式化函数

接下来给大家介绍的格式化函数是 FORMAT() 函数。使用该函数可得到 ##,###.#### 这种格式的输出。其基本语法如下:

FORMAT(value, n)

其中 value 是被格式化的数据,n 表示保留的小数位数。

1、 对整数进行格式化,保留 2 位小数:

SELECT FORMAT(1000, 2);

输出结果:

+-----------------+
| FORMAT(1000, 2) |
+-----------------+
| 1,000.00        |
+-----------------+
1 row in set (0.000 sec)

2、 对浮点数进行格式化,保留 2 位小数:

SELECT FORMAT(1000.125, 2);

输出结果:

+---------------------+
| FORMAT(1000.125, 2) |
+---------------------+
| 1,000.13            |
+---------------------+
1 row in set (0.000 sec)

结果解析:可以看到该函数具有四舍五入的功能。

多行函数

国家人口的平均值 avg(国家人口)

国家人口的总数 sum(国家人口)

人口最多和最少国家的人口数量 max(国家人口),min(国家人口)

总共有多少国家 count(国家名字)

分组函数

使用 GROUP BY 进行分组时要注意:

  • GROUP BY 一般和多行函数一起使用;
  • 使用分组统计时,SELECT 子句后要么是多行函数,要么是 GROUP BY 子句中用于分组的字段;换句话说,分组后,只能查询组的值或组的统计值;
  • 对 GROUP BY 的结果进行筛选,使用 HAVING 关键字。