SQL 函数

本文详细介绍了MySQL中的四种主要函数类型:字符串处理、数值计算、日期时间操作以及流程控制。涵盖了函数如CONCAT、LOWER、UPPER等及其在实际业务场景中的应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

        函数是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在 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 个长度的字符串

2.1 concat 字符串拼接

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

2.2 lower 全部转小写

select lower('Hello');

2.3 upper 全部转大写

select upper('Hello');

2.4 lpad 左填充

-- 对于第一个参数 str 来说,如果长度没有达到 5 位,那么向左补充第三个参数 - ,最终达到 5 位
select lpad('str',5,'-');

2.5 rpad 右填充

-- 对于第一个参数 str 来说,如果长度没有达到 5 位,那么向右补充第三个参数 - ,最终达到 5 位
select rpad('str',5,'-');

2.6 trim 去除空格

-- 只去除左边和右边的空格,中间的空格不去除
select trim(' Hello MySQL ');

2.7 substring 截取字符串

-- 下标从 1 开始,截取第一个参数,从 下标1开始截取,截取5位,返回截取后的字符串
select substring('Hello MySQL',1,5);

2.8 案例

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

3.1 ceil 向上取整

select ceil(1.1);

3.2 floor 向下取整

select floor(1.9);

3.3 mod 取模

-- 取模就是取余数,7 除以 4 的余数为 3 
select mod(7,4);

3.4 rand 取随机数

-- 产生一个 0 到 1 之间的随机数
select rand();

3.5 round 四舍五入

-- 对 2.344 进行四舍五入并保存 2 位小数
select round(2.344,2);

3.6 案例

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

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

select LPAD(round(rand()*1000000,0),6,'0')

四、日期函数

        常见的日期函数如下:

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定 date 的年份
MONTH(date)获取指定 date 的月份
DAY(date)获取指定 date 的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔 expr 后的时间值
DATEDIFF(date1,date2)返回起始时间 date1 和 结束时间 date2 之间的天数

4.1 curdate 当前日期

select curdate();

4.2 curtime 当前时间

select curtime();

4.3 now 当前日期和时间

select now();

4.4 year 当前年

select YEAR(now());

4.5 month 当前月

select MONTH(now());

4.6 day 当前日

select DAY(now());

4.7 date_add 增加指定时间间隔

-- 对当前时间向后加 70 年
select date_add(now(), INTERVAL 70 YEAR );

-- 对当前时间向后加 70 月
select date_add(now(), INTERVAL 70 MONTH);

-- 对当前时间向后加 70 天
select date_add(now(), INTERVAL 70 DAY );

4.8 datediff 获取两个日期时间差

-- 前面的日期减去后面的日期
select datediff('2021-10-01', '2021-12-01');

4.9 案例

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

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

select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays 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 默认值

5.1 if 是否判断

-- 如果第一个参数是 true,则返回第二个参数,否则返回第三个参数
select if(false, 'Ok', 'Error');

5.2 ifnull 空否判断

-- 如果第一个参数不为空,则返回第一个参数,如果第一个参数为 null,则返回第二个参数
select ifnull('Ok','Default');

-- '' 不认为是 null
select ifnull('','Default');

-- 只有 null 才会被认为是 null
select ifnull(null,'Default');

5.3 case when then else end

        查询 emp 表的员工姓名和工作地址,如果工作地址是北京或上海的,则显示为一线城市,其他的则显示为二线城市。

select name,(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址'  from emp;

5.4 案例

        统计班级各个学员的成绩,展示的规则如下:>=85,展示优秀。>=60,展示及格。否则,展示不及格。

        建表插入数据语句如下:

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
	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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的小三菊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值