in、not in、exists、not exists 的区别

in 和 exists 的区别

exists:exists() 后面的子查询返回的是一个 boolean 值,符合条件则输出,再根据主查询的每一行去子查询里面查询
执行顺序: 1.首先执行一次外部查询 2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。 3.使用子查询的结果来确定外部查询的结果集。
如果外部查询返回 100 行,SQL 就将执行 101 次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。

in:in() 后面的子查询是返回结果集的,执行次序和 exists()不一样。
子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去符合要求的输出,反之则不输出。

如果两个表中一个较小,一个较大,则子查询表大的用 exists,子查询表小的用 in。

not in 和 not exists 的区别

not in:内外表都进行全表扫描,没有用到索引。
执行顺序:
是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。
并没有用到索引。

not exists:子查询依然能用到表上的索引。
执行顺序:
在表中查询,是根据索引查询的,如果存在就返回 true,如果不存在就返回 false,不会每条记录都去查询。

无论哪个表大,用 not exists 都比 not in 要快。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!