数据库(MySQL)—— 函数
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
我们今天来看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个长度的字符串 |
我们举一些例子:
concat
: 字符串拼接
select concat('Hello' , ' MyLove');
lower
: 全部转小写
select lower('Hello');
upper
: 全部转大写
select upper('Hello');
lpad
: 左填充
select lpad('01', 5, '-');
rpad
: 右填充
select rpad('01', 5, '-');
trim
: 去除空格
select trim(' Hello MySQL ');
substring
: 截取子字符串
select substring('Hello MySQL',1,5);
我们拿以前的emp表举个例子:
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001。
update emp set workno = lpad(workno, 5, '0');
数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x, y) | 返回x除以y的余数(模) |
RAND() | 生成一个0到1之间的随机数 |
ROUND(x, y) | 对x进行四舍五入,保留到小数点后y位 |
举几个例子:
ceil
:向上取整
select ceil(1.1);
floor
:向下取整
select floor(1.9);
mod
:取模
select mod(7,4);
rand
:获取随机数
select rand();
round
:四舍五入
select round(2.344,2);
比如我们想生成一个六位数的验证码:
select lpad(round(rand()*1000000 , 0), 6, '0');
日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定日期的年份 |
MONTH(date) | 获取指定日期的月份 |
DAY(date) | 获取指定日期的日 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上特定时间间隔后的日期/时间值 |
DATEDIFF(date1, date2) | 返回date1和date2之间的时间差,单位为天 |
curdate
:当前日期
curtime
:当前时间
select curtime(); 1
now
:当前日期和时间
select now();
YEAR , MONTH , DAY
:当前年、月、日
date_add
:增加指定的时间间隔
select date_add(now(), INTERVAL 70 YEAR );
datediff
:获取两个日期相差的天数
select datediff('2023-10-01', '2022-12-01');
比如:查询所有员工的入职天数,并根据入职天数倒序排序。
-- 入职天数
select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays desc;
流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率:
函数 | 功能 |
---|---|
IF(value, t, f) | 如果value为真,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1非空,则返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1] … ELSE [default] END | 如果val1为真,则返回res1,… 否则返回default默认值 |
CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END | 如果expr的值等于val1,则返回res1,… 否则返回default默认值 |
if
select if(false, 'Ok', 'Error');
ifnull
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
这里注意,这里的空指的是null,不是指一个空字符,或者空字符串,所以第二条select会返回 ’ '。
case when then else end
查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市
select name ,(case workaddress when '北京' then '一线城市'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);
我们要分别查询他们每科的成绩,并根据他们的成绩来划分成绩等级(优秀,及格,不及格)
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;