EXISTS用於檢查子查詢是否至少會返回一行數據,該子查詢實際上並不返回任何數據,而是返回值True或False
EXISTS 指定一個子查詢,檢測 行 的存在。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
這兩個查詢返回相同結果,也就是TableIn表的name 需要在 TableEx表的name存在。如果exists子查詢是有結果集,就返回true,否則返回false;
exists的運行方式:先運行主查詢一次 再去子查詢里查詢是否有對應記錄,如果有,返回ture,反之返回false,再根據主查詢中的每一行去子查詢里去查詢.
IN的運行方式:in的子查詢要返回結果集。子查詢先產生結果集,然后主查詢再去結果集里去找符合要求的字段列表去.
EXISTS與IN的使用效率比較,通常情況下采用exists要比in效率高,因為IN不走索引,但要看實際情況具體使用:IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。
NOT IN 和 NOT EXISTS的道理是一樣的,NOT EXISTS的效率依然高於NOT IN
文章借鑒於:https://www.cnblogs.com/qlqwjy/p/8598091.html