µ±Ç°Î»Ö㺠´úÂëÃÔ >> SQL >> SQL中EXISTS的用æ³
  Ïêϸ½â¾ö·½°¸

SQL中EXISTS的用æ³

Èȶȣº83   ·¢²¼Ê±¼ä£º2016-05-05 12:13:36.0
SQL中EXISTS的用�
比å?在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
  Ïà¹Ø½â¾ö·½°¸