目录
2.5.4. YEAR , MONTH , DAY:当前年、月、日
2.7.3. case when then else end
一、概述
数据库函数是数据库中提供的一种工具,用于处理查询结果。它们可以分为单行函数和多行函数(聚合函数),前者对单行数据进行运算并返回结果,后者则对多行数据进行处理并返回一个结果。
1.1. 数据库函数的常规分类
1.1.1. 常用单行函数(标量函数)
字符函数:如
LOWER
(将所有字母小写)、UPPER
(将所有字母大写)、INITCAP
(将所有单词首字母大写)、LENGTH
(计算字符串长度)、REPLACE
(字符串替换)、SUBSTR
(字符串截取)。数字函数:用于对数字进行运算。
日期函数:用于处理日期类型数据。
转换函数:如
TO_DATE
(将内容转换为日期)、TO_NUMBER
(将内容转换为数字)、TO_CHAR
(将数字或日期转换为字符)。
1.1.2. 表值函数
用于对表进行操作并返回一个表。常见的表值函数有
PIVOT:旋转表数据
UNPIVOT:反向旋转表数据
SPLIT:将字符串拆分成多行
1.1.3. 常用多行函数(聚合函数)
AVG
(求平均数)
SUM
(求和)
COUNT
(统计数目)
MAX
(求最大值)
MIN
(求最小值)
1.1.4. 系统函数
系统函数:用于在数据库管理系统中进行特定操作的函数。常见的系统函数
GETDATE:返回当前日期和时间
USER:返回当前登录用户的用户名
SYSTEM_USER:返回当前系统用户的用户名
1.1.5. 行级函数
行集函数:用于对行进行操作并返回一组行。常见的行集函数有
CROSS APPLY:在一个查询中将每一行数据与一个表值函数结合
OUTER APPLY:类似于CROSS APPLY,但即使表值函数返回空值,也会返回行
1.2. 数据库函数的应用场景
数据库函数广泛应用于数据处理和分析中,例如:
字符处理:用于格式化显示日期和数字,转换列数据类型。
数据结算:执行数据结算、修改单个数据项、格式化显示日期和数字等。
统计分析:在数据分析中,聚合函数用于计算平均值、总和、计数、最大值和最小值等统计指标。
通过这些功能,数据库函数极大地简化了数据处理和分析的复杂性,提高了工作效率。
1)如上图所示,在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能够看到当前员工入职的天数。 而在数据库中,存储的都是入职日期,如 2000-11-12,那如果快速计算出天数呢?
2)在做报表这类的业务需求中,我们要展示出学员的分数等级分布。而在数据库中,存储的是学生的分数值,如98/75,如何快速判定分数的等级呢?其实,上述的这一类的需求呢,我们通过MySQL中的函数都可以很方便的实现 。
二、MySQL中的函数分类
主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。
2.1. 字符串函数
2.1.1. concat : 字符串拼接
select concat('Hello' , ' MySQL');
2.1.2. lower : 全部转小写
select lower('Hello');
2.1.3. upper : 全部转大写
select upper('Hello');
2.1.4. lpad : 左填充
select lpad('01', 5, '-');
2.1.5. rpad : 右填充
select rpad('01', 5, '-');
2.1.6. trim : 去除空格
select trim(' Hello MySQL ');
2.1.7. substring : 截取子字符串
select substring('Hello MySQL',1,5);
2.2. 字符串函数案例
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001。
update emp set workno = lpad(workno, 5, '0');
处理完毕后, 具体的数据为:
2.3. 数值函数
常见的数值函数如下:

2.3.1. ceil:向上取整
select ceil(1.1);
2.3.2. floor:向下取整
select floor(1.9);
2.3.3. mod:取模
select mod(7,4);
2.3.4. rand:获取随机数
select rand();
2.3.5. round:四舍五入
select round(2.344,2);
2.4. 数值函数案例
通过数据库的函数,生成一个六位数的随机验证码。思路:获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0
select lpad(round(rand()*1000000 , 0), 6, '0');
2.5. 日期函数
常见的日期函数如下:

2.5.1. curdate:当前日期
select curdate();
2.5.2. curtime:当前时间
select curtime();
2.5.3. now:当前日期和时间
select now();
2.5.4. YEAR , MONTH , DAY:当前年、月、日
select YEAR(now());
select MONTH(now());
select DAY(now());
2.5.5. date_add:增加指定的时间间隔
select date_add(now(), INTERVAL 70 YEAR );
2.5.6. datediff:获取两个日期相差的天数
select datediff('2021-10-01', '2021-12-01');
2.6. 日期函数案例
查询所有员工的入职天数,并根据入职天数倒序排序。
思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by
entrydays desc;
2.7. 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
2.7.1. if
select if(false, 'Ok', 'Error');
2.7.2. ifnull
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
2.7.3. case when then else end
需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
select name,
( case workaddress when '北京' then '一线城市'
when '上海' then '一线城市'
else '二线城市' end
) as '工作地址'
from emp;
2.8. 流程函数案例
create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95
), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);
具体的SQL语句如下:
select id, name,
(case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end )
'数学',
(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格'
end ) '英语',
(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格'
end ) '语文'
from score;
2.9. 思考
1). 数据库中,存储的是入职日期,如 2000-01-01,如何快速计算出入职天数呢?
答案: datediff
2). 数据库中,存储的是学生的分数值,如98、75,如何快速判定分数的等级呢?
答案: case ... when ...