MySQL 视频课 · 50 集 / 内置函数:字符串、数值、日期、流程 / P30

第 30 集 / 共 50 · 内置函数:字符串、数值、日期、流程 · 视频 p=30 · 时长 12:01

P30 30. 基础-函数-流程函数

讲义 3.4 流程函数 p59–61

按主题对应,非逐句切分

来源与核对说明

以同版讲义的公开镜像核对章节与页码(镜像非官方出品);非逐字稿,示例为原创补充。

本页是学习笔记,不等同于视频逐字稿。原声字幕未取得(匿名接口字幕轨为空且需登录,未使用任何账号),也没有逐句讲解记录;讲义只按节与页码对应,切点未逐句确证。

讲义索引:p59–61 · 3.4 流程函数 · 切点 notexact

讲义是第三方公开镜像(95 页 PDF),不是官方原件;这里只用它核对章节顺序与页码,不转载正文。

完整来源说明与变更记录 →

看视频,对照阅读:在新标签打开原视频(p=30) · 先看跟播对照

流程函数让查询结果按条件变形:两选一用 IF,空值兜底用 IFNULL,多档判断用 CASE(等值用简单式,范围用搜索式)。

复习模式:快速跳知识点(详解在下方各节)

复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。

一句话理解

流程函数让一行数据按条件走不同分支:两选一用 IF,空值兜底用 IFNULL,分档用 CASE。

跟播:视频里 ↔ 本站

视频里 / 原课字段本站对应
emp.salary / emp.dept_id / emp.workaddressemployee.salary / employee.dept_id(本站没有 workaddress 列)
IF(value,t,f)、CASE 列 WHEN 值同左,示例换成薪资与部门两列

看视频时以讲义表为准,跟练时用本站表;结构相同、数字不同。

按这 4 步做

  1. IF(条件, 真值, 假值):只做两选一。比如「有没有定薪」——条件成立给一个值,否则给另一个。
  2. IFNULL(值, 兜底值) 只在值为 NULL 时返回兜底;NULLIF(a,b) 在 a 等于 b 时返回 NULL,用来把某个值「变成空」。
  3. CASE 有两种写法:CASE 列 WHEN 值 THEN … 只能做等值分档(列名只写一次);CASE WHEN 条件 THEN … 能写范围和多条件。
  4. 分支顺序很重要:CASE 自上而下,命中即停;范围宽的条件放前面会把后面的分支挡掉,所以先具体后宽泛。

小例

先准备本集练习数据:p30.sql · 练习库说明

SQL 示例
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 变成「普通」——没定薪的人被算成普通,语义就错了。

下面每条只演示一个点,可以单独复制执行。

IF:两选一(有没有定薪)
SELECT id, name,
       IF(salary IS NULL, '未定薪', '已定薪') AS 状态
FROM employee
ORDER BY id;

四行:小林、小周、小陈是「已定薪」,小李是「未定薪」。IF 的三个参数是条件、真值、假值。判断空值必须写 IS NULL;写 salary = NULL 永远不成立,会全部落到假值。

4 行:小林/小周/小陈 已定薪;小李 未定薪

简单 CASE:按列的值等值分档
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 行:研发、研发、市场、未分配

易错点

30 秒速记

IF 两选一;IFNULL 只认 NULL;NULLIF 相等转空;简单 CASE 等值分档、搜索 CASE 条件分档;先具体后宽泛。

自测(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/tendt40 帧为 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(只用于确认画面主题,不作内容边界)
  • 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号

等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。

下载本集 Markdown