适合场景:从两张表中找出相同/不同的数据
-
Sql 中 in 里面的子查询只能返回一个字段列,如果返回多个列会报错。但是in里面直接使用值是可以的
-
exists是可以返回多个字段的,但是exists并不在意返回的字段结果,而是判断结果的真假
-
in 与exists的区别是:
- in是将子查询中的查出的结果放到缓存中,然后进行遍历比对,适合in外面的表数据量大,里面的表数据量小的情况
- exists是外面的查询每执行一次会去子查询中获取一个boolean的结果,适合外面的表数据量小,里面的表数据量大的情况
- in 并不会让索引失效
-
not in 与 not exists区别
- 使用not in 在遇到空字段时,执行结果会返回空,如果子查询字段有非空限制,可以使用not in。not in会进行全表扫描,不会使用索引
- not exists会得到正确结果。
SELECT
bg.group_id group_id,
bg.NAME NAME
FROM
ig_bbc_group bg
WHERE
bg.delete_flg = 0
AND NOT EXISTS (
SELECT
1
FROM
ig_bbc_group_product p
WHERE
p.bbc_group_id = bg.id
AND p.product_id = 517169123920159585
AND p.delete_flg = 0
)