MySQL命令语句中的函数包含四种:
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
前两篇关于MySQL的博客,地址如下:
MySQL数据库 && SQL语言命令总结 && 数据类型、运算符和聚合函数汇总_Flying Bulldog的博客-CSDN博客https://blog.csdn.net/qq_54185421/article/details/131396183?spm=1001.2014.3001.5501从0到1 && 关于MySQL的数据库和表_Flying Bulldog的博客-CSDN博客https://blog.csdn.net/qq_54185421/article/details/131429423?spm=1001.2014.3001.5501
目录
1 字符串函数
字符串函数—案例
2. 数值函数
数值函数—案例
3. 日期函数
日期函数—案例
4. 流程函数
流程函数—案例
1 字符串函数
函数 | 功能 |
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 个长度的字符串 |
字符串函数—案例
参考本人的另外一篇博客,即可拥有如下图所示的数据库表:
题目:由于业务需求变更,企业员工的工号统一为5位数,不足5位数的工号在前面补0。
思路:根据题目分析,假如员工的工号为 1,则利用函数 lpad 把工号转变成 00001 即可。
update emp set workno = lpad(workno, 5, '0');
运行上述SQL命令,更新的具体数据如下图所示:
2. 数值函数
函数 | 功能 |
---|---|
CELL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回 x / y 的模 |
RAND() | 返回 0~1 的随机数 |
ROUND(x,y) | 求参数 x 四舍五入的值,保留 y 位小数 |
数值函数—案例
题目:通过数据库的函数,生成一个六位数的随机验证码。
思路:获取随机数可以通过 rand() 函数,但是获取出来的随机数是在 0-1 之间的,所以可以在其基础上乘以 1000000,然后舍弃小数部分。注意:利用函数 lpad 补 0( 如果长度不足 6 位)。
select lpad(round(rand()*1000000,0),6,'0');
运行结果如下:
3. 日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL exprtype) | 返回一个日期 / 时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
日期函数—案例
题目:查询所有员工的入职天数,并根据入职天数倒序排序。
思路:入职天数,就是通过 当前日期 - 入职日期,所以需要使用 datediff 函数来完成。
select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays desc;
运行上述语句,结果如下图所示:
4. 流程函数
函数 | 功能 |
---|---|
IF(value,t,f) | 如果 value 为 true,则返回 t, 否则返回 f |
IFNULL(value1,value2) | 如果 value1 不为空,返回 value1, 否则返回 value2 |
CASE WHEN [ vall ] THEN [res1] ... ELSE [default] END | 如果 vall 为 true,返回 res1,... 否则返回 default 默认值 |
CASE [expr] WHEN [vall] THEN [res1] ... ELSE [default] END | 如果 expr 的值等于 vall,返回 res1,... 否则返回 default 默认值 |
流程函数—案例
题目:统计学生的成绩等级。
思路:利用流程函数 CASE WHEN [ vall ] THEN [res1] ... ELSE [default] END 来解决问题。
(1)创建学生成绩数据表,命名为 score
-- 创建表score,结构如下:
create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
(2)插入数据到数据表 score 中
-- 插入数据到表score中
insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);
(3)统计学生的成绩等级
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;
运行结果如下:
>>> 如有疑问,欢迎评论区一起探讨。