in 和exists的区别

inexists在大多数时候都是可以互相转化的,我们可以把带有insql语句转为existssql语句。那么,他们二者有什么区别?我们什么时候使用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

  • 当子查询结果较大。
  • 当子查询涉及复杂条件。
  • 通常在存在关联的子查询中更高效。
相关推荐
天冬忘忧4 小时前
Flink优化----FlinkSQL 调优
大数据·sql·flink
后端转全栈_小伵8 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
数据库·后端·sql·mysql·学习方法
不剪发的Tony老师10 小时前
SQL实现新年倒计时功能
数据库·sql
Suwg20912 小时前
《手写Mybatis渐进式源码实践》实践笔记(第七章 SQL执行器的创建和使用)
java·数据库·笔记·后端·sql·mybatis·模板方法模式
丁总学Java12 小时前
优化 invite_codes 表的 SQL 创建语句
java·数据库·sql
冰镇毛衣13 小时前
4.5 数据表的外连接
数据库·sql·mysql
得谷养人15 小时前
flink-1.16 table sql 消费 kafka 数据,指定时间戳位置消费数据报错:Invalid negative offset 问题解决
sql·flink·kafka
数据的世界0117 小时前
SQL创建和操纵表
数据库·sql
冰镇毛衣18 小时前
4.3 数据库HAVING语句
数据库·sql·mysql
HaiFan.1 天前
SpringBoot 事务
java·数据库·spring boot·sql·mysql