前言:linux
1,in 和 existssql
2,not in 和 not exists數據庫
3,in 和 =網站
正文:spa
1,in 和 existscode
in是把外表和內表做hash(字典集合)鏈接htm
exists是對外表做循環,每次循環再對內表進行查詢blog
查詢效率:索引
一直以來認爲exists比in效率高的說法是不許確的,若是查詢的兩個表大小至關,那麼用in和exists差異不大;get
若是兩個表中一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in
-- 表A(小表),表B(大表) -- 效率低,用到了A表上ID列的索引 select * from A where A.ID in(select B.ID from B); -- 效率高,用到了B表上ID列的索引 select * from A where exists(select B.ID from B where B.ID = A.ID) -- 效率高,用到了B表上ID列的索引 select * from B where B.ID in(select A.ID from A) -- 效率低,用到了A表上id列的索引 select * from B where exists(select A.ID from A where A.ID = B.ID)
2,not in 和 not exists
not in,若是子查詢中返回的任意一條記錄含有空值,則查詢將不返回任何記錄。若是子查詢字段有非空限制,則能夠使用。
查詢效率:
not in會對內外表都進行全表掃描,沒有用到索引;而not exists的子查詢依然能用到表上的索引。
因此不管哪一個表大,用not exists都比not in 要快。
3,in 和 =
-- 如下兩條sql是等價的 select name from employee where name in('張三','李四','王五'); select name from employee where name='張三' or name='李四' or name='王五';
參考博客:
SQL查詢中in、exists、not in、not exists的用法與區別_數據庫技術_Linux公社-Linux系統門戶網站
https://www.linuxidc.com/Linux/2016-04/130285.htm