mysql查询语句in和exists二者的区别和性能影响

国内作者 / 996信息技术 / 2026-05-21 14:47
"
关于mysql查询语句in和exists二者的区别和性能影响的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性

关于mysql查询语句in和exists二者的区别和性能影响的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。

如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)

1:

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

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

相反的

2:

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

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

not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

in 与 =的区别

select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。

现在我们来分析一下题主的问题。

先来看看书中的语句

SELECt?cname?FROM?course?WHERe?NOT?exists

(SELECt?*?FROM?sc,student?WHERe?sc.sno=student.sno?AND?

sc.cno=course.cno?AND?ssex='男');

这是一个父子关联 not exists 非存在子查询。我们知道父子关联exists子查询可检索出主查询结果集(父)中与子查询结果集(子)的“交集”,加上关键字not则取反,返回父中与子的“非交集”。

那么上述语句的实际上是返回课程表"course"中所有的课程中与被男生选修过课程的“非交集”。也就是在剩下的未被男生选修过的课程列表里,即可能存在被女生选修过的课程,也可能存在男生和女生都没有选修过的课程。从这个角度来看书中的SQL语句的运行结果是正确的,数据库引擎运算不存在BUG。

如果书中说“选出未被男生选读的课程名单”上述语句是正确的,如果以此反推未被男生选过的课程就是“只有女生选过的课程”就不够严谨,因为这正如上面所说过的那样,男生未选读的课程还可能包含女生也未选读的课程。严格来讲,要列出“只有女生选读的课程”,除了要排除男生外,还要排除女生未选读的课程。题主的第二个语句对主表做了进一步筛选因此有了不一样的效果。

关于mysql查询语句in和exists二者的区别和性能影响的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读