exists用於檢查子查詢是否至少會返回一行資料,事實上該子查詢並不會返回任何資料,而是返回值true(存在資料)或false,也就是說exists指定乙個子查詢,檢測行的存在。
表t_a:
idname1a1
2a33a3
表t_b:
ida_id
name11
b122b2
32b3
示例中有倆張表,t_a
、t_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語句速度更快。也就是說exists適合於外表小而內錶大的情況;in適合於外表大而內錶小的情況。如果內錶小,採用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...