大家好,今天小编来为大家解答SQL优化肯定会存在而不是重写sql这个问题,很多人还不知道,现在让我们一起来看看吧!
个人理解:
IN代表一个范围,表示某个字段在某个范围内。这个范围一般是使用子查询获得的。可见IN子查询返回的结果应该是这个范围集。
EXISTS是存在的意思,也就是说至少有一个地方。这个条件是通过EXISTS子查询来完成的,但是这里EXISTS子查询返回的结果不再是结果集,而是一个布尔值(true或false)。其实这个很容易理解,EXISTS的意思是如果子查询能找到值,就会返回true,并且执行EXISTS之前的语句。
测试数据
员工参数课程培训数据,两个不同的课程培训存在于两个表中,分别为CLASS_A和CLASS_B。
A级:
CLASS_B:
要求:找到参加过这两门课程的员工。
两种方式实现
下面两个方法分别用于实现in和exists。
1. 查询中
SELECT *FROM class_aWHERE id IN (SELECT id FROM class_b);2.使用exists方法查询
SELECT *FROM class_a AWHERE EXISTS ( SELECT * FROM class_b B WHERE A.id=B.id);描述:
上面两种方法的查询结果是一样的,但是exists方法更快。分析如下:
1)如果连接列id上有索引,那么查询CLASS_B时,不需要查询实际表,只需要查询索引。
2)使用exists,只有找到满足条件的一行数据才会终止查询,并且不会生成临时表。
3)使用in查询时,数据库会先执行子查询,然后将结果保存到临时表中,然后扫描整个临时表,这在很多情况下是非常消耗资源的。
如何用exists来代替in
如果有一个表user,有id和name两个字段,想要查询名称中带a的用户信息:
最简单的SQL:select * from user where name like ‘%a%’;使用IN的SQL:select u.* from user u where u.id in (select uu.id from user uu where uu.name like ‘% a%’);如何将使用IN的SQL改为使用EXISTS的SQL?
一开始我直接将其中的u.id替换为EXISTS,得到如下语句:
select u.* from user u where located(select uu.id from user uu where uu.name like ‘%a%’);经过测试发现输出结果错误。此言论一一询问了所有用户。相信你也发现了问题。后来我把上面的说法修改如下:
从存在的用户u 中选择u.*(从用户uu 中选择uu.id,其中uu.name 如’%a%’ 且uu.id=u.id);只要在子查询u.id中添加“and uu.id=”,查询结果就正确了。
总结:EXISTS子查询可以看成是一个独立的查询系统,只是为了获取真假逻辑值。 EXISTS子查询和外查询查询到的表是两个完全独立的表,没有任何关系(当第二个表中存在名称中包含a的名称时,则执行查询第一个表中所有用户的操作)。当我们在子查询中添加id关联后,EXISTS子查询和外查询查询的表就统一了。是两者结合形成的虚拟表,并且是同一个表(所以当子查询发现虚拟表中当前行的uu.name包含a时,对应的u.id和u.name查询成立)
所以一切的焦点都在这个ID关联上。添加ID关联时,数据库首先会通过ID关联将两个表组合成一个虚拟表。所有的查询操作都是在这个虚拟表上完成的,操作同一个表。表,当然不会出现以前那样的情况了!
总结
Exists 方法查询比in 方法查询更高效,但in 方法更具可读性。建议尽可能使用exists方法,并避免使用子查询,除非in参数是数字列表。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/120506.html
用户评论
红尘滚滚
太棒了!我一直在用IN查询,不知道EXISTS能提高性能效果这么大,我现在就赶紧把代码改一改试试看!
有12位网友表示赞同!
龙卷风卷走爱情
终于有人跟我说说这个訣窍了!之前每次遇到in多表联查总是很慢,原来是exists改写啊,太强大了吧!我这就去研究研究具体的用法。
有7位网友表示赞同!
眷恋
这篇文章写的太好了!对SQL优化新手超友好,把EXISTS和IN查询的优劣点都解释得清晰易懂,感谢作者分享这种宝贵经验!
有10位网友表示赞同!
青衫故人
EXISTS确实比IN查询效率更高,尤其在查询结果集较大的情况下优势更明显。不过也需要注意,用EXISTS写出来的语句可能会更复杂一些,需要根据具体情况进行权衡。
有9位网友表示赞同!
淡淡の清香
理论上来说 EXISTS 的效率确实要高,但是实际操作中要看数据量和表结构,有时候 IN 查询也挺快的,不用过分追求完美吧。
有11位网友表示赞同!
拽年很骚
我一直在优化SQL语句,但对EXISTS的理解还比较浅。这篇文章讲解得很棒,让我更加了解了EXISTS和IN的区别以及应用场景,受益匪浅!
有17位网友表示赞同!
哭着哭着就萌了°
这个技巧太赞了!之前用IN写出来的SQL代码运行速度慢得令人头疼,现在改成EXISTS果然提速不少,优化效果显著!
有13位网友表示赞同!
矜暮
我不太理解 EXISTS 语句的语法结构,能不能简单解释一下?另外是不是在所有情况下都比 IN 查询更优呢?
有18位网友表示赞同!
微信名字
我最近就在学习 SQL 优化,正好遇到了这个知识点。这篇文章刚好解答了我的一些疑问,让我对 EXISTS 的用法有了更清晰的认识。
有20位网友表示赞同!
柠栀
EXISTS 语句确实很有用,但在实际应用中需要慎重使用才能保证语句效率和可读性,不能盲目追求性能提升就好,还要考虑其他因素。
有13位网友表示赞同!
箜篌引
我还是比较习惯 IN 查询写法,突然改成 EXISTS 还有点难度,需要多练习才能熟悉这种新的表达方式。
有10位网友表示赞同!
杰克
我经常在优化 WHERE 子句中使用 EXISTS,因为它能有效地提高查询效率。特别是当我们需要验证某些条件是否满足时,EXISTS 会比 IN 更简洁高效。
有12位网友表示赞同!
青袂婉约
这篇文章简直是学习 SQL 的利器!把复杂的概念清晰易懂,感谢作者用心讲解!我一定会收藏起来反复阅读!
有18位网友表示赞同!
咆哮
我一直以为 EXISTS 和IN查询效果差不多,没想到差别这么大! 这篇文章让我开眼界了,以后一定要多使用EXISTS优化代码!
有15位网友表示赞同!
安陌醉生
虽然EXISTS比 IN 查询效率高,但有时候复杂度也会因为 EXISTS 语句而增加,需要考虑实际情况。
有13位网友表示赞同!
命硬
我之前也遇到过类似问题,用IN查询的速度很慢,后来改成了EXISTS后速度明显提升,感谢分享这种好的优化技巧!
有12位网友表示赞同!
各自安好ぃ
文章内容很棒!把EXISTS和IN的区别阐述得非常清晰,让我对这两个语句的运用有了更深刻的理解。继续学习SQL优化!
有15位网友表示赞同!