語法:SELECT 字段 FROM table WHERE EXISTS(subquery);
示例:
SELECT * FROM A WHERE EXISTS(SELECT 1 FROM B WHERE B.id = A.id);
Exists執行順序如下:
1.首先執行一次外部查詢並且緩存結果集——SELECT * FROM A;
2.遍歷外部查詢結果集的每一條記錄的時候,各執行一次子查詢。
SELECT 1 FROM B WHERE B.id = A.id;
如果外部查詢返回100行記錄,SQL就將執行101次查詢,一次執行外部查詢,然后為外部查詢返回的每一行執行一次子查詢。顯然,外表小內表大的時候,執行效率非常棒。
EXISTS查詢返回的是什么?一個布爾值true或flase,它只在乎EXISTS()的查詢中是否有記錄,與具體的結果集無關。這也是為什么子查詢里是 "select 1 "的原因,當然也可以select任何東西。它將主查詢的結果集放到子查詢中做驗證,根據驗證結果是true或false來決定主查詢數據結果是否得以保存。
EXISTS查詢的工作原理是什么?它將外部查詢結果集放到子查詢中做驗證,根據驗證結果是true或false來決定外部查詢數據是否保留。
NOT EXISTS 的作用與 EXISTS 正相反。如果子查詢沒有返回行,則滿足 NOT EXISTS 中的 WHERE 子句。