MySQL 视频课 · 50 集 / 组
内置函数:字符串、数值、日期、流程
P27–P31 · 共 5 集 · 每集独立 anchor,可直接从目录跳到本页某一集
视频 p=27 · 时长 15:09
P27 27. 基础-函数-字符串函数
原视频:在 B 站新标签打开(p=27) · 单独打开这一集 →
看视频,对照阅读:在新标签打开原视频(p=27) · 先看跟播对照
字符串函数是函数章的起点。这一集最该带走的一条:把函数写在列上,直接改表里的数据。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
字符串函数把文本当材料加工;最常用的是补位——工号不足 5 位就在左边补 0。
跟播:视频里 ↔ 本站
视频先过七个字符串函数,最后给「工号统一 5 位、不足补 0」的练习页。
| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp.workno(讲义的员工工号列) | employee.workno(本站练习表新增的一列) |
| update emp set workno = lpad(workno, 5, '0') | update employee set workno = lpad(workno, 5, '0')(同一写法) |
看完应能:能先 SELECT 预览、再 UPDATE,并说清 LPAD 三个参数各是什么
看视频时以讲义表为准,跟练时用本站表;结构相同、数字不同。
按这 4 步做
- 补位:LPAD(原串, 目标总长度, 填充串) 在左边补到指定长度,RPAD 在右边补。三个参数各管一件事:处理谁、最终几位、用什么补。
- 先预览再改:
SELECT workno, LPAD(workno, 5, '0')看结果对不对,再写UPDATE … SET workno = LPAD(workno, 5, '0'),最后回读确认。 - 拼接与大小写:CONCAT(a,b) 连接字符串,LOWER/UPPER 统一大小写;清理用 TRIM 去首尾空格,截取用 SUBSTRING(串, 起始位置, 长度),位置从 1 起。
- 数字符还是数字节:CHAR_LENGTH 数「字」,LENGTH 数「字节」,中文在 utf8mb4 下占 3 字节。
小例
-- 表:employee(id, name, workno),工号现在是 '7'、'12'、'345'
-- 建表与插入见本页练习脚本 p27.sql(独立练习库 mysqlnotes_p27)
-- 第 1 步:先预览,不改数据。LPAD(原串, 目标总长度, 填充串)
SELECT id, workno, LPAD(workno, 5, '0') AS 补齐后
FROM employee
ORDER BY id;
-- 第 2 步:确认预览对了,再把函数写进 UPDATE 的列位置
UPDATE employee
SET workno = LPAD(workno, 5, '0');
-- 第 3 步:回读,确认列真的改了
SELECT id, workno FROM employee ORDER BY id;
第 1 步结果三行:00007、00012、00345。三个参数分别是:要处理的字符串(这里是列 workno)、目标总长度 5、左边填充的字符 '0'。它保证「最终长度是 5」,所以比 5 位长的工号会被截断(LPAD('1234567',5,'0') 得 '12345'),不是只补不截。第 2 步影响 3 行——函数套在列上会对每一行各算一次;改之前先 SELECT 预览,是因为 UPDATE 写错要再改回来。第 3 步回读应看到 00007、00012、00345。
下面每条只演示一个点,可以单独复制执行。
SELECT LPAD('7', 5, '0') AS 补零, LPAD('1234567', 5, '0') AS 太长被截断;
一行:00007、12345。目标长度是硬指标——短了补、长了截,所以别把它当「只追加」。
00007、12345
其他函数速查(不用背,用时查)
| 函数 | 做什么 | 一句话例子 |
|---|---|---|
CONCAT(s1, s2, …) | 拼接成一个字符串 | CONCAT('emp-', '007') → emp-007 |
LOWER / UPPER | 转小写 / 大写 | UPPER('mysql') → MYSQL |
RPAD(s, n, pad) | 右侧填充到 n 个字符 | RPAD('7', 3, '-') → 7-- |
TRIM(s) | 去掉首尾空格 | TRIM(' mysql ') → mysql |
SUBSTRING(s, start, len) | 从第 start 位取 len 个字符(从 1 起) | SUBSTRING('mysql', 2, 3) → ysq |
CHAR_LENGTH / LENGTH | 字符数 / 字节数 | CHAR_LENGTH('数据库')=3,LENGTH('数据库')=9 |
易错点
- 用 LENGTH 判断字符数:中文一个字多个字节,LENGTH('数据库')=9 而字符数是 3,长度校验会误判。
- 以为 LPAD 只会补:目标长度比原串短时它会截断,LPAD('abcdef',3,'0') 得 'abc'。
- SUBSTRING 起始位置写 0 以为从第一个字符开始:MySQL 位置从 1 计,写 0 得到空串。
- 不预览直接 UPDATE:改错要再写一条 UPDATE 改回来,先 SELECT 一遍成本更低。
30 秒速记
自测(2 题,先答再展开)
自测 1:为什么校验“姓名不超过 10 个字”要用 CHAR_LENGTH 而不是 LENGTH?
LENGTH 返回字节数,utf8mb4 下一个汉字 3 字节,10 个汉字会被算成 30,校验立刻误判;CHAR_LENGTH 才是字符个数。
自测 2:LPAD('7',3,'0') 和 LPAD('1234',3,'0') 分别得到什么?为什么?
'007' 和 '123'。LPAD 的目标是“最终长度为 3”,不足就补、超出就截断,它不保证只在左侧追加。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P27 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P27;采样静帧 t012/t20/t30/t80/tend | t30 为“字符串函数”页,t80 为工号补 0 的练习页。 |
| MySQL 8.0 Reference:字符串函数 | 官方文档 | 核对 LPAD/SUBSTRING/CHAR_LENGTH 与 LENGTH 的差异,未逐字引用。 |
按 t30 帧核对:画面为「字符串函数」章节页;t80 帧是练习页,题干要求把员工工号统一成 5 位、不足补 0(示例 1 号写成 00001),与讲义 p56 案例的 update emp set workno = lpad(workno, 5, '0') 对应。函数清单另由 P31 小结页与讲义 p55 表格(CONCAT、LOWER、UPPER、LPAD、RPAD、TRIM、SUBSTRING)核对。原声字幕未取得,讲师逐条演示与结果未核实;正文示例与数字为原创,并在 MySQL 8.0.46 实跑核对。
讲义对照:讲义 3.1 字符串函数 · p54–56(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–14:56 / 全片 15:09(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。
视频 p=28 · 时长 9:16
P28 28. 基础-函数-数值函数
原视频:在 B 站新标签打开(p=28) · 单独打开这一集 →
看视频,对照阅读:在新标签打开原视频(p=28)
数值函数不多,但取整方向、精度和“金额别用浮点”这几点必须记牢。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
数值函数对数字做取整、取余、四舍五入这类加工,常用来把计算结果修成想要的精度。
按这 4 步做
- 向上 / 向下取整:CEIL(1.2)=2,FLOOR(1.9)=1;注意负数时方向是“往大 / 往小”。
- 取余:MOD(7,3)=1,等价于 7 % 3。
- 四舍五入到指定位数:ROUND(值, 小数位数),省略位数就取整。
- 随机数:RAND() 返回 0 到 1 之间的小数。讲义 p57 的六位验证码就是三步组合:RAND 取随机 → 乘 1000000 再 ROUND 取整 → LPAD 补到 6 位。
小例
SELECT CEIL(1.2) AS 上取整,
FLOOR(1.9) AS 下取整,
MOD(7, 3) AS 余数,
ROUND(3.14159, 2) AS 两位小数,
ROUND(2.5) AS 取整;
【原创演示】全部是对常量的计算,不依赖任何表。结果一行:2、1、1、3.14、3。ROUND(2.5) 得 3,说明它按“远离 0”的方向处理 .5,而不是银行家舍入。
易错点
- 以为负数取整方向不变:CEIL(-1.2) 得 -1、FLOOR(-1.2) 得 -2,方向是“往大 / 往小”,不是“去掉小数”。
- 拿 ROUND 处理金额:浮点数只是近似值,ROUND(2.675,2) 可能得到 2.67;金额用 DECIMAL 存、按分计算。
- 在 WHERE 里对列套 ROUND 再比较:条件变成逐行现算,和直接比较原值不等价,边界行容易漏。
30 秒速记
自测(2 题,先答再展开)
自测 1:ROUND(2.5) 为什么是 3 而不是 2?
MySQL 对 .5 采用远离 0 的方向取整,2.5 进到 3;负数的 -2.5 会得到 -3。
自测 2:为什么金额不建议用 ROUND 直接处理浮点列?
浮点列存的是近似值,参与运算后可能与看上去的值略有偏差,四舍五入结果会出乎意料;用 DECIMAL 精确存再算才可控。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P28 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P28;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | 采样帧多为代码区,函数清单页未取得。 |
| MySQL 8.0 Reference:数值函数 | 官方文档 | 核对 CEIL/FLOOR/MOD/ROUND/RAND 的返回值,未逐字引用。 |
P28 标题为“数值函数”。采样帧多为代码区,未取得函数清单页;函数名与示例来自 P31 小结页(CEIL、FLOOR、MOD、RAND、ROUND)与 MySQL 8.0 数值函数文档对照,正文示例为原创,讲师演示与结果未核实;无字幕。
讲义对照:讲义 3.2 数值函数 · p56–57(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–9:03 / 全片 9:16(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。
视频 p=29 · 时长 9:27
P29 29. 基础-函数-日期函数
原视频:在 B 站新标签打开(p=29) · 单独打开这一集 →
看视频,对照阅读:在新标签打开原视频(p=29)
日期函数最容易错在“差几天”和“差几岁”的区分上。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
日期函数用来取当前时间、拆出年月日、做日期加减,以及算两个日期差多少天。
按这 4 步做
- 取当前:CURDATE() 只要日期,CURTIME() 只要时间,NOW() 日期时间都要。
- 拆字段:YEAR / MONTH / DAY 从日期里取出对应部分。
- 加减:DATE_ADD(日期, INTERVAL n DAY),单位可换成 MONTH、YEAR。
- 算差:DATEDIFF(d1,d2) 得 d1−d2 的天数;算整年数用 TIMESTAMPDIFF(YEAR, 起始, 结束)。
小例
SELECT DATEDIFF('2026-10-22', '2026-10-01') AS 相差天数,
TIMESTAMPDIFF(YEAR, '2004-12-31', '2026-10-22') AS 周岁,
YEAR('2004-12-31') AS 出生年,
DATE_ADD('2026-10-22', INTERVAL 7 DAY) AS 一周后;
【原创演示】全部用固定日期字面量,不写 NOW(),所以每次结果都一样。差值 21 天;2004-12-31 出生到 2026-10-22 还没过生日,周岁是 21,而 2026−2004=22 只是年份相减;一周后是 2026-10-29。
易错点
- 用 YEAR(今天) − YEAR(生日) 当年龄:没过生日的人会被多算一岁,差一天就错。
- DATEDIFF 参数顺序记反:DATEDIFF(a,b) 是 a−b,反过来符号相反。
- 在示例和测试里写 NOW():每次运行结果都变,断言无法复现;固定日期字面量才能稳定对比。
30 秒速记
自测(2 题,先答再展开)
自测 1:为什么算年龄不能用 YEAR(CURDATE()) − YEAR(birthday)?
它只比较年份,忽略今年生日是否已过;应使用 TIMESTAMPDIFF(YEAR, birthday, CURDATE()),它按完整年数计算。
自测 2:DATEDIFF('2026-10-01','2026-10-22') 是正还是负?
负。函数是前一个日期减后一个日期,10-01 减 10-22 得 −21。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P29 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P29;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | t012/t040 为“日期函数”标题页。 |
| MySQL 8.0 Reference:日期与时间函数 | 官方文档 | 核对 DATEDIFF、TIMESTAMPDIFF、DATE_ADD 的语义,未逐字引用。 |
按 t012/t040 帧核对:画面标题为“日期函数”,其余帧是代码区,未取得完整函数表。函数名另由 P31 小结页(CURDATE、CURTIME、NOW、YEAR、MONTH、DAY、DATE_ADD、DATEDIFF)核对;TIMESTAMPDIFF 属文档补充,正文已单独说明用途。示例为原创且使用固定日期;无字幕。
讲义对照:讲义 3.3 日期函数 · p58–59(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–9:14 / 全片 9:27(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。
视频 p=30 · 时长 12:01
P30 30. 基础-函数-流程函数
原视频:在 B 站新标签打开(p=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(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。
视频 p=31 · 时长 3:38
P31 31. 基础-函数-小结
原视频:在 B 站新标签打开(p=31) · 单独打开这一集 →
看视频,对照阅读:在新标签打开原视频(p=31)
函数章收尾:四类函数的清单式回忆。
这一集在讲什么
函数小结把四类常用函数列成一张清单:字符串、数值、日期、流程;按“参数顺序 + 返回什么”记,比背名字有用。
要点(3 条)
- 四类清单:字符串(CONCAT、LOWER、UPPER、LPAD、RPAD、TRIM、SUBSTRING)、数值(CEIL、FLOOR、MOD、RAND、ROUND)、日期(CURDATE、CURTIME、NOW、YEAR、MONTH、DAY、DATE_ADD、DATEDIFF)、流程(IF、IFNULL、NULLIF、CASE)。
- 记“参数顺序 + 返回什么”:DATEDIFF 是前减后、SUBSTRING 位置从 1 起、ROUND 的第二位是小数位。
- 函数能套在列上:把 LPAD 写进 UPDATE 就能批量补工号(P27);要对比结果时避开 RAND()、NOW()。
30 秒回忆
想再练一下(1 题,选做)
自测 1:DATEDIFF 和 DATE_ADD 都带 DATE,怎么快速区分?
DATE_ADD 是“日期 + 一段间隔”,返回新日期;DATEDIFF 是“两个日期差几天”,返回数字。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P31 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P31;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | t40–t70 为函数小结页(四类清单)。 |
| MySQL 8.0 Reference:字符串函数 | 官方文档 | 核对小结清单中的字符串函数,未逐字引用。 |
讲义无“小结”正文;本页参照前节 3.1–3.4 函数(p53–61)整理。画面 t40–t70 帧列出前三类函数,流程函数只写类别未列名,IF/IFNULL/CASE 由讲义 p59 表格与 P30 补全;原声字幕未取得。
讲义对照:参照前节整理,无独立讲义正文;参照前节 3.1–3.4 函数(p53–61)
- 画面静帧 9 帧,采样点 0:12–3:25 / 全片 3:38(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。