首先,我们要明白,就像
if(t==7)
cout<<"yes“;
一样,if后面的()里的句子,只表面是真是假,对输出什么东西没有任何影响
我们用select * / column1
from table1
where exists( select column2 from table2
where column3____)
的时候,那个()对于显示出来的字段数量没有任何影响!
然后,对于table1的每一条数据,都会挨个儿进行()里的判断,如果table2里有符合条件的数据,则真,没有则假;
所以其实column2 写什么都是无所谓的;
exists唯一做的就是根据真假来决定输不输出table1的数据;
这个说完了,我们再具体看看它到底干了些什么
exists对外表用loop逐条查询,每拿一条都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃;
not exists和exists整相反;
总的来说,如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件
in查询相当于多个or条件的叠加,符合一个就可以;
这么用
select * from user where user_id in (1,2,3);
user_id =1/2/3都可以;
1,2,3是用来举例子的,不代表任何字段;
not in 的话要求不等于1且不等于2且不等于3才可以;
in是先把子查询条件的记录全都查出来,就说有3个吧(1,2,3)。
然后把外表的user_id 一个个拉出来,
先让第一条id和1比,再和2比,再和3比,
然后拉出第二个;
还有,in查询的子条件返回结果只能有一个字段;
原文后面讲的exists和in的效率问题我真的没看懂呀
先记住下面这两条
子表小in ;
子表大exists;
无论大小,not exists;