摘要:本文学习了如何使用DDL语句管理函数。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
1 简介
1.1 定义
函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由SQL语句和过程式语句组成的代码片段,但函数可以在SQL语句中直接调用。
1.2 函数与存储过程的区别
函数不能拥有输出参数,因为函数自身就是输出参数,存储过程可以拥有输出参数。
函数中必须有返回值,存储过程没有返回值。
可以直接对函数进行调用而不需要使用call语句,对存储过程的调用需要使用call语句。
2 操作
2.1 创建
语法:
1 | create function 函数名称([参数]) |
说明:
- 函数名称:指定函数的名称。注意,函数不能与存储过程具有相同的名称。
- 参数:指定函数的参数。这里的参数只有名称和类型,不能指定参数类型。
- 类型:声明函数返回值的数据类型。
- 函数主体:函数的主体部分,和存储主体类似,函数主体还必须包含返回值。在返回值中包含select语句时,只能是一行且只能有一列值。
创建不带参数的函数:
1 | create function showMaxGrade() |
创建带有参数的函数:
1 | create function showStuGrade(stu varchar(45)) |
创建带有多个语句的函数:
1 | delimiter $$ |
2.2 使用
语法:
1 | select 函数名称([参数]); |
示例:
1 | mysql> select showMaxGrade(); |
2.3 查看
查看所有函数:
1 | show function status; |
查看函数的创建:
1 | show create function 函数名称; |
2.4 修改
可以通过先删除函数,然后重新创建函数的方法实现修改的操作。
2.5 删除
语法:
1 | drop function 函数名称; |
示例:
1 | mysql> drop function showMaxGrade; |
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的行。
条