1. 程式人生 > >exists和in異同

exists和in異同

先看例子:

select *
  from role r
    where roleId in(select roleId from user)
select *
  from role r
     where roleId exists(select roleId from user where userId=r.roleId)

這裡用in或者exists,最後結果是一樣的,都是列出user表中存在roleId的所有role資訊.但是如果exists是空,他注重的是資料是否存在,那麼只要子查詢查詢出的欄位中有roleId,那麼就是可以的.

如果說exists和in用哪個?那麼就要說原理了,in執行時,先把外層掛起,執行子表,子表執行完成後在執行外層表.exists是每次執行的時候執行子表.
那麼,如果子表大的話,每次迴圈在執行,就選擇exitsts,子表小的話,用in.

這裡的著重號加不上,但是是重點!

如果是not in,和ont exists,not in的索引會開啟全表查,那麼exists的索引任然存在,所以是not exists的效率高!