【sql】exists的用法,exists与in的区别

一直以来很少用exists,以为和in用法一样,最近一看才发现,that is not the case!

exists用法

强调的是子查询是否有返回集,不需知道具体返回的是什么,如果有就显示主查询的内容,没有就不显示。

因此,子查询中select *和select 任意字段 效果是一样的,如下:

SELECT * FROM customer c WHERE NOT EXISTS (SELECT cg.date FROM customer_goods cg WHERE c.id =1)  
SELECT * FROM customer c WHERE NOT EXISTS (SELECT * FROM customer_goods cg WHERE c.id =1)

当然这里分为两种情况:一种是子查询和主查询有关联,就是子查询的where用到了主查询的字段,这种情况先把主表查出来,然后循环主表的每一行,复制到子查询的字段即可。另一情况是子查询和没有用到主查询的表,这种就直接返回true就可以了。

参考资料:https://blog.csdn.net/zhangsify/article/details/71937745

in和exists区别

in是先查询子表,然后内外表做迪卡尔积,筛选。 子查询返回类型是结果集。——用于判断某字段是否包含着子查询中

exists是先查外表,loop循环外表每一行,去内表判断。子查询返回类型是boolean。——用于判断是否有返回集

子表小有索引用in,主表大、有索引用exists。

参考资料:https://www.cnblogs.com/liyasong/p/sql_in_exists.html


猜你喜欢

转载自blog.csdn.net/liuhe2296044/article/details/79877625
今日推荐