首页系统mysqlexists(MySQL中的EXISTS用法解析)

mysqlexists(MySQL中的EXISTS用法解析)

编程之家2024-01-31116次浏览

一、mysql中exists子查询异常

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

mysqlexists(MySQL中的EXISTS用法解析)

先来看看书中的语句

SELECTcnameFROMcourseWHERENOTexists

(SELECT*FROMsc,studentWHEREsc.sno=student.snoAND

sc.cno=course.cnoANDssex='男');

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

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

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

mysqlexists(MySQL中的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列的索引。

mysqlexists(MySQL中的EXISTS用法解析)

相反的

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'

的结果是相同的。

三、mysql中exists语句使用后获得的结果怎么顺序乱了

在sql语言里"存在"exists子句是非常不好理解的。

exists子句有两种用法,一种为独立exists子查询,另一种是父子关联子查询。前者对父查询不构成筛选作用,子查询若果有记录存在的话则输出所有的父查询记录集,反之则父查询输出空记录集。后者会对父查询构成筛选作用,不使用not关键字的情况下输出父查询中与子查询的交集,而使用not时则输出父查询中与子查询的非交集。至于如何判断exists子查询属于独立还是父子关联查询,以及为什么父子关联exists子查询会对父查询构成筛选作用,解释起来需要很大的篇幅这里就不讲了。反正我们记住父子关联查询的最常用功能就是它可以求出两张表的交集或非交集(使用not关键字)和不使用group分组的情况下求出某张表的最大值或最小值。

tar文件(tar是什么文件格式tar文件怎么打开)卡巴斯基激活码生成器(卡巴斯基永久激活工具)