【MySQL基础篇】盘点MySQL常用四大类函数

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文介绍了MySQL中的四大类常用函数:字符串函数、数值函数、日期函数和流程函数。

MySQL基础篇-函数


学习目标

  • 字符串函数
  • 数值函数
  • 日期函数
  • 流程函数

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么,函数到底在哪儿使用呢?

我们先来看两个场景:

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


一、字符串函数

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

函数

功能

CONCAT(s1, s2, …, sn)

字符串拼接,将s1, s2, …, sn拼接成一个字符串

LOWER(str)

将字符串全部转为小写

UPPER(str)

将字符串全部转为大写

LPAD(str, n, pad)

左填充,用字符串pad对str的左边进行填充,达到n个字符串长度

RPAD(str, n, pad)

右填充,用字符串pad对str的右边进行填充,达到n个字符串长度

TRIM(str)

去掉字符串头部和尾部的空格

SUBSTRING(str, start, len)

返回从字符串str从start位置起的len个长度的字符串

REPLACE(column, source, replace)

替换字符串

使用示例:

A. concat : 字符串拼接

select concat('Hello', ' MySQL');

B. lower : 全部转小写

select lower('Hello');

C. upper : 全部转大写

select upper('Hello');

D. lpad : 左填充

select lpad('01', 5, '-');

E. rpad : 右填充

select rpad('01', 5, '-');

F. trim : 去除空格

select trim(' Hello  MySQL ');

G. substring : 截取子字符串

-- 注意起始截取索引从1开始
select substring('Hello MySQL', 1, 5);

H. replace : 替换字符串

select replace('aaa bbb a ccc', 'a', '666,');

案例:

由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001。

-- 由于业务需求变更,企业员工的工号,统一为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位小数

演示如下:

A. ceil:向上取整

select ceil(1.1);

B. floor:向下取整

select floor(1.9);

C. mod:取模

select mod(6, 4);
-- select 6 mod 4;

D. rand:获取随机数

select rand();  -- 随机生成0~1之间的一个小数

E. round:四舍五入

select round(2.49); -- 不写参数默认四舍五入到整数
select round(2.345, 2); -- round(num, 四舍五入到的位数)

案例:

通过数据库的函数,生成一个六位数的随机验证码。

思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0

-- 随机生成一个6位数字的验证码
select lpad(round(rand() * 1000000, 0), 6, '0');
-- 注意如果不足6位,需要在前面或后面补齐,如0.012345
select round(0.012345 * 1000000);   -- 12345
select substring(concat(rand()), 3, 6);
select substring(rand(), 3, 6);

三、日期函数

常见的日期函数如下:

函数

功能

CURDATE()

返回当前日期

CURTIME()

返回当前时间

NOW()

返回当前日期和时间

YEAR(date)

获取指定date的年份

MONTH(date)

获取指定date的月份

DAY(date)

获取指定date的日期

DATE_ADD(date, INTERVAL expr type)

返回一个日期/时间值加上一个时间间隔expr后的时间值

DATEDIFF(date1, date2)

返回起始时间date1和结束时间date2之间的天数

演示如下:

A. curdate:当前日期

-- 当前日期 2023-01-12
select curdate();
select current_date;

B. curtime:当前时间

-- 当前时间 23:16:09
select curtime();
select current_time;

C. now:当前日期和时间

-- 当前日期和时间
select now();
# 扩展:
-- timestamp类型 2023-01-12 23:13:49
select current_timestamp;
select localtimestamp;
-- 时间戳
select unix_timestamp();

D. YEAR , MONTH , DAY:当前年、月、日

select year(now()) '年', month(now()) '月', day(now()) '日', monthname(now()) '月份名称', dayname(now()) '星期名称';

E. date_add:增加指定类型的时间间隔

-- 增加/减少指定类型的时间间隔
select date_add(now(), INTERVAL 48 HOUR), date_sub(curdate(), INTERVAL 2 DAY);

F. datediff:获取两个日期相差的天数/时间

-- 获取两个日期相差的天数/时间 注意都是前减后date1-date2
select datediff('2023-01-12', '2022-12-12'), timediff('16:30:00', '15:00:01');

案例:

查询所有员工的入职天数,并根据入职天数倒序排序。

思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。

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

四、流程函数

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

函数

功能

IF(value, t, f)

如果value为true,则返回t,否则返回f

IFNULL(value1, value2)

如果value1不为空,返回value1,否则返回value2

CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

如果val1为true,返回res1,… 否则返回default默认值(条件判断三元运算符)

CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

如果expr的值等于val1,返回res1,… 否则返回default默认值(等值判断三元运算符)

演示如下:

A. if

select if(false, 'OK', 'Error');

B. ifnull

select ifnull('OK', 'Default');
select ifnull('', 'Default');
select ifnull(null, 'Default');

C. case when then else end

需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)

-- 类似与switch...case
-- 思路1 case 字段 [when 字段值val1 then 字段值为val1时返回的值]... else 字段值为其他的值时返回的值 end
select
    name,
    workaddress,
    (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;
-- 类似于if... else if...else
-- 思路2 case [when 条件表达式1 then 条件表达式1为true返回的值]... else 所有条件表达式都为false返回的值 end
select
    name,
    workaddress,
    case when workaddress in ('北京', '上海') then '一线城市' else '二线城市' end as '工作地址'
from emp;
-- 思路3 IF:
select name, if(workaddress = '北京' or workaddress = '上海', '一线城市', '二线城市') as '工作地址' from emp;
select name, if(workaddress in ('北京', '上海'), '一线城市', '二线城市') 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);

具体的SQL语句如下:

-- 案例:统计班级各个学员的成绩,展示的规则如下:
-- >= 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;


总结

image.png



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 关系型数据库 MySQL
【MySQL入门到精通-黑马程序员】MySQL基础篇-约束
e.g.:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
61 0
|
2月前
|
存储 关系型数据库 MySQL
【探究Mysql表中的增删查改(进阶篇)】
【探究Mysql表中的增删查改(进阶篇)】
60 7
|
5月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
110 0
|
6月前
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数详解(概念+练习+实战)
MySQL窗口函数详解(概念+练习+实战)
1232 1
|
7月前
|
SQL 关系型数据库 MySQL
|
7月前
|
SQL 关系型数据库 MySQL
Mysql基础第六天,使用Mysql
Mysql基础第六天,使用Mysql
30 0
Mysql基础第六天,使用Mysql
|
7月前
|
存储 SQL 关系型数据库
MySQL基础『数据库基础』
MySQL基础『数据库基础』
92 1
|
7月前
|
SQL 存储 缓存
认真学习MySQL的逻辑架构
认真学习MySQL的逻辑架构
86 0
|
SQL 关系型数据库 MySQL
MySQL高级【多表查询】第九章(上)
MySQL高级【多表查询】第九章
|
SQL 关系型数据库 MySQL
MySQL高级【多表查询】第九章(下)
MySQL高级【多表查询】第九章