题解 | 使用含有关键字exists查找未分配具体部门的员工的所有信息。

使用含有关键字exists查找未分配具体部门的员工的所有信息。

https://www.nowcoder.com/practice/c39cbfbd111a4d92b221acec1c7c1484?tpId=82&tqId=29825&rp=1&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D82&difficulty=undefined&judgeStatus=undefined&tags=&title=

select * 
from employees e
where not exists(
    select e.emp_no  
    from dept_emp d
    where e.emp_no = d.emp_no
)

至于为啥子查询中不能用inner join来连接,而是直接用一个where连接

关于个人犯错的一点记录思考,通过问Gemini用更精准的措辞来概括:

  • 使用 WHERE 连接 (在 EXISTS 子查询中): 对于外层查询的每一条记录,子查询内部的 WHERE 子句会尝试在 dept_emp 表中查找与当前外层查询记录的 emp_no 相匹配的一条或多条记录。EXISTS 关心的是是否找到至少一条这样的匹配记录。子查询不会返回所有匹配的记录给外层查询,它只是作为一个“存在性”的检查。
  • 使用 INNER JOIN (在你错误的 EXISTS 子查询中): 你子查询中的 INNER JOIN 操作会连接dept_emp 表和 employees 表(注意,是子查询内部的 employees 表),并返回所有满足连接条件的记录。这个连接的结果是一个包含了所有在 dept_emp 表中有关联记录的员工信息的集合(至少是 emp_no)。EXISTS 只是检查这个连接产生的结果集是否为空,而不是针对外层查询的每一条记录进行关联判断。

核心理解:

  • EXISTS 的子查询是针对外层查询的每一条记录循环执行的。
  • 在每次循环中,子查询的目标是判断是否存在满足条件的记录
  • 使用 WHERE 子句能够在外层查询的当前记录和子查询的表之间建立直接的关联,从而实现针对当前记录的存在性判断。
  • 你错误的 INNER JOIN 并没有建立这种针对每一条外层查询记录的关联,而是生成了一个独立的、全局性的结果集,使得 EXISTS 的判断失去了针对性。

更准确地说,INNER JOIN 本身会返回所有满足连接条件的记录,而 EXISTS 只是查看这个返回的结果集是否为空。在你错误的用法中,只要 dept_emp 表中有任何记录,INNER JOIN 就会返回结果,导致 EXISTS 几乎总是为真。

所以:EXISTS 的子查询需要能够针对外层查询的每一条记录进行判断,“只连接一条记录”这种说法虽然不完全精确(可能会找到多条匹配的部门记录),但它抓住了关键点,即子查询的关联是针对当前外层查询记录的。而 INNER JOIN 在错误的用法中,并没有实现这种针对性的关联。

全部评论

相关推荐

华子别追了,我害怕了,每天手机提示音一响我就知道你又来了
徐凤年555:直接屏蔽了就行,真的太离谱了,感觉一万个hr
点赞 评论 收藏
分享
程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务