EXISTS用于檢查子查詢是否至少會返回一行數(shù)據(jù)枚钓,該子查詢實(shí)際上并不返回任何數(shù)據(jù)问词,而是返回值True或False.
EXISTS指定一個子查詢蚀狰,檢測行的存在
語法:EXISTS subquery
參數(shù):subquery是一個受限的 SELECT語句(不允許有COMPUTE 子句和INTO關(guān)鍵字)邻悬。
結(jié)果類型:Boolean如果子查詢含行捺癞,則返回TRUE,否則返回FALSE猾瘸。
(1)在子查詢中使用NULL,任然返回結(jié)果集蓉媳。
? ? ? ? ?select * from table where exists(select null) == select * from table;
(2)比較使用EXISTS和IN查詢
(3)比較使用EXISTS和 =ANY的查詢蜕乡。
NOT EXISTS的作用與EXISTS正好相反嫁怀,若果子查詢沒有返回行设捐,則滿足了NOT EXISTS 中的WHERE子句。
結(jié)論:
EXISTS(包括 NOT EXISTS)子句的返回值是一個BOOL值塘淑。EXISTS內(nèi)部有一個子查詢語句(SELECT...FROM),當(dāng)EXISTS內(nèi)查詢語句萝招,返回一個結(jié)果集。則EXISTS根據(jù)結(jié)果集是否為空或非空存捺,來返回BOOL值槐沼。
SQL語句的執(zhí)行步驟:
分析器先會看語句的第一個詞,當(dāng)它發(fā)現(xiàn)第一個詞是SELECT關(guān)鍵字的時候捌治,它會挑到FROM關(guān)鍵字岗钩,然后通過FROM關(guān)鍵字找到表名并將表裝進(jìn)內(nèi)存。
接著是找WHERE關(guān)鍵字肖油,如果找不到則返回到SELECT找字段解析兼吓。如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段森枪。最后形成我們要的虛表视搏。
WHERE關(guān)鍵字后面的是條件表達(dá)式审孽。表達(dá)式計(jì)算完成后,會有一個返回值凶朗,即非0或0瓷胧,非0返回真,0返回假棚愤。
同理WHERE后面的條件也有一個返回值搓萧,真或假,來確定接下來要不要執(zhí)行SELECT宛畦。
EXISTS 與 IN的使用效率的問題瘸洛,通常情況下采用EXISTS要比IN效率高,因?yàn)镮N不走索引次和,
實(shí)際的使用情況:
? ? ? ? ? ? ? ? IN適合于外表大而內(nèi)表小的情況反肋;EXISTS適合外表小而內(nèi)表大的情況。