【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 约束的学习,掌握主键、唯一、非空、外键等约束的用法,保障数据库数据的准确性!


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

相关推荐
倔强的石头_12 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
阿巴斯甜17 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker18 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952719 小时前
Andorid Google 登录接入文档
android
黄林晴20 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android