一、MySQL基础
在数据库操作中,函数是SQL的"魔法棒"------它能将复杂操作简化为一行代码,让数据处理变得既高效又优雅。无论是处理字符串、进行数学计算、管理日期时间,还是实现逻辑控制,MySQL的内置函数都能让你事半功倍。
1. 函数
1.1 为什么需要函数?------SQL的"加速器"
函数是MySQL中预定义的、可重复调用的程序代码,它能:
✅ 简化复杂逻辑 :用一行代码完成多个步骤
✅ 提升查询效率 :减少应用层处理压力
✅ 增强代码可读性 :让SQL语句更直观易懂
✅ 优化数据处理:在数据库层面完成数据转换
💡 重要提示:在WHERE条件中使用函数可能影响性能(导致索引失效),请谨慎使用。

1.1 字符串函数
字符串函数是处理文本数据的利器,从拼接到格式化,无所不能。这里说明一些常用的字符串函数。

sql
-- ------------------- 函数演示 ----------------------
-- concat字符串拼接
SELECT concat('Hello','MySQL');
-- 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);
1.2 数值函数
数值函数让数据库成为强大的计算工具,无需应用层处理。

sql
-- 数值函数
-- ceil向上取整
select ceil(1.5);
-- floor向下取整
select floor(1.5);
-- mod求模
select mod(3,4);
-- rand求随机数,(0-1)之间
select rand();
-- round四舍五入,参数1:操作数,参数二:保留几位小数
select round(2.34,2);
select round(3.34,1);
-- 案例练习2
-- 2. 通过数据库的函数,生成一个六位数的随机验证码
-- 通过rand()*一百王就可以得到一个六位数的整数的数字
-- lpad 参数1:操作数; 参数2:补零至多少位; 参数三: 补什么数据
select lpad(rand(rand()*1000000,0),6,'0') ;
-- 通过向上取整就可以得到一个完整的六位数
-- 但是这里会有一个bug,当随机生成的小数为0.012312,此时*一百万只能得到一个五位数
-- 补零即可
1.3 日期函数
日期函数是数据分析和报表生成的核心,让时间处理变得简单。

sql
-- 日期函数
-- curdate()当前日期
select curdate();
-- curtime()当前时间
select curtime();
-- now()当前的时间和日期
select now();
-- YEAR MONTH DAT 分别获取年月日
select YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
-- date_add 想获取距离x当前日期多少天的函数
-- 月、年只需要修改DAY的参数成MONTH YEAR即可
-- INTERVAL固定格式,70为变量参数
select date_add(now(),INTERVAL 70 DAY);
-- datediff 两个指定时间相隔多少天
-- 是参数1 - 参数2的执行流程
select datediff('2021-12-01','2025-12-27');
-- 案列练习3
-- 查询所有员工的入职天数,并根据入职天数进行倒序
-- curdate():当前的时间、entrydate员工入职的时间
-- as 起别名 order by xxx desc 进行倒序
select name,datediff(curdate(),entrydate) as 'entrtDays' from emp order by entrtDays desc;
1.4 流程函数
流程控制函数让SQL具备条件判断能力,实现更复杂的逻辑。

sql
-- 流程控制函数
-- if判断表达式的结果
-- 如果参数一为true 返回OK 否则返回Error
select if(true,'OK','Error');
-- ifnull判断某一个值是否为空
-- 会判断第一参数是否空,不为空返回该参数,为空返回参数二
select ifnull('OK','Default');
-- 注意空字符串会返回空字符串
select ifnull('','Default');
-- NULL则返回设置的默认参数二
select ifnull(NULL,'Default');
-- case when then else end
-- 需求: 查询emp表的员工姓名和工作地址(北京/上海/广州/洛杉矶------>一线城市,其他城市------->二线城市)
select
name,
(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' when '广州' then '一线城市' when '洛杉矶' then '一线城市' else '二线城市' end) as '工作地址'
from emp;

sql
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',66,77,88),
(3,'LiHua',89,96,92);
--
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) '英语',
(case when chinese >= 85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) '语文'
from score;
MySQL函数是数据处理的"瑞士军刀",掌握它们能让你的SQL查询:
✅ 更简洁 :用一行代码完成复杂操作
✅ 更高效 :减少应用层处理,提升性能
✅ 更专业:让SQL代码更具可读性和可维护性
