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
:当子查询返回的结果集较大,或需要进行复杂的条件判断时。例如:检查关联表中是否存在满足特定条件的记录。