意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

exist和 in

来源:恒创科技 编辑:恒创科技编辑部
2024-02-04 19:46:59
一、执行顺序IN的执行过程如下:

  1.首先运行子查询,获取子结果集

  2.主查询再去结果集里去找符合要求的字段列表,.符合要求的输出,反之则不输出。

Exists执行顺序如下:进行外查询,即不是exists内部的查询;将查询到的每一行结果都带入exists内部查询中,作为查询对象;如果满足exists查询条件,返回true,则该行结果成功被返回。exists 查询说明:

查询时,一般情况下,子查询会分成两种情况:
1.子查询与外表的字段有关系时
select 字段1 , 字段2 from 表1 where exists (select 字段1 , 字段2 from 表2 where 表2.字段2 = 表1.字段2)
这时候,此SQL语句相当于一个关联查询。
它先执行表1的查询,然后把表1中的每一条记录放到表2的条件中去查询,如果存在,则显示此条记录。


exist和 in

2.子查询与外表的字段没有任何关联
Select 字段1 , 字段2 from 表1 where exists ( select * from 表2 where 表2.字段 = ‘ 条件‘)
只要子查询的结果大于等于1行,就会查询出外部主表中的所有记录,如果子查询中没有查询到记录(结果为空),则外部主表的结果也为空;
当子查询与主表不存在关联关系时,简单认为只要exists为一个条件判断,如果为true,就输出所有记录。如果为false则不输出任何的记录

二、in 和exist 的适用场景:

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

表A(大表),表B(小表):
select * from A where cc in (select cc from B)效率高,用到了A表上cc列的索引;

表A(小表),表B(大表):
select * from A where exists (select cc from B where B.cc=A.cc) 效率高,用到了B表上cc列的索引。

参考地址:https://blog.csdn.net/u010002184/article/details/122655241

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。




二、in 和exist 的适用场景:

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

表A(大表),表B(小表):
select * from A where cc in (select cc from B)效率高,用到了A表上cc列的索引;

表A(小表),表B(大表):
select * from A where exists (select cc from B where B.cc=A.cc) 效率高,用到了B表上cc列的索引。


上一篇: tcp协议 tcpip协议 http协议,IP,DNS,端口号 下一篇: 手机怎么远程登录云服务器?