in和exists的区别以及exists和distinct去重的区别?
admin
2023-02-07 09:20:02
0

小编相信大家都知道in和exists的区别:
1、运用情况不同
sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有索引的时候。

2、驱动顺序不同
IN是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。exists是以外层表为驱动表,先被访问。

3、底层原理不同
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

但是我昨天看到有位博主讲到还有一个区别就是对null值处理不同:IN不对NULL进行处理,exists会对NULL值进行处理。这个我没有听过,所以本着好奇心就去测试了一下,我发现没有什么不同,查询出来的数据也是一样。至于其他的小编就不在这里一一测试的,有兴趣的小伙伴自己私下测试一下。

先创建两张表stu存放学生的编号,姓名以及班级
in和exists的区别以及exists和distinct去重的区别?
grade表存放学生的编号以及分数。
in和exists的区别以及exists和distinct去重的区别?
代码如下:
select from stu t1 where exists (select from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;

select from stu t1 where t1.stuno in (select t2.stuno from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;
查询结果是一样的,如下:
in和exists的区别以及exists和distinct去重的区别?
在这里注意两点:
1、sql中查询的字段均为stu表中的字段,不能写为:
select t2.
from stu t1 where t1.stuno in (select t2.stuno from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;否则会报错t2.标示符无效。
2、in是单字段查询,所以子查询中一定要注意!不能写为:
select
from stu t1 where t1.stuno in (select * from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;否则会报错值过多。

如果哪位小伙伴有不同的见解,欢迎给小编留言,小编好及时纠正,谢谢!

接下来讨论一下exists和distinct去重:
代码如下,id唯一:
select from stu t1 where exists (select from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;
查询出的数据结果如下图:
in和exists的区别以及exists和distinct去重的区别?
我当时就一直在这里困扰,exists不是有去重的效果吗?为什么数据里id还是有重复数据出现,后来小编一直做实验测试发现,查询出的数据好像是先满足子查询中的where条件之后,然后对子查询中的数据去重,并不是对主表去重,最后返回符合数据的主表中的数据。后来就根据这个发现多做了一个测试,发现还真是这样。
还可以用一下sql代码替换:
select t1.* from stu t1,(select distinct a.stuno from grade a) t2 where t1.stuno = t2.stuno order by t1.stuno;
相信大家通过这两条代码发现通过distinct不能直接实现exists上面查询的效果!exists的效率会更高:
以下exists的解释计划窗口截图:
in和exists的区别以及exists和distinct去重的区别?
以下distinct的解释计划窗口截图:
in和exists的区别以及exists和distinct去重的区别?

所以小编今天整理一下,也希望更多网友不要跟我一样再犯傻了,浪费时间不说,还一直有一个错误的理解!
大家还有什么更好的想法欢迎给小编留言!

相关内容

热门资讯

工业和信息化部:依托标准牵引智... 日前,在北京举办的《人工智能 智能体互联》系列标准应用推进专题会上,工业和信息化部科技司副司长甘小斌...
原创 强... 进入下半年,子系品牌新一轮旗舰和中端性能机开始密集预热,近期更是有博主连续放出两条关键信息,分别指向...
“文学超界面”探索数字时代人文... 来源:新华网 当严肃文学的深厚内核遇见人工智能生成内容(AIGC)的影像创造力,会碰撞出怎样的火花...
以防长称已为应对伊朗局势做好“... △以色列国防部长卡茨(资料图)当地时间23日,据以色列方面消息,以色列国防部长卡茨当天表示,鉴于当前...
美参议院否决限制特朗普对伊战争... △美国国会(资料图)当地时间23日,美国参议院以49票对47票的表决结果,否决了旨在限制特朗普对伊朗...
工信部部长:搞“脱钩断链”对谁... 7月23日,2026年亚太经合组织(APEC)数字和人工智能部长会议新闻发布会在成都召开。会议主席、...
AMD展示最强AI加速器MI4... IT之家 7 月 24 日消息,今天(7 月 24 日)在美国旧金山召开的年度盛会 Advancin...
河北:知行研学度盛夏 多彩实践... 冀时新闻报道暑假期间,我省各地推出形式多样的青少年研学活动,让孩子们在实践中增长见识、锤炼品格,度过...
世界互联网大会数智健康工作组以... 7月22日,2026年世界互联网大会数字丝路发展论坛在陕西西安开幕。这是世界互联网大会连续第三年举办...
开立医疗获得实用新型专利授权:... 证券之星消息,根据天眼查APP数据显示开立医疗(300633)新获得一项实用新型专利授权,专利名为“...