【Oracle】【22】in、exists、not in、not exists

前言: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

相關文章
相關標籤/搜索