抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用DDL语句管理函数。

环境

Windows 10 企业版 LTSC 21H2
MySQL 5.7.40

1 简介

1.1 定义

函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由SQL语句和过程式语句组成的代码片段,但函数可以在SQL语句中直接调用。

1.2 函数与存储过程的区别

函数不能拥有输出参数,因为函数自身就是输出参数,存储过程可以拥有输出参数。

函数中必须有返回值,存储过程没有返回值。

可以直接对函数进行调用而不需要使用call语句,对存储过程的调用需要使用call语句。

2 操作

2.1 创建

语法:

sql
1
2
3
create function 函数名称([参数])
returns 类型
函数主体

说明:

  • 函数名称:指定函数的名称。注意,函数不能与存储过程具有相同的名称。
  • 参数:指定函数的参数。这里的参数只有名称和类型,不能指定参数类型。
  • 类型:声明函数返回值的数据类型。
  • 函数主体:函数的主体部分,和存储主体类似,函数主体还必须包含返回值。在返回值中包含select语句时,只能是一行且只能有一列值。

创建不带参数的函数:

sql
1
2
3
create function showMaxGrade()
returns int(10)
return (select max(grade) from score);

创建带有参数的函数:

sql
1
2
3
create function showStuGrade(stu varchar(45))
returns int(10)
return (select grade from score where student = stu);

创建带有多个语句的函数:

sql
1
2
3
4
5
6
7
8
9
delimiter $$
create function showRandGrade()
returns int(5)
begin
declare i int default 0;
set i = floor(rand() * 10);
return i;
end $$
delimiter ;

2.2 使用

语法:

sql
1
select 函数名称([参数]);

示例:

sql
1
2
3
4
5
6
7
8
9
mysql> select showMaxGrade();
+----------------+
| showMaxGrade() |
+----------------+
| 98 |
+----------------+
1 row in set (0.00 sec)

mysql>

2.3 查看

查看所有函数:

sql
1
show function status;

查看函数的创建:

sql
1
show create function 函数名称;

2.4 修改

可以通过先删除函数,然后重新创建函数的方法实现修改的操作。

2.5 删除

语法:

sql
1
drop function 函数名称;

示例:

sql
1
2
3
4
mysql> drop function showMaxGrade;
Query OK, 0 rows affected (0.00 sec)

mysql>

3 单行函数

处理字符串:

函数 用法
LENGTH(s) 返回字符串s的字节数,和字符集有关
CONCAT(s1,s2,...,sn) 连接s1,s2,...,sn为一个字符串
SUBSTR(s,index,len) 返回字符串s从index位置开始的len个字符,位置index从1开始
LOCATE(substr,s) 返回字符串substr在字符串s中首次出现的位置,位置从1开始,未找到返回0

获取日期时间:

函数 用法
CURDATE() / CURRENT_DATE() 返回当前日期,只包含年月日
CURTIME() / CURRENT_TIME() 返回当前时间,只包含时分秒
NOW() / LOCALTIME() / LOCALTIMESTAMP() 返回当前系统日期和时间
YEAR(date) / MONTH(date) / DAY(date) 返回指定日期的年月日
HOUR(time) / MINUTE(time) / SECOND(time) 返回指定时间的时分秒
MONTHNAME(date) 返回指定日期对应的月份
DAYNAME(date) 返回指定日期对应的星期
WEEKOFYEAR(date) 返回指定日期是一年中的第几周
DAYOFYEAR(date) 返回指定日期是一年中的第几天
DAYOFMONTH(date) 返回指定日期是一月中的第几天
DAYOFWEEK(date) 返回指定日期是一周中的第几天,1表示周日,2表示周一,以此类推,7表示周六

处理日期和时间:

函数 用法
DATE_FORMAT(date, fmt) 按照fmt格式将日期date转为字符串
TIME_FORMAT(time, fmt) 按照fmt格式将时间time转为字符串
STR_TO_DATE(str, fmt) 按照fmt格式将字符串str转为日期时间

格式符:

字符 说明
%Y 四位数字表示年份
%m 两位数字表示月份
%d 两位数字表示月中的天数
%H 两位数字表示24小时制的小时数
%i 两位数字表示分钟数
%s 两位数字表示秒数

流程控制:

函数 用法
IF(value,value1,value2) 如果value为TRUE,则返回value1,否则返回value2
IFNULL(value1, value2) 如果value1不为NULL,则返回value1,否则返回value2
NULLIF(value1,value2) 比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1
CASE WHEN 条件1 THEN 值1 ... [ELSE 值1] END 依次判断条件并返回对应的值,相当于IF-ELSE判断语句
CASE 表达式 WHEN 条件1 THEN 值1 ... [ELSE 值n] END 依次判断表达式和条件是否相等并返回对应的值,相当于SWITCH-CASE判断语句

加密和解密:

函数 用法
PASSWORD(str) 返回字符串str的加密版本,加密结果不可逆,常用于密码加密
MD5(str) 返回字符串str经过MD5加密后的值,若参数为NULL,则会返回NULL
SHA(str) 返回字符串str经过SHA加密后的值,若参数为NULL,则会返回NULL,比MD5更加安全

获取信息:

函数 用法
VERSION() 返回当前的版本号
CONNECTION_ID() 返回当前的连接数
DATABASE() / SCHEMA() 返回当前连接的数据库
USER() / CURRENT_USER() 返回当前连接的用户名

4 聚合函数

聚合函数常用于分组后的处理:

函数 用法
AVG(column) 对数值型数据求平均值
SUM(column) 对数值型数据求和
MIN(column) 对任意类型的数据求最小值
MAX(column) 对任意类型的数据求最大值
COUNT(column) 统计任意类型的数据记录总数

比较COUNT(*)/COUNT(1)/COUNT(column)区别:

  • 对于MyISAM引擎的表没有区别,对于Innodb引擎的表有些区别。
  • 对于Innodb引擎的表,使用COUNT(*)和COUNT(1)的时间复杂度是O(n),优于使用COUNT(column)的时间复杂度。
  • 使用COUNT(*)和COUNT(1)会统计值为NULL的行,使用COUNT(column)不会统计值为NULL的行。

评论