in和exists也是很好区别的.
in是一个集合运算符.
ain{a,c,d,s,d....}
这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.
而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.
in运算用在语句中,它后面带的select一定是选一个字段,而不是select*.
比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in运算:
"小明"in(selectsnamefromstudent)
这样(selectsnamefromstudent)返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;
同时,你也可以用exists语句:
exists(select*fromstudentwheresname="小明")
这两个涵数是差不多的,但是由于优化方案的不同,通常NOTEXISTS要比NOTIN要快,因为NOTEXISTS可以使用结合算法而NOTIN 就不行了,而EXISTS则不如IN快,因为这时候IN可能更多的使用结合算法.
select*from表Awhereexists(select*from表Bwhere表B.id=表A.id)
这句相当于
select*from表Awhereidin(selectidfrom表B)
对于表A的每一条数据,都执行select*from表Bwhere表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示
exits适合内小外大的查询,in适合内大外小的查询
IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。
比较使用EXISTS和IN的查询
这个例子比较了两个语义类似的查询。第一个查询使用EXISTS而第二个查询使用IN。注意两个查询返回相同的信息。
USEpubs
GO
SELECTDISTINCTpub_name
FROMpublishers
WHEREEXISTS
(SELECT*
FROMtitles
WHEREpub_id=publishers.pub_id
ANDtype='business')
GO
--Or,usingtheINclause:
USEpubs
GO
SELECTdistinctpub_name
FROMpublishers
WHEREpub_idIN
(SELECTpub_id
FROMtitles
WHEREtype='business')
GO
下面是任一查询的结果集:
pub_name
----------------------------------------
AlgodataInfosystems
NewMoonBooks
(2row(s)affected)
exits相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如existP表示P不空时为真;notexistP表示p为空时为真in表示一个标量和一元关系的关系。例如:sinP表示当s与P中的某个值相等时为真;snotinP表示s与P中的每一个值都不相等时为真