查詢: exists、in、not in 和 not exists
阿新 • • 發佈:2019-02-01
現在兩個表`user`和`user_role`表:
user:
user_role:
1. 現在需要用 exists 作用子查詢來查`user`表
mysql> select * from user t where exists (select * from user_role r where t.id = r.user_id);
2. 我們也可以用 in 來 查詢`user`表
mysql> select * from user t where t.id in (select r.user_id from user_role r);
什麼時候用 exists?什麼時候用 in ?
不管是1,還是2,都要查`user`表的全部,所以主要看`user_role`表,
對於1,exists子查詢,每次都需要根據`user`表的id去查詢`user_role`表;
對於2,in子查詢,mysql其實是在記憶體中匹配`user`表的id,匹配到的話則返回該條記錄,所以mysql會根據
select r.user_id from user_role r
查出`user_role`表的所有user_id,它只查出一次,然後就在記憶體中做匹配了,所以說,如果user_role表比較小的話,那麼使用 in 子查詢是快於 exists 子查詢的,如果user_role表資料比較大的話,還是使用exists較快的。
3. not in 和 not exists
如果子查詢中使用not in,那麼內外表都進行全表掃描,沒有用到索引;
而使用not exists時,查詢還是會使用到索引,not exists會比not in好。