1. 程式人生 > >查詢: exists、in、not in 和 not exists

查詢: exists、in、not in 和 not exists

現在兩個表`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好。