MySQL 视频课 · 50 集 / 子查询:标量、列、行、表子查询 / P44

第 44 集 / 共 50 · 子查询:标量、列、行、表子查询 · 视频 p=44 · 时长 5:53

P44 44. 基础-多表查询-标量子查询

讲义 5.6.2 标量子查询 p81–82

按主题对应,非逐句切分

来源与核对说明

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

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

讲义索引:p81–82 · 5.6.2 标量子查询 · 切点 notexact

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

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

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

标量子查询是最常用的一类:内层只吐一个值,外层把它当普通数字用。风险也集中在这一句“只吐一个”。

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

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

一句话理解

标量子查询返回一个值(一行一列),所以能直接放在 =、>、< 后面当普通数字用。

跟播:视频里 ↔ 本站

视频里 / 原课字段本站对应
(select avg(salary) from emp)(select avg(salary) from employee)
emp.salary 是 INT、17 行employee.salary 是 INT、4 行

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

按这 4 步做

  1. 先确认内层只可能返回一行一列。按主键查、或用 AVG/MAX 这类聚合,天然只有一行;按普通字段查就可能翻车。
  2. 把内层当成一个字面值来读。WHERE salary > (SELECT AVG(salary) ...) 就是“工资大于 10000”,理解上不需要特殊语法。
  3. 跑之前先单独执行内层。看到 0 行或 2 行以上就要预警:0 行时内层得到 NULL,用 =、>、< 这类普通比较会得到 unknown,外层筛不出行;2 行以上直接报 1242。只有 IS NULL、IS NOT NULL 和 <=> 这类专门处理 NULL 的写法是例外——空集会被当成一个 NULL“值”来判,WHERE (SELECT ...) IS NULL 反而能查到行。
  4. 写复杂条件时,先把内层结果抄成常量试跑外层,两次都对,组合起来基本不会错。

小例

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

SQL 示例
-- 表:department(1 研发部, 2 测试部, 3 运营部)
-- employee:小林22/研发8000/上级2,小周25/研发10000/无上级,小陈30/测试12000/上级2,小李21/无部门/NULL/上级2
-- 建表与插入语句见本页练习脚本 p44.sql(独立练习库 mysqlnotes_p44,跑一次就有这两张表)

-- 内层只有一个值:全公司平均工资
SELECT name AS 员工, salary AS 工资
FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee);

-- 内层按 name 查,本数据里恰好一行;name 没有唯一约束,出现重名部门就会返回多行、外层报 1242
SELECT name AS 员工
FROM employee
WHERE dept_id = (SELECT id FROM department WHERE name = '测试部');

第一段内层 AVG = 10000,外层只剩小陈 12000,1 行。第二段内层查出测试部 id = 2,外层得到小陈,1 行。如果把“测试部”改成不存在的名字,内层 0 行 → 返回 NULL → 外层一行都没有;这不是语法错,是逻辑上空了(这里用的是 =,所以空集筛不出行;换成 IS NULL 判断就是例外)。 排查顺序也简单:先单独跑内层看行数,再把值写成常量跑外层,问题一定出在其中一步。要让内层稳定只返回一行,就按主键查,或用 AVG/MAX 这类聚合。

易错点

30 秒速记

标量=一行一列;能当普通值用;0 行→NULL,普通比较筛不出(IS NULL/<=> 例外);多行→ERROR 1242。

自测(3 题,先答再展开)

自测 1:标量子查询返回 0 行,外层 WHERE 会怎样?

内层为 NULL,比较结果为 unknown,外层不返回该行,也不报错;只有 IS NULL / <=> 这类专门处理 NULL 的写法才会把它当值判。

自测 2:返回 3 行呢?

报 ERROR 1242 Subquery returns more than 1 row。

自测 3:内层用了 GROUP BY 还能当标量用吗?

通常不能,分组多半返回多行;标量位置只接受一行一列,多行报 1242。

材料与来源

展开材料出处、讲义页码与证据等级
材料类型 / 位置支持了什么
BV1Kr4y1i7ru P44(平台标题)平台视频页 · P44本节标题页可见“子查询”;具体讲解画面不清晰,示例与结论按同主题通用语义自写
MySQL 8.0 Reference Manual — Subqueries官方文档仅用于核对子查询语义与错误码,不是课程材料

本集无逐字稿(匿名 player/v2 返回 subtitles=[]、need_login_subtitle=true),并以讲义公开镜像讲义 5.6.2 标量子查询(p81–82)核对章节与主题;画面静帧只用于确认场景,不是内容边界。示例表与数据为本笔记自建,不是课程原表;不含原始帧或字幕。 本集静帧可读文字很少,仅标题级;不据此声称讲师原话或原例。

讲义对照:讲义 5.6.2 标量子查询 · p81–82(公开镜像;按主题对应,切点 notexact)

  • 画面静帧 9 帧,采样点 0:12–5:40 / 全片 5:53(只用于确认画面主题,不作内容边界)
  • 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号

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

下载本集 Markdown