比å?在Northwindæ•°æ�®åº“䏿œ‰ä¸€ä¸?Ÿ¥è¯?¸º
SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)
这里é�¢çš„EXISTSæ˜??何è¿�作呢?å�查è?返回的是OrderIdå—æ?,å�¯æ˜??é�¢çš„æŸ¥è?è¦�找的是CustomerIDå’ŒCompanyNameå—æ?ï¼Œè¿™ä¸¤ä¸ªå—æ?è‚?®šä¸�在OrderID里é�¢å•Šï¼Œè¿™æ˜¯å¦‚何匹é…�的呢ï¼?
EXISTS用于æ£?查å�查è?æ˜?�¦è‡³å°‘会返回一行数æ�?¼Œè¯¥å�查è?实际上并ä¸�返回任何数æ�?¼Œè€Œæ˜¯è¿”回值True或False
EXISTS 指定ä¸?ä¸?�查è?,æ?æµ?è¡?çš„å˜åœ¨ã??
è¯?³•ï¼?EXISTS subquery
å�‚æ•°ï¼?subquery æ˜?¸€ä¸?�—é™�çš„ SELECT è¯?�¥ (ä¸�å…�许有 COMPUTE å�å�¥å’?INTO 关键å?ã€?
结果类型ï¼?Boolean 如果å�查询包å�??,则返回 TRUE ,å�¦åˆ™è¿”å›?FLASE ã€?
例表A:TableIn 例表B:TableEx
(一ï¼? 在å�查è?ä¸?½¿ç”?NULL ä»�然返回结果é›?
select * from TableIn where exists(select null)
ç‰å�ŒäºŽï¼š select * from TableIn
(二ï¼? 比较使用 EXISTS å’?IN 的查è¯??‚注æ„�两ä¸?Ÿ¥è¯¢è¿”回相å�Œçš„结果ã€?
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
(三ï¼? 比较使用 EXISTS å’?= ANY 的查è¯??‚注æ„�两ä¸?Ÿ¥è¯¢è¿”回相å�Œçš„结果ã€?
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)
NOT EXISTS 的作用与 EXISTS æ£å¥½ç›¸å��。å?æžœå�查è?没有返回行,则满足了 NOT EXISTS ä¸?š„ WHERE å�å�¥ã€?
结è?ï¼?
EXISTS(包括 NOT EXISTS )å�å�¥çš„返回å?¼æ˜¯ä¸?个BOOL值ã??EXISTS内部有一ä¸?�查è?è¯?�¥(SELECT ... FROM...)ï¼?我将其称为EXIST的内查è?è¯?�¥ã€‚其内查询è?å�¥è¿”回一ä¸?»“果集ã€?EXISTSå�å�¥æ ¹æ�®å…¶å†…查è?è¯?�¥çš„结果集空或者é�žç©ºï¼Œè¿”回ä¸?ä¸?¸ƒå°”å?¼ã??
ä¸?ç§�é?šä¿—çš„å�¯ä»¥ç�†è§£ä¸ºï¼šå°†å¤–查询表的æ¯�ä¸?行,代入内查è¯?½œä¸ºæ?验,如果内查询返回的结果å�–é�žç©ºå?¼ï¼Œåˆ™EXISTSå�å�¥è¿”回TRUE,这ä¸?行è?å�?½œä¸ºå?查è?的结果è?,å�¦åˆ™ä¸�能作为结果ã??
分æž�器会先看è¯?�¥çš„ç?ä¸?ä¸?¯�,当它å�‘现ç?ä¸?ä¸?¯�是SELECT关键å—的时å?™ï¼Œå®ƒä¼šè·³åˆ°FROM关键å—,然å�Žé€šè¿‡FROM关键嗿‰¾åˆ°è¡¨å��并把表装入内å˜ã€‚接ç�?æ˜?‰¾WHERE关键å—,如果找ä¸�到则返回到SELECTæ‰¾å—æ®µè§£æž�,如果找到WHERE,则分æž�å…¶ä¸çš„æ�¡ä»¶ï¼Œå®Œæˆ�å�Žå†�回到SELECT分æž�å—æ?。最å�Žå½¢æˆ�ä¸€å¼ æˆ‘ä»??的虚表ã??
WHERE关键å—å�Žé�¢çš„æ˜?�¡ä»¶è¡¨è¾¾å¼�。æ�¡ä»¶è¡¨è¾¾å¼�计算完æˆ�å�Žï¼Œä¼šæœ‰ä¸?ä¸?¿”回å?¼ï¼Œå�³é�ž0æˆ?,é�ž0å�³ä¸ºçœ?true)ï¼?å�³ä¸ºå�?false)。å�Œç�†WHEREå�Žé�¢çš„æ�¡ä»¶ä¹Ÿæœ‰ä¸€ä¸?¿”回å?¼ï¼ŒçœŸæˆ–å�‡ï¼Œæ�¥ç¡®å®šæŽ¥ä¸‹æ�¥æ‰§ä¸�执è?SELECTã€?
分æž�器先找到关键å—SELECT,然å�Žè·³åˆ°FROM关键å—å°†STUDENT表å?入内å˜ï¼Œå¹¶é?šè¿‡æŒ‡é’ˆæ‰¾åˆ°ç¬?¸€æ�¡è?录,接ç�€æ‰¾åˆ°WHERE关键å—è?算它的æ�¡ä»¶è¡¨è¾¾å¼�,å?果为真那么把这æ�¡è®°å½•装到ä¸?ä¸?™šè¡¨å½“ä¸?¼ŒæŒ‡é’ˆå†�指å�‘下ä¸?æ�¡è?录ã?‚å?果为å�‡é‚£ä¹ˆæŒ‡é’ˆç›´æŽ¥æŒ‡å�‘下ä¸?æ�¡è?录,而ä¸�è¿›è?其它æ“�作。一直æ?索完整个è¡?¼Œå¹¶æŠŠæ£?索出æ�¥çš„虚拟表返回给用户。EXISTSæ˜?�¡ä»¶è¡¨è¾¾å¼�的一部分,它也有ä¸?ä¸?¿”回å??true或false)ã€?
在æ�’å…¥è?录å‰�,需è¦�æ?查这æ�¡è?录是å�¦å·²ç»�å˜åœ?¼Œå�?œ‰å½“è?录ä¸�å˜åœ¨æ—¶æ‰�执è?æ�’å…¥æ“�作,å�¯ä»¥é?šè¿‡ä½¿ç”¨ EXISTS æ�¡ä»¶å�¥é˜²æ¢æ�’å…¥é‡�å¤�è?录ã??
INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 'å¼ ä¸‰', 'ç”? FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)
EXISTS与IN的使用效率的é—??,é?šå¸¸æƒ…况下采用existsè¦�比inæ•ˆçŽ‡é«˜ï¼Œå› ä¸ºINä¸�走索引,但è¦�看实际情况具体使用ï¼?
IN适å�ˆäºŽå?表大而内表å°�的情况;EXISTS适å�ˆäºŽå?表å°�而内表大的情况ã??
如果两个表ä¸ä¸?ä¸?¾ƒå°�,ä¸?ä¸?˜¯å¤§è¡¨ï¼Œåˆ™å�查询表大的用exists,å�查è?表å°�的用in