sql優化 Exists IN的取捨

2021-08-08 21:52:31 字數 1425 閱讀 7352

exists用於檢查子查詢是否至少會返回一行資料,事實上該子查詢並不會返回任何資料,而是返回值true(存在資料)或false,也就是說exists指定乙個子查詢,檢測行的存在。

表t_a:

idname1a1

2a33a3

表t_b:

ida_id

name11

b122b2

32b3

示例中有倆張表,t_at_b,t_a一對多t_b關係。

執行sql

select id,name from t_a a where

exists(

select * from t_b b where a.id = b.a_id

)

執行結果為:

idname1a1

2a2將exists語句可以理解為:

for aid in ( select id,name from t_a a)

loop

if ( exists ( select * from t_b b where b.a_id= a.id )

then

output the record!

endifend

loop

具體執行順序如下:

tep1 ==>

select id,name from t_a a where

exists (select * from t_b b where b.a_id=1)

exists有值返回為true,查詢結果為id =1 name=a1的行;

tep ==>

select id,name from t_a a where

exists (select * from t_b b where b.a_id=2)

exists有值返回為true,返回 id =2 name=a2的行;

tep ==>

select id,name from t_a a where

exists (select * from t_b b where b.a_id=3)

exists未查找到返為false,無值返回。

從分析語句可以看出,exists全程掃瞄外表(此處的t_a表).

至於in的用法與解析,與exists類似,只是in掃瞄的是內錶。

如果外表小,採用exists語句速度更快。

如果內錶小,採用in語句速度更快。

也就是說exists適合於外表小而內錶大的情況;in適合於外表大而內錶小的情況。

另外not exists比not in速度快(not in 倆張表都會掃瞄)。

sql優化 exists,in關鍵字

對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時 無論記錄行是的多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件就像乙個bo...

18 SQL優化 其他SQL的優化

定期分析表,檢查表,優化表 analyze local no write to binlog table table name table name1 本語句用於分析和儲存表的關鍵字分布,執行一次分析表,在分析期間使用乙個讀取鎖定。這對於myisam,bdb 和innodb 表有作用,對於 myis...

oracle 集操作和exists in的運用場景

1 集操作 定義 把多個sql的結果集,通過邏輯上的整合運算,拼在一起顯示。集操作預設下都是按第乙個查詢的第一列公升序排序,當然除了union all minus 取差集,可用於對兩個結果集進行測試 union 取並集,除重 union all 取並集,不剔重 intersect 取交集 注釋 un...