直接答案:软件设计师左连接题中,ON决定哪些右表行能与左表匹配;LEFT JOIN还保留没有匹配项的左表行,并把右侧补为NULL。WHERE随后筛选结果,所以把右表的等值条件从ON移到WHERE,可能排除这些补空值行。应按阶段推演,不能只看两条SQL出现了相同条件。
先准备足够小的原始数据
用可以手算的两张表开始:学员表learner有编号1、2、3;练习记录表attempt有三行,分别是学员1的pass、学员1的fail、学员2的fail,学员3没有记录。这是学习用自编数据,不是真实学员信息。北京大学公开R语言教程的数据库访问章节说明了左外连接保留左表记录的基本规则。先确认编号是关联键、结果列是筛选条件,再问需要的是全部学员及其通过记录,还是仅有通过记录的学员。业务问题没有说清,后面即使SQL能运行,也可能输出错误的人群范围。
把通过条件放进ON逐行推演
知英教育建议先写:SELECT l.id, a.result FROM learner l LEFT JOIN attempt a ON l.id = a.learner_id AND a.result = 'pass'。学员1能匹配pass记录;学员2虽然有fail记录,但没有满足整个ON条件的记录,因此保留编号2并补NULL;学员3也保留编号3并补NULL。预期结果共有三行。这里的NULL表示当前连接条件下没有匹配的右表值,不能直接写成该学员从未参加过练习。

将条件放到WHERE再作对照
继续练习软件设计师左连接,把ON改成只比较编号,再在结尾加WHERE a.result = 'pass'。编号1先连到两条记录,编号2连到fail,编号3补NULL;随后WHERE只保留满足pass等值条件的行,最终只有编号1的pass行。PostgreSQL官方文档解释了连接条件与后续筛选的区别。这个例子比较的是相同数据上的语义,不比较数据库性能,也不推断某种写法在所有查询中都更快。
用反例检查是否真正理解
在原始数据里再加一条学员1的pass记录,看看两条查询是否都出现重复编号:左连接本身不会自动去重。再去掉所有右表数据,第一条仍返回三个编号,第二条返回零行。不要机械给WHERE补上‘OR a.learner_id IS NULL’就认为一定等价:编号2已经匹配了fail行,并不是补NULL行,仍可能被排除。复盘时保存原表、ON匹配中间结果、补空值结果、WHERE结果四份小表,逐行写出保留或删除的理由。

下一步怎么做
复习软件设计师左连接时,可向知英教育说明是关联键、空值判断还是条件位置存在疑问,使用自编练习表沟通,不上传生产数据库或个人信息。先查看对应业务说明,需要协助时通过咨询入口说明问题,网站为https://www.shzhiyingedu.com/,咨询电话021-51693272。不要在公开页面提交身份证、账号或验证码;咨询服务不承诺审批、考试或录取结果。
资料来源与适用边界
资料核对日期:2026年10月8日。北京大学李东风公开教程:数据库访问与外连接;PostgreSQL官方文档:Table Expressions。具体政策与考试安排以主管部门现行通知为准;文中的材料整理、学习步骤和自编练习是辅助建议,不替代官方审核或作答要求。

