oracle中的exists和notexists用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle中的exists和notexists⽤法
测试⽤表A_⽤户表(test_table_A):
测试⽤表B_存储物品表(test_table_B):
1.exists操作
select *
from test_table_A A
where exists(
select 1
from test_table_B
where owner = A.A_id);
1执⾏结果:
分步看其执⾏原理为:
1> 从表A中第⼀条数据1001 tom开始,进⼊exsits函数,获取表B中第⼀条数据2001 1002 cup,判断(B.owner = A.A_id)是否为true,此处为false,因此获取表B中第⼆条数据2002 1001 car,判断(B.owner = A.id)是否为true,此处为true,则显⽰表A中第⼀条数据,不继续与表B中第三条数据做判断。
2> 从表A中第⼆条数据1002 jack开始,进⼊exsits函数,获取表B中第⼀条数据2001 1002 cup,判断(B.owner = A.A_id)是否为true,此处为ture,则显⽰A中第⼆条数据,不继续与表B中后续数据做判断。
3> 从表A中第三条数据1003 jenny开始,进⼊exsits函数,获取表B中第⼀条数据2001 1002 cup,判断(B.owner = A.A_id)为false,获取表中第⼆条数据2002 1001 car,判断(B.owner = A.id)为false,获取表B中第三条数据2003 1002 computer,判断(B.owner = A.id)为false,⾄此已与表B中所有数据判断完毕,均为false,因此最终结果不显⽰该语句。
2.not exists
select *
from test_table_A A
where not exists(
select 1
from test_table_B
where owner = A.A_id);
执⾏结果:
not exists操作即为反过来,当遇到true则不显⽰,全为false则显⽰。
3.exists与in的效率问题
使⽤EXISTS,会⾸先检查主查询,然后运⾏⼦查询,当⼦查询找到第⼀个匹配项时即开始下⼀次操作。
使⽤IN,会先执⾏⼦查询,并将获得的结果列表存放在⼀个加了索引的临时表中,再执⾏主查询与临时表运算。
结论:
1> select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
2> select * from T1 where T1.a in (select T2.a from T2) ;
当T1数据量⼩⽽T2数据量⾮常⼤时(T1 << T2),即⼦查询更耗费时间时,exists的查询效率更⾼。
当T1数据量⾮常⼤⽽T2数据量⼩时(T1 >> T2),即主查询更耗费时间时,in 的查询效率⾼。