MySQL 视频课 · 50 集 / 内置函数:字符串、数值、日期、流程 / P30
第 30 集 / 共 50 · 内置函数:字符串、数值、日期、流程 · 视频 p=30 · 时长 12:01
P30 30. 基础-函数-流程函数
看视频,对照阅读:在新标签打开原视频(p=30) · 先看跟播对照
流程函数让查询结果按条件变形:两选一用 IF,空值兜底用 IFNULL,多档判断用 CASE(等值用简单式,范围用搜索式)。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
流程函数让一行数据按条件走不同分支:两选一用 IF,空值兜底用 IFNULL,分档用 CASE。
跟播:视频里 ↔ 本站
视频演示 IF、IFNULL 与两种 CASE,并用「工作地址分档」做例子。
| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp.salary / emp.dept_id / emp.workaddress | employee.salary / employee.dept_id(本站没有 workaddress 列) |
| IF(value,t,f)、CASE 列 WHEN 值 | 同左,示例换成薪资与部门两列 |
看完应能:能分清 IF 两选一、简单 CASE 等值分档、搜索 CASE 条件分档,并知道 NULL 要用 IS NULL
看视频时以讲义表为准,跟练时用本站表;结构相同、数字不同。
按这 4 步做
- IF(条件, 真值, 假值):只做两选一。比如「有没有定薪」——条件成立给一个值,否则给另一个。
- IFNULL(值, 兜底值) 只在值为 NULL 时返回兜底;NULLIF(a,b) 在 a 等于 b 时返回 NULL,用来把某个值「变成空」。
- CASE 有两种写法:
CASE 列 WHEN 值 THEN …只能做等值分档(列名只写一次);CASE WHEN 条件 THEN …能写范围和多条件。 - 分支顺序很重要:CASE 自上而下,命中即停;范围宽的条件放前面会把后面的分支挡掉,所以先具体后宽泛。
小例
SELECT name,
IFNULL(salary, 0) AS 薪资显示,
CASE WHEN salary IS NULL THEN '未定薪'
WHEN salary >= 10000 THEN '高'
ELSE '普通' END AS 档位
FROM employee
ORDER BY id;
【原创演示】四行练习数据逐行判断:小林 8000 → 普通;小周 10000 → 高;小陈 12000 → 高;小李 salary 为 NULL,IFNULL 显示 0,CASE 第一个分支命中得“未定薪”。结果四行按 id 排列。如果把 CASE 写成 CASE WHEN salary >= 10000 THEN '高' ELSE '普通' END(漏掉 IS NULL 分支),NULL 参与比较得到未知、不成立,就会落到 ELSE 变成「普通」——没定薪的人被算成普通,语义就错了。
下面每条只演示一个点,可以单独复制执行。
SELECT id, name,
IF(salary IS NULL, '未定薪', '已定薪') AS 状态
FROM employee
ORDER BY id;
四行:小林、小周、小陈是「已定薪」,小李是「未定薪」。IF 的三个参数是条件、真值、假值。判断空值必须写 IS NULL;写 salary = NULL 永远不成立,会全部落到假值。
4 行:小林/小周/小陈 已定薪;小李 未定薪
SELECT id, name,
CASE dept_id
WHEN 1 THEN '研发'
WHEN 2 THEN '市场'
ELSE '未分配'
END AS 部门
FROM employee
ORDER BY id;
四行:小林、小周「研发」,小陈「市场」,小李「未分配」(dept_id 是 NULL,两个 WHEN 都不等于)。简单 CASE 把列名写在 CASE 后面只写一次,后面只写要比较的值;它只能做等值判断,要写「salary >= 10000」这种范围就得换成搜索式 CASE WHEN 条件。
4 行:研发、研发、市场、未分配
易错点
- 以为 IFNULL 也能处理空字符串:'' 不是 NULL,会原样返回,兜底不生效。
- 在 CASE 里写 salary = NULL 判断空值:与 NULL 比较得到未知,永远不成立,必须用 IS NULL。
- 把简单 CASE 当成万能:
CASE dept_id WHEN 1只能比值,写WHEN salary > 10000会变成「salary 是否等于 10000 的布尔值」,结果不对。
30 秒速记
自测(2 题,先答再展开)
自测 1:IFNULL(salary,0) 会不会把薪资为 0 的人也显示成 0?
会显示 0,但那本来就是 0;它的问题是无法区分“原本是 0”和“原本是 NULL”,需要区分时用 CASE 单独判断 IS NULL。
自测 2:CASE 的分支顺序为什么会影响结果?
CASE 一旦命中就停止判断,范围宽的条件放前面会截走本应属于后面分支的行,所以更具体的条件要写在前面。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P30 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P30;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | t40 帧为 IFNULL 演示代码与 CASE 注释。 |
| MySQL 8.0 Reference:流程控制函数 | 官方文档 | 核对 IFNULL/NULLIF/CASE 的返回值规则,未逐字引用。 |
按 t40 帧核对:画面是 Workbench 里 IFNULL 的演示(对 'OK'、''、NULL 三种入参分别调用),并出现「case when then else end」的注释与地址分档需求;讲义 p59「3.4 流程函数」表格四行正是 IF / IFNULL / CASE WHEN 条件 / CASE 表达式 WHEN 值。正文示例为原创,使用自己的练习表,未照抄课堂表与数据;原声字幕未取得,讲师结论未核实。
讲义对照:讲义 3.4 流程函数 · p59–61(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–11:47 / 全片 12:01(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。