函数


函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中


已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那


么,函数到底在哪儿使用呢?


我们先来看两个场景:



        1). 在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能


够看到当前员工入职的天数。 而在数据库中,存储的都是入职日期,如 2000-11-12,那如果快速计


算出天数呢?


        2). 在做报表这类的业务需求中,我们要展示出学员的分数等级分布。而在数据库中,存储的是学生的 分数值,如98/75,如何快速判定分数的等级呢?


其实,上述的这一类的需求呢,我们通过MySQL中的函数都可以很方便的实现 。



MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。



字符串函数


MySQL 中内置了很多字符串函数,常用的几个如下:




mysql 入职日期 往前推月份 mysql查询员工入职天数_sql


 

-- -----------------字符串函数演示------------------------
-- concat 字符串拼接,将S1,S2,...Sn拼接成一个字符串
select concat('Hello', 'MySQL');

-- lower 将字符串str全部转为小写
select lower('Hello');

-- upper 将字符串str全部转为大写
select upper('Hello');

-- lpad 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
select lpad('01', 5, '-');

-- rpad 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
select rpad('01', 5, '-');

-- trim 去掉字符串头部和尾部的空格
select trim(' Hello  MySQL ');

-- substring  返回从字符串str从start位置起的len个长度的字符串
select substring('Hello MySQL', 1, 5);

数值函数


常见的数值函数如下:



mysql 入职日期 往前推月份 mysql查询员工入职天数_字符串_02


具体实现代码 

-- ---------------------数值函数-----------------------
-- ceil 向上取整
select ceil(1.1);


-- floor 向下取整
select floor(1.9);


-- mod 返回x/y的模
select mod(7, 4);


-- rand 返回0~1内的随机数
select rand();


-- round 求参数x的四舍五入的值,保留y为小数
select round(2.34, 2);


-- 案例:通过数据库的函数,生成一个六位数的验证码
select lpad(round(rand() * 1000000, 0), 6, '0');

 

日期函数


常见的日期函数如下:



mysql 入职日期 往前推月份 mysql查询员工入职天数_1024程序员节_03


演示如下 

-- -------------------日期函数----------------
-- curdate()  返回当前日期
select curdate();

-- curtime()  返回当前时间
select curtime();

-- now()  返回当前日期和时间
select now();

-- year(date)  获取指定date的年份
select year(now());

-- month(date)  获取指定date的月份
select month(now());

-- day(date)  获取指定date的日期
select day(now());

-- date_add(date,interval expr type)  返回一个日期/时间值加上一个时间间隔expr后的时间值
select date_add(now(), interval 70 day);

-- datediff(date1,date2)  返回起始时间date1和结束时间date2之间的天数
select datediff('2021-3-06', '2022-11-01');

-- 案例:查询所有员工的入职天数,并根据入职天数倒序排序
select name, datediff(curdate(), entrydate) as 'entrydays'
from emp
order by entrydays desc;

流程函数


流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。


-- ---------------流程函数--------------、
-- if(value,t,f)  如果value为true,则返回t,否则返回f
select if(false, 'ok', 'error');


-- ifnull(value1,value2)  如果value1不为空,返回value1,否则返回value2
select ifnull('ok', 'default');

select ifnull('', 'default');

select ifnull(null, 'default');

-- case when [val1] then [res1]...else[default]end 如果val1为true,返回res1,...否则返回default默认值
-- 需求:查询emp表的员工姓名和工作地址(北京/上海---> 一线城市,其他---> 二线城市)
select name,
       (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;

流程函数用到的数据

-- 准备数据
create table dept
(
    id   int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '部门名称'
) comment '部门表';

create table emp
(
    id          int auto_increment comment 'ID' primary key,
    name        varchar(50) not null comment '姓名',
    age         int comment '年龄',
    job         varchar(20) comment '职位',
    salary      int comment '薪资',
    entrydate   date comment '入职时间',
    managerid   int comment '直属领导ID',
    dept_id     int comment '部门ID',
    workaddress int         not null
) comment '员工表';


-- 添加外键
alter table emp
    add constraint fk_emp_dept_id foreign key (dept_id) references dept (id);

INSERT INTO dept (id, name)
VALUES (1, '研发部'),
       (2, '市场部'),
       (3, '财务部'),
       (4, '销售部'),
       (5, '总经办'),
       (6, '人事部');
INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id)
VALUES (1, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5),

       (2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1),
       (3, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1),
       (4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1),
       (5, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1),
       (6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1),

       (7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3),
       (8, '周芷若', 19, '会计', 48000, '2006-06-02', 7, 3),
       (9, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3),

       (10, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2),
       (11, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2),
       (12, '鹤笔翁', 19, '职员', 3750, '2007-05-09', 10, 2),
       (13, '方东白', 19, '职员', 5500, '2009-02-12', 10, 2),

       (14, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4),
       (15, '俞莲舟', 38, '销售', 4600, '2004-10-12', 14, 4),
       (16, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4),
       (17, '陈友谅', 42, null, 2000, '2011-10-12', 1, null);
update emp
set workno = 01,
    gender ='男'
where id = 1;
update emp
set workno = 02,
    gender ='男'
where id = 2;
update emp
set workno = 03,
    gender ='男'
where id = 3;
update emp
set workno = 04,
    gender ='男'
where id = 4;
update emp
set workno = 05,
    gender ='男'
where id = 5;
update emp
set workno = 06,
    gender ='男'
where id = 6;
update emp
set workno = 07,
    gender ='女'
where id = 7;
update emp
set workno = 08,
    gender ='女'
where id = 8;
update emp
set workno = 09,
    gender ='女'
where id = 9;
update emp
set workno = 10,
    gender ='女'
where id = 10;
update emp
set workno = 11,
    gender ='男'
where id = 11;
update emp
set workno = 12,
    gender ='男'
where id = 12;
update emp
set workno = 13,
    gender ='男'
where id = 13;
update emp
set workno = 14,
    gender ='男'
where id = 14;
update emp
set workno = 15,
    gender ='男'
where id = 15;
update emp
set workno = 16,
    gender ='男'
where id = 16;
update emp
set workno = 17,
    gender ='男'
where id = 17;

update emp
set workaddress='北京'
where id = 1;
update emp
set workaddress='上海'
where id = 2;
update emp
set workaddress='北京'
where id = 3;
update emp
set workaddress='哈尔滨'
where id = 4;
update emp
set workaddress='河南'
where id = 5;
update emp
set workaddress='广州'
where id = 6;
update emp
set workaddress='南京'
where id = 7;
update emp
set workaddress='江苏'
where id = 8;
update emp
set workaddress='深圳'
where id = 9;
update emp
set workaddress='四川'
where id = 10;
update emp
set workaddress='成都'
where id = 11;
update emp
set workaddress='香港'
where id = 12;
update emp
set workaddress='天津'
where id = 13;
update emp
set workaddress='北京'
where id = 14;
update emp
set workaddress='山东'
where id = 15;
update emp
set workaddress='湖南'
where id = 16;
update emp
set workaddress='贵州'
where id = 17;