函数:是指一段可以直接被另一段程序调用的程序或代码。也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。
MySQL中的函数主要分为以下四类:字符串函数、数值函数、日期函数、流程函数。
字符串函数
函数 |
功能 |
concat(S1,S2,...Sn) |
字符串拼接,将S1,S2,... Sn拼接成一个字符串 |
lower(str) |
将字符串str全部转为小写 |
upper(str) |
将字符串str全部转为大写 |
lpad(str,n,pad) |
左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
rpad(str,n,pad) |
右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
trim(str) |
去掉字符串头部和尾部的空格 |
substring(str,start,len) |
返回从字符串str从start位置起的len个长度的字符串 |
数值函数
函数 |
功能 |
ceil(x) |
向上取整 |
floor(x) |
向下取整 |
mod(x,y) |
返回x/y的模 |
rand() |
返回0~1内的随机数 |
round(x,y) |
求参数x的四舍五入的值,保留y位小数 |
/*案例:通过数据库的函数,生成一个六位数的随机验证码。*/
/*思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0*/
select lpad(round(rand()*1000000 , 0), 6, '0');
日期函数
函数 |
功能 |
curdate() |
返回当前日期 |
curtime() |
返回当前时间 |
now() |
返回当前日期和时间 |
year(date) |
获取指定date的年份 |
month(date) |
获取指定date的月份 |
day(date) |
获取指定date的日期 |
date_add(date, interval expr type) |
返回一个日期/时间值加上一个时间间隔expr后的时间值 |
datediff(date1,date2) |
返回起始时间date1和结束时间date2之间的天数 |
/*案例:*/
select date_add(curdate(),interval 7 day );
select datediff('2023-1-01', '2022-12-01');
流程函数
函数 |
功能 |
if(value , t , f) |
如果value为true,则返回t,否则返回f |
ifnull(value1 , value2) |
如果value1不为空,返回value1,否则返回value2 |
case when [ val1 ] then [res1] ... else [ default ] end |
如果val1为true,返回res1,... 否则返回default默认值 |
case [ expr ] when [ val1 ] then [res1] ... else [ default ] end |
如果expr的值等于val1,返回res1,... 否则返回default默认值 |
/*案例:*/
select if(false, 'Ok', 'Error');
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
/*案例:查询employee表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)*/
select name, (case address when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '地址' from employee;
/*案例:*/
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);
/*显示学生分数等级*/
select id,
name,
(case
when math >= 85 then '优秀'
when math >= 60 then '及格'
else '不及格'
end) as '数学',
(case
when english >= 85 then '优秀'
when english >= 60 then '及格'
else '不及格'
end) as '英语',
(case
when chinese >= 85 then '优秀'
when chinese >= 60 then '及格'
else '不及格'
end) as '语文'
from score;