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去重的区别?

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

相关内容

热门资讯

最新引进“讯奇麻将斗牛有没有挂... 您好:讯奇麻将斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款...
终于了解“德扑之星怎么开挂?”... 您好:德扑之星这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
【第一消息】“财神十三张有没有... 您好:财神十三张这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游...
终于懂了“新圣游炸/金/花开挂... 网上科普关于“新圣游炸/金/花有没有挂”话题很是火热,小编也是针对新圣游炸/金/花作*弊开挂的方法以...
玩家攻略科普“网易麻将怎么装挂... 您好:网易麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
今日重大通报“新版悟空炸/金/... 有 亲,根据资深记者爆料新版悟空炸/金/花是可以开挂的,确实有挂(咨询软...
今日重大发现“中至万年麻将怎么... 网上科普关于“中至万年麻将有没有挂”话题很是火热,小编也是针对中至万年麻将作*弊开挂的方法以及开挂对...
玩家攻略科普“胡乐邯郸麻将有没... 您好:胡乐邯郸麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款...
重磅消息“趣游天水麻将是不是有... 家人们!今天小编来为大家解答趣游天水麻将透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里...
我来教教您“青鸾辅助器?”(其... 网上科普关于“青鸾有没有挂”话题很是火热,小编也是针对青鸾作*弊开挂的方法以及开挂对应的知识点,寻找...