in
和exists
在大多数时候都是可以互相转化的,我们可以把带有in
的sql
语句转为exists
的sql
语句。那么,他们二者有什么区别?我们什么时候使用in
,什么时候使用exists
。
1. in
1.1 语法
SELECT column1 FROM table1 WHERE column1 IN (SELECT column2 FROM table2);
1.2 执行步骤
MySQL
会先执行子查询并将结果存储在内存中,然后对外部查询的每一行进行比较。这在子查询结果较大时可能导致性能问题。也就是,子查询驱动主查询
2. exists
2.1 语法
SELECT column1 FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table2.column2 = table1.column1);
2.2 执行步骤
MySQL
会对主查询的每一行执行子查询,一旦子查询返回结果,就会立即停止执行并返回 TRUE。这在许多情况下比 IN 更高效。主查询驱动子查询
3. 总结
根据优化原则"小表驱动大表,即小的数据集驱动大的数据集",我们可以得知:
使用 IN
:
- 当子查询返回较少结果。
- 当要检查的值列表较小或是一个静态列表。
使用 EXISTS
:
- 当子查询结果较大。
- 当子查询涉及复杂条件。
- 通常在存在关联的子查询中更高效。