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

(ChatGPT)

区别与性能考虑

  • 执行效率:对于较小的结果集,IN 通常性能较好,因为数据库可以一次性加载小的结果集并进行过滤。对于较大的结果集,EXISTS 通常性能更好,因为它可以在找到第一条匹配记录时立即返回,而无需加载整个结果集。
  • NULL处理:IN 会受到NULL值的影响,如果子查询结果集中包含NULL值,可能会导致结果不符合预期。EXISTS 不会受到NULL值的影响,因为它只是检查子查询是否返回行。
  • 语义差异:IN 适用于列表比较,比较直接且语义明确。EXISTS 适用于存在性检查,更灵活,适用于复杂子查询。

总结

  • 使用IN:当子查询返回的结果集较小,或需要进行简单的集合比较时。例如:检查某个值是否在一个小的静态列表中。
  • 使用EXISTS:当子查询返回的结果集较大,或需要进行复杂的条件判断时。例如:检查关联表中是否存在满足特定条件的记录。