【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇

在上一篇中,我们学习了字符串和数值函数,今天继续讲解 日期函数流程控制函数 ------ 日期函数用于处理时间相关数据(如计算入学天数、提取年月),流程控制函数则能实现 SQL 中的 "条件判断",让数据处理更灵活。所有案例仍基于 sicheng 数据库的 student 表。


目录

一、日期函数:处理时间数据的核心工具

[1. 常用日期函数汇总](#1. 常用日期函数汇总)

[2. 实战案例(基于学生表)](#2. 实战案例(基于学生表))

[3. 日期函数易错点](#3. 日期函数易错点)

[二、流程控制函数:SQL 中的 "条件判断"](#二、流程控制函数:SQL 中的 “条件判断”)

[1. 常用流程控制函数汇总](#1. 常用流程控制函数汇总)

[(1)IF 函数:简单条件判断](#(1)IF 函数:简单条件判断)

[(2)IFNULL 函数:空值处理](#(2)IFNULL 函数:空值处理)

[(3)CASE 函数:多条件分支](#(3)CASE 函数:多条件分支)

[写法 1:值匹配(类似 switch)](#写法 1:值匹配(类似 switch))

[写法 2:条件匹配(类似 if-else if)](#写法 2:条件匹配(类似 if-else if))

[2. 流程控制函数实战案例](#2. 流程控制函数实战案例)

[3. 流程控制函数易错点](#3. 流程控制函数易错点)

[三、MySQL 函数整体总结](#三、MySQL 函数整体总结)

[四、预告:MySQL 约束与多表查询](#四、预告:MySQL 约束与多表查询)


一、日期函数:处理时间数据的核心工具

MySQL 中的日期函数可用于获取当前时间、计算日期差、增减时间间隔等,常用在统计报表、时效判断等场景。

1. 常用日期函数汇总

函数 功能 语法示例 结果(示例)
CURDATE() / CURRENT_DATE() 获取当前日期(YYYY-MM-DD) CURDATE() 2025-12-10
CURTIME() / CURRENT_TIME() 获取当前时间(HH:MM:SS) CURTIME() 15:30:45
NOW() 获取当前日期 + 时间(YYYY-MM-DD HH:MM:SS) NOW() 2025-12-10 15:30:45
YEAR(date) / MONTH(date) / DAY(date) 提取日期中的年 / 月 / 日 YEAR('2025-12-10') 2025
DATE_ADD(date, INTERVAL num unit) 给日期添加时间间隔(unit:DAY/MONTH/YEAR) DATE_ADD('2025-12-10', INTERVAL 1 MONTH) 2026-01-10
DATEDIFF(date1, date2) 计算日期差(date1 - date2,单位:天) DATEDIFF('2025-12-10', '2025-09-01') 100

2. 实战案例(基于学生表)

对数据经行修改与补充:

sql 复制代码
alter table student add column entry_date date comment '入学日期';  


truncate table student;

insert into student values
(1, '张三', 16, '男', '高一(1)班', 85.5, '西安市雁塔区', '2025-09-01'),
(2, '李四', 17, '男', '高一(2)班', 92.0, '西安市未央区', '2025-08-15'),
(3, '王五', 16, '女', '高一(1)班', 78.5, '宝鸡市渭滨区', '2025-09-01'),
(4, '赵六', 18, '男', '高一(2)班', 88.0, '西安市莲湖区', '2025-07-01'),
(5, '孙七', 17, '女', '高一(1)班', 90.0, '西安市碑林区', '2025-08-20'),
(6, '周八', 16, '男', '高一(3)班', 76.0, NULL, '2025-09-01'),  -- 地址为NULL
(7, '吴九', 18, '女', '高一(3)班', 89.5, '西安市雁塔区', '2025-06-10'),
(8, '郑十', 17, '男', '高一(2)班', 81.0, '咸阳市秦都区', '2025-08-15'),
(9, '钱十一', 16, '女', '高一(3)班', 95.0, '西安市碑林区', '2025-07-20'),
(10, '孙十二', 18, '男', '高一(1)班', 58.0, '西安市未央区', '2025-09-01'); 

案例 1:计算学生入学天数

需求:假设学生表有 entry_date 字段(入学日期,如 '2025-09-01'),计算每个学生的入学天数。

sql 复制代码
select name ,datediff(curdate(),entry_data) 入学天数 from student order by 入学天数 desc;

原理:DATEDIFF(当前日期, 入学日期) 得到两个日期的差值(天数),结果越大表示入学越早。

案例 2:提取入学年份和月份

需求:统计每个入学年份的学生人数。

sql 复制代码
select year(entry_date) 入学年份,count(id) 学生人数
from student
group by 入学年份;

执行结果:2025 年 → 10 人(假设所有学生都是 2025 年入学)。

案例 3:计算学生的预计毕业日期

需求:假设学制为 3 年,计算每个学生的预计毕业日期(入学日期 + 3 年)。

sql 复制代码
select name,entry_date,data_add(entry_date,interval 3 year) 预计毕业日期
from student;

执行结果:入学日期 '2025-09-01' → 毕业日期 '2028-09-01'。

3. 日期函数易错点

  • DATEDIFF(date1, date2) 的参数顺序:结果为 date1 - date2,若 date1 < date2,结果为负数;
  • DATE_ADD 的时间单位(unit)需小写(如 daymonthyear),不能写错;
  • NOW() 包含日期和时间,CURDATE() 仅包含日期,按需选择。

二、流程控制函数:SQL 中的 "条件判断"

流程控制函数能在 SQL 中实现类似编程语言的 if-elseswitch 逻辑,用于动态处理数据(如成绩分级、地址分类)。

1. 常用流程控制函数汇总

(1)IF 函数:简单条件判断

语法:IF(value, t, f)

  • 功能:若 value 为真(非 0、非 NULL),返回 t;否则返回 f

  • 示例:

    sql 复制代码
    -- 判断成绩是否及格(≥60分为及格)
    select name,score,if(scoer >= 60,'及格','不及格') 成绩等级 from student;

(2)IFNULL 函数:空值处理

语法:IFNULL(value1, value2)

  • 功能:若 value1 不为 NULL,返回 value1;否则返回 value2

  • 示例:

    sql 复制代码
    -- 若家庭地址为空,显示"未填写"
    select name,ifnull(address,'未填写') 家庭住址 from student;

    注意:空字符串(' ')≠ NULL,IFNULL 不会替换空字符串。

(3)CASE 函数:多条件分支

CASE 函数有两种写法,适用于复杂条件判断:

写法 1:值匹配(类似 switch)
sql 复制代码
CASE expr 
    WHEN val1 THEN res1 
    WHEN val2 THEN res2 
    ... 
    ELSE default 
END

示例:按班级分类(高一 (1) 班→一班,高一 (2) 班→二班,其他→其他班级):

sql 复制代码
select name,class.
    case class
        when '高一(1)班' then '一班'
        when '高一(2)班' then '二班'
        else '其他班'
    end 班级简称
from student
 
写法 2:条件匹配(类似 if-else if)
sql 复制代码
CASE 
    WHEN cond1 THEN res1 
    WHEN cond2 THEN res2 
    ... 
    ELSE default 
END

示例:成绩分级(≥90→优秀,≥80→良好,≥60→及格,<60→不及格):

sql 复制代码
select
    name,
    score,
    case
        when score >=90 then '优秀'
        when score >=80 then '良好'
        when score >=60 then '及格'
        else '不及格'
    end 成绩等级
from student;

2. 流程控制函数实战案例

案例 1:学生地址分类

需求:将学生家庭地址分为 "一线城市"(西安市)和 "其他城市"(非西安市)。

sql 复制代码
select name,address,if(substring(address,1,3)  = '西安市','一线城市','其他城市')
from student;

select name,address,
       case
           when address like '西安市%' then '一线城市'
           else '其他城市'
       end 城市等级
from student;

原理:用 LIKE '西安市%' 匹配以 "西安市" 开头的地址,结合 CASE 函数分类。

案例 2:综合判断学生状态

需求:根据成绩和入学天数判断学生状态:

  • 成绩≥90 且 入学天数≥100 → "优秀老生";
  • 成绩≥90 且 入学天数 <100 → "优秀新生";
  • 成绩 <60 → "需补考";
  • 其他 → "正常"。
sql 复制代码
select name,score, datediff(curdate(),entry_date)入学天数,
    case
        when score >=90 then if(datediff(curdate() >= 100,entry_date),'优秀老生','优秀新生')
        when score >= 60 then '正常'
        else '需补考'
    end 学生评级
from student

3. 流程控制函数易错点

  • CASE 函数必须以 END 结尾,否则语法报错;
  • 多条件判断时,WHEN 子句按顺序执行,满足第一个条件后不再判断后续条件;
  • IF 函数只能处理二元判断,复杂条件优先用 CASE 函数。

三、MySQL 函数整体总结

函数类型 核心函数 典型应用场景
字符串函数 CONCAT、LPAD、SUBSTRING、TRIM 拼接信息、标准化编号、截取字符
数值函数 ROUND、RAND、MOD、CEIL 成绩四舍五入、生成随机数、分组取模
日期函数 DATEDIFF、DATE_ADD、YEAR、NOW 计算入学天数、统计入学年份、预计毕业日期
流程控制函数 IF、IFNULL、CASE 成绩分级、空值替换、多条件分类

四、预告:MySQL 约束与多表查询

至此,我们已经掌握了 MySQL 常用函数的用法,函数能帮我们高效处理单表数据,但实际业务中还会遇到:

  • 如何保证数据的完整性(如学号不能重复、成绩不能为负数)?→ 需要学习 MySQL 约束
  • 如何关联多张表查询数据(如学生表 + 成绩表 + 班级表)?→ 需要学习 多表查询

下一篇我们将进入 MySQL 约束的学习,掌握主键、唯一、非空、外键等约束的用法,保障数据库数据的准确性!


希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!

相关推荐
知识分享小能手2 小时前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 中 Linux C 编程 —语法详解与实战案例(13)
linux·学习·centos
九章-2 小时前
教育信创落地新实践:三亚技师学院完成教育平台数据库国产化,打造职业院校自主可控轻量级样板
数据库·安全
码河漫步2 小时前
win11下mysql数据库设置主从
数据库·mysql
brave_zhao2 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34162 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
中屹指纹浏览器2 小时前
2025技术干货:国内静态 IP 搭配指纹浏览器的加密绑定与跨区域优化方案
经验分享·笔记
Ccjf酷儿3 小时前
操作系统 李治军 4 设备驱动与文件系统
笔记
自在极意功。3 小时前
InnoDB 存储引擎的逻辑存储结构深度解析
mysql·innodb·b+树·索引
刘洋浪子3 小时前
Git命令学习
git·学习·elasticsearch