版本说明
当前版本号[20230401]。
版本 | 修改说明 |
---|---|
20230401 | 初版 |
本课程的笔记已经更新完毕,各位可以通过点击《黑马程序员MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化》学习笔记总目录查看所有知识点,同时也能免费下载学习笔记和思维导图。
知识总览图
目录
3. 函数
函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。
MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。
3.1 字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
演示如下:
A. concat : 字符串拼接
select concat('Hello','MySQL');
B. lower : 全部转小写
select lower('Hello!');
C. upper : 全部转大写
select upper('Hello!');
D. lpad : 左填充
#中间5的意思是:填充到5个字符
select lpad('01',5,'-');
E. rpad : 右填充
#同上
select rpad('01',5,'-');
F. trim : 去除空格
【去头部和尾部,中间不去!】
select trim(' Hello MySQL ');
#输出结果:Hello MySQL
G. substring : 截取子字符串
#“1”代表的是:从第一个字符开始截取
#“5”代表的是:截取五个
select substring('Hello MySQL',1,5);
#输出结果:Hello
案例:
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001。
#update 是更新的语法,后面跟着表
# set 后面跟着的是要更新的段
#更新成用lpad进行的左填充后有5个字符的数字
update emp set workno = lpad(workno, 5, '0');
处理完毕后, 具体的数据为:
3.2 数值函数
常见的数值函数如下:
演示如下:
A. ceil:向上取整
select ceil(1.5);
#输出结果:2
B. floor:向下取整
select floor(2.7);
#输出结果:2
C. mod:取模
(这里要放两个数!)
select mod(3,4);
#输出结果:3
#相当于是 3 除以 4 ,余数为3
D. rand:获取随机数
select rand();
E. round:四舍五入
select round(4.7657,2);
#输出结果:4.77
# 第一个数是想被四舍五入的数
#第二个是想保留多少位小数
案例:
通过数据库的函数,生成一个六位数的随机验证码。
思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础 上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0
select lpad(round(rand()*1000000,0),6,'0');
#先rand出随机数,然后乘以1000000
#再round四舍五入,把小数去掉
#最后lpad左补齐或rpad右补齐,使得最后结果为6位数,首位空位或末位空位用0补充
#输出结果:083983
3.3 日期函数
常见的日期函数如下:
演示如下:
A. curdate:当前日期
select curdate();
B. curtime:当前时间
select curtime();
C. now:当前日期和时间
select now();
D. YEAR , MONTH , DAY:当前年、月、日
select YEAR(now());
select MONTH(now());
select DAY(now());
E. date_add:增加指定的时间间隔
#INTERVAL 代表向后推多久
select date_add(now(),INTERVAL 70 DAY);
#举一反三,我们也可以
select date_add(now(),INTERVAL 70 MONTH);
select date_add(now(),INTERVAL 70 YEAR);
F. datediff:获取两个日期相差的天数
#要输入两个数,且第一个年月日时长大于第二个,不然会出现负数
select datediff('2023-04-01','2003-05-15');
案例:
查询所有员工的入职天数,并根据入职天数倒序排序。
思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
# 取q可以更方便地在后面进行倒序处理
select name ,datediff('2023-04-01',entrydate) as 'q' from emp order by q desc;
3.4 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
演示如下:
A. if
select if(true,'ok','no');
#一般ture或false里面放的是条件表达式
#输出结果:ok
B. ifnull
select ifnull('ok','no');
#如果第一个值不为空,则返回第一个值;如果为空,则返回第二个值,即返回默认值
#输出结果:ok
select ifnull(null,'no');
#此时第一个值为空,因此返回第二个值
#输出结果:no
C. case when then else end
需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
select
name,
(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp ;
#case 需要查询的东西 when value1 then value2 ( 意思是把value1归为value2类下)如果想继续加,就在后面继续when——then即可
#如果 北京 的值被找到了l,则返回 一线城市 ,··.否则返回default默认值,即 二线城市
输出结果:
案例:
1、建立新表
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);
2、统计班级各个学员的成绩,显示的规则如下:
>=85 ,显示优秀
>=60,显示及格
其余情况,显示不及格
依据题目需要,代码如下:
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;
#解析:
#如果 math>=85 为true,返回 优秀 ,··.否则返回default默认值,即 不及格