existes与in是可以互相转换的。只是逻辑有点差别,并且在性能上有差别。
in就是存在。我们原来曾用过。select * from student where no in (001,002,003) 就是选出no等于001或者 002 或者003的学生。
那么就是说,如果where 后面为true ,那么前面就显示结果。
select * from student no in (select stuNo from class where class.stuNo = student.no)
这里,如果student表的no等于 后面选出的stuNo,那么就选出这条学生记录。
注意:in 语句 是先查询where后面的子查询的,将子查询的结果查出来之后,然后再去主查询筛选。而existes是正好相反的。
existes 你会发现没有 在where 后面加表的字段 existes 所以,只是根据后面的整个子查询返回true或者false来限制的是否显示结果集。
select * from student existes (select * from class where class.stuNo = student.no)
而existes 先执行主查询,之后再到子查询去筛选。
与in一样,后面选的为空 则返回为False 否则 有数据 贼为true
在查询的时候,先执行数据量小的。也就是如果class的数据少,那么刚才就需要用in是好一点的。这样in选出数据后,再去主查询比对。就不需要把数据量很大的student这个表的数据查询出来。 效率性能会高很多。
反之不存在就加not