关于带WHERE子句的SQL EXISTS子查询的执行逻辑疑问
拆解这个EXISTS关联查询的逻辑
先看你提到的SQL语句:
SELECT employeenumber, firstname, lastname, extension FROM employees WHERE EXISTS( SELECT 1 FROM offices WHERE city = 'San Francisco' AND offices.officeCode = employees.officeCode) ;
你对EXISTS的基础理解没错,但忽略了一个核心点:这个子查询是关联子查询,它不是独立执行一次就输出0或1,而是跟着主查询的每一行员工逐个计算:
- 主查询会遍历
employees表的每一条员工记录 - 对每一条员工,子查询会拿这条员工的
officeCode,去offices表里匹配:有没有城市是旧金山,且办公室编码和当前员工编码一致的记录 - EXISTS的作用就是判断这个匹配是否存在:
- 只要能找到符合条件的办公室记录,EXISTS就返回「真」,这条员工会被保留到结果里
- 找不到的话,EXISTS返回「假」,这条员工就被过滤掉
- 等所有员工都被检查一遍,最终结果就是所有属于旧金山办公室的员工
你之前误以为WHERE会接收一个固定的0或1,但实际上EXISTS的结果是逐行动态生成的,每一行员工对应的EXISTS结果可能都不一样,这就是这个查询能精准筛选目标员工的原因。
内容的提问来源于stack exchange,提问作者OrianFishken
相关产品推荐
相关产品推荐

