MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。
3.1 字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
1)concat : 字符串拼接
select concat('Hello','MySQL');
2)lower : 全部转小写
select lower('MySQL');
3)upper : 全部转大写
select upper('MySQL');
4)lpad : 左填充
select lpad('MySQL',10,'-');
5)rpad : 右填充
select rpad('MySQL',10,'-');
6)trim : 去除空格
select trim(' MySQL ');
7)substring : 截取子字符串
select substring('Hello MySQL',1,5);
案例
例:由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001
update emp set workno = lpad(workno,5,'0');
2 数值函数
常见的数值函数如下:1)ceil:向上取整
select ceil(1.1);
2)floor:向下取整
select floor(1.9);
3)mod:取模
select mod(7,4);
4)rand:获取随机数
select rand();
5)round:四舍五入
select round(4.336,2);
案例
例:通过数据库的函数,生成一个六位数的随机验证码。
思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0
select lpad(round( rand()*1000000,0 ), 6, '0');
3 日期函数
常见的日期函数如下:
1)curdate:当前日期
select curdate();
2)curtime:当前时间
select curtime();
3)now:当前日期和时间
select now();
4)YEAR , MONTH , DAY:当前年、月、日
select YEAR(now()); select MONTH(now()); select DAY(now());
5)date_add:增加指定的时间间隔
select date_add('2022-1-1', INTERVAL 5 DAY);
6)datediff:获取两个日期相差的天数
select datediff('2022-1-20','2022-1-1');
案例
例:查询所有员工的入职天数,并根据入职天数倒序排序。
思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
select name,datediff(curdate(), entrydate) as '入职天数' from emp order by entrydate asc;
4 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
1)if
select if(false,'ok','error');
2)ifnull
select ifnull('ok','default'); select ifnull('','default'); select ifnull(null,'default');
3)case when then else end
select name, (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp;
案例
// 准备的数据 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);例:查询学生各个科目成绩的情况,并根据成绩划分等价,>=85为优秀,<60为不及格,>=60&&<85为及格
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;