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

第 46 集 / 共 50 · 子查询:标量、列、行、表子查询 · 视频 p=46 · 时长 4:36

P46 46. 基础-多表查询-行子查询

讲义 5.6.4 行子查询 p83–84

按主题对应,非逐句切分

来源与核对说明

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

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

讲义索引:p83–84 · 5.6.4 行子查询 · 切点 notexact

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

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

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

行子查询解决一个很具体的问题:两个条件必须来自同一行。分开写两个子查询,逻辑上就可能拼错人。

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

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

一句话理解

行子查询返回一行多列,用括号把几个字段凑成一行去比:(salary, manager_id) = (子查询)。

跟播:视频里 ↔ 本站

视频里 / 原课字段本站对应
(salary, managerid)(salary, manager_id)
emp 17 行employee 4 行

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

按这 3 步做

  1. 先想清楚为什么要凑成一行。分成 salary = (...) AND manager_id = (...) 两个子查询,两个值可能来自不同的人,逻辑就错了;行比较保证同属一行。
  2. 括号里的列顺序要一致。左边先 salary 后 manager_id,子查询也必须这个顺序;反了通常不报错,只是永远不相等。
  3. 确认子查询只返回一行。行构造器配 = 时多行直接报 ERROR 1242;要多行匹配得换成 IN,那是下一页的表子查询。 行构造器不是万能元组比较,列数、类型都要严格对上。

小例

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

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

-- 与 3 号员工“工资 + 上级”都相同的人
SELECT id, name, salary, manager_id
FROM employee
WHERE (salary, manager_id) = (
  SELECT salary, manager_id FROM employee WHERE id = 3
);

内层按主键查到一行 (12000, 2),外层逐行比较两个值是否同时相等,只有小陈自己,1 行。把条件换成 id = 2 会得到 (10000, NULL):NULL 参与行比较结果未知,连小周自己都匹配不上——这是行子查询最隐蔽的坑。 行比较的语义是“同时相等”,不是“任一相等”;要任一相等得拆成 OR,别硬套行构造器。

易错点

30 秒速记

行子查询=一行多列;括号列序对齐;= 只接一行;NULL 让整行比较失效;多行换 IN。

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

自测 1:(salary, manager_id) = (子查询) 里子查询返回 2 行会怎样?

报 ERROR 1242;多行比较要用 IN。

自测 2:manager_id 为 NULL 的那行能被 = 匹配吗?

不能,整行比较为 unknown;用 <=> 或分别处理 NULL。

自测 3:为什么不能把行子查询拆成两个独立子查询?

两个子查询各自取值,可能来自不同行,拼出来的组合根本不存在。

材料与来源

展开材料出处、讲义页码与证据等级
材料类型 / 位置支持了什么
BV1Kr4y1i7ru P46(平台标题)平台视频页 · P46静帧 t=40s 附近可见“薪资及直属领导”题目与 salary, managerid 列名;完整行比较写法画面不清
MySQL 8.0 Reference Manual — Subqueries官方文档仅用于核对子查询语义与错误码,不是课程材料

本集无逐字稿(匿名 player/v2 返回 subtitles=[]、need_login_subtitle=true),并以讲义公开镜像讲义 5.6.4 行子查询(p83–84)核对章节与主题;画面静帧只用于确认场景,不是内容边界。示例表与数据为本笔记自建,不是课程原表;不含原始帧或字幕。 题干只取“同薪资同上级”这一主题,示例与数据为自建。

讲义对照:讲义 5.6.4 行子查询 · p83–84(公开镜像;按主题对应,切点 notexact)

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

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

下载本集 Markdown